diff --git a/.hemtt/project.toml b/.hemtt/project.toml
index 143d1ed..2c3dca4 100644
--- a/.hemtt/project.toml
+++ b/.hemtt/project.toml
@@ -36,6 +36,7 @@ url = "https://github.com/valmojr/armatak"
preset = "Hemtt"
[hemtt.launch.default]
+mission = "hearts_and_minds.kunduz_valley"
workshop = [
"450814997", # CBA_A3
"463939057", # ACE
@@ -43,8 +44,6 @@ workshop = [
"2522638637", # ACE Extended Arsenal
"333310405", # Enhanced Movement
"2034363662", # Enhanced Movement Rework
- "2941986336", # Hatchet Interaction Framework - Stable Version
- "1745501605", # Hatchet H-60 pack - Stable Version
"843577117", # RHSUSAF
"843425103", # RHSAFRF
"843632231", # RHSSAF
@@ -59,7 +58,6 @@ workshop = [
"3425368881", # M4A1_URGI
"2268351256", # Tier One Weapons
"2560276469", # Restrict Markers
- "3493557838" # Ballad of the Green Berets
]
parameters = [
diff --git a/README.md b/README.md
index 500b5f1..9db74df 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,10 @@
ARMATAK is a server side Arma 3 addons for streaming unit positions to TAK Clients in sessions on real locations maps. It can be runned both as a clientside mod or a serverside mod, when runned serverside, it will create a TCP Socket connection between Arma 3 and the TAK Server, sending the game session information into it. When used clientside, Arma 3 will host a websocket server that you can connect to your phone and mock the phone's location to the player's in game location.
+## Operation Wings of Liberty
+
+By default, this repo contains a forked H&M (6~12 men) themed as Ranger Recon Detachment to showcase the mod, it was developed and heavily tested on a OG TAK Server running in CloudRF TAK Server container, other TAK Server may be functional.
+
## Get in Touch
[Join the Discord Server for ARMATAK!](https://discord.gg/svK64PCycU)
diff --git a/hearts_and_minds.kunduz_valley/.editorconfig b/hearts_and_minds.kunduz_valley/.editorconfig
new file mode 100644
index 0000000..701e3ec
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/.editorconfig
@@ -0,0 +1,14 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
diff --git a/hearts_and_minds.kunduz_valley/core/def/mission.sqf b/hearts_and_minds.kunduz_valley/core/def/mission.sqf
new file mode 100644
index 0000000..b07397a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/def/mission.sqf
@@ -0,0 +1,738 @@
+
+btc_version = [
+ 1,
+ 25,
+ 1
+];
+diag_log format (["=BTC= HEARTS AND MINDS VERSION %1.%2.%3"] + btc_version);
+
+//Param
+//<< Time options >>
+btc_p_time = "btc_p_time" call BIS_fnc_getParamValue;
+btc_p_acctime = "btc_p_acctime" call BIS_fnc_getParamValue;
+btc_db_load = ("btc_p_load" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_auto_db = "btc_p_auto_db" call BIS_fnc_getParamValue isEqualTo 1;
+btc_p_db_autoRestartTime = "btc_p_db_autoRestartTime" call BIS_fnc_getParamValue;
+btc_p_db_autoRestartHour = [
+ "btc_p_db_autoRestartHour1" call BIS_fnc_getParamValue,
+ "btc_p_db_autoRestartHour2" call BIS_fnc_getParamValue
+];
+btc_p_db_autoRestartType = "btc_p_db_autoRestartType" call BIS_fnc_getParamValue;
+btc_p_slot_isShare = "btc_p_slot_isShare" call BIS_fnc_getParamValue isEqualTo 1;
+btc_p_change_time = ("btc_p_change_time" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_change_weather = ("btc_p_change_weather" call BIS_fnc_getParamValue) isEqualTo 1;
+
+//<< Respawn options >>
+btc_p_respawn_location = "btc_p_respawn_location" call BIS_fnc_getParamValue;
+btc_p_respawn_fromOutsideBase = "btc_p_respawn_fromOutsideBase" call BIS_fnc_getParamValue;
+btc_p_respawn_fromOutsideTimeout = "btc_p_respawn_fromOutsideTimeout" call BIS_fnc_getParamValue;
+btc_p_rallypointTimer = "btc_p_rallypointTimer" call BIS_fnc_getParamValue;
+btc_p_respawn_arsenal = ("btc_p_respawn_arsenal" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_respawn_ticketsAtStart = "btc_p_respawn_ticketsAtStart" call BIS_fnc_getParamValue;
+btc_p_respawn_ticketsLost = 1 - ("btc_p_respawn_ticketsLost" call BIS_fnc_getParamValue);
+btc_p_respawn_ticketsShare = ("btc_p_respawn_ticketsShare" call BIS_fnc_getParamValue) isEqualTo 0;
+btc_p_respawn_ticketsFromPrisoners = "btc_p_respawn_ticketsFromPrisoners" call BIS_fnc_getParamValue;
+btc_p_body_timeBeforeShowMarker = ("btc_p_body_timeBeforeShowMarker" call BIS_fnc_getParamValue) * 60;
+
+//<< Faction options >>
+private _p_en = "btc_p_en" call BIS_fnc_getParamValue;
+private _p_en_AA = ("btc_p_AA" call BIS_fnc_getParamValue) isEqualTo 1;
+private _p_en_tank = ("btc_p_tank" call BIS_fnc_getParamValue) isEqualTo 1;
+private _p_civ = "btc_p_civ" call BIS_fnc_getParamValue;
+private _p_civ_veh = "btc_p_civ_veh" call BIS_fnc_getParamValue;
+
+//<< IED options >>
+btc_p_ied = ("btc_p_ied" call BIS_fnc_getParamValue)/2;
+private _p_ied_spot = "btc_p_ied_spot" call BIS_fnc_getParamValue;
+btc_p_ied_placement = "btc_p_ied_placement" call BIS_fnc_getParamValue;
+btc_p_ied_drone = ("btc_p_ied_drone" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_ied_power = "btc_p_ied_power" call BIS_fnc_getParamValue;
+
+//<< Hideout/Cache options >>
+btc_hideout_n = "btc_p_hideout_n" call BIS_fnc_getParamValue;
+btc_info_cache_def = "btc_p_cache_info_def" call BIS_fnc_getParamValue;
+btc_info_cache_ratio = "btc_p_cache_info_ratio" call BIS_fnc_getParamValue;
+btc_info_intel_chance = "btc_p_info_chance" call BIS_fnc_getParamValue;
+btc_p_info_houseDensity = "btc_p_info_houseDensity" call BIS_fnc_getParamValue;
+
+//<< Skill options >>
+btc_p_set_skill = ("btc_p_set_skill" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_AI_skill = [
+ ("btc_p_set_skill_general" call BIS_fnc_getParamValue)/10,//general
+ ("btc_p_set_skill_aimingAccuracy" call BIS_fnc_getParamValue)/10,//aimingAccuracy
+ ("btc_p_set_skill_aimingShake" call BIS_fnc_getParamValue)/10,//aimingShake
+ ("btc_p_set_skill_aimingSpeed" call BIS_fnc_getParamValue)/10,//aimingSpeed
+ ("btc_p_set_skill_endurance" call BIS_fnc_getParamValue)/10,//endurance
+ ("btc_p_set_skill_spotDistance" call BIS_fnc_getParamValue)/10,//spotDistance
+ ("btc_p_set_skill_spotTime" call BIS_fnc_getParamValue)/10,//spotTime
+ ("btc_p_set_skill_courage" call BIS_fnc_getParamValue)/10,//courage
+ ("btc_p_set_skill_reloadSpeed" call BIS_fnc_getParamValue)/10,//reloadSpeed
+ ("btc_p_set_skill_commanding" call BIS_fnc_getParamValue)/10//commanding
+];
+
+//<< Spawn options >>
+btc_p_density_of_occupiedCity = ("btc_p_density_of_occupiedCity" call BIS_fnc_getParamValue)/100;
+btc_p_mil_group_ratio = ("btc_p_mil_group_ratio" call BIS_fnc_getParamValue)/100;
+btc_p_mil_wp_houseDensity = ("btc_p_wp_houseDensity" call BIS_fnc_getParamValue)/100;
+btc_p_mil_static_group_ratio = ("btc_p_mil_static_group_ratio" call BIS_fnc_getParamValue)/100;
+btc_p_civ_group_ratio = ("btc_p_civ_group_ratio" call BIS_fnc_getParamValue)/100;
+btc_p_animals_group_ratio = ("btc_p_animals_group_ratio" call BIS_fnc_getParamValue)/100;
+btc_p_veh_armed_ho = ("btc_p_veh_armed_ho" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_veh_armed_spawn_more = ("btc_p_veh_armed_spawn_more" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_patrol_max = "btc_p_patrol_max" call BIS_fnc_getParamValue;
+btc_p_civ_max_veh = "btc_p_civ_max_veh" call BIS_fnc_getParamValue;
+
+//<< Gameplay options >>
+btc_p_sea = ("btc_p_sea" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_chem_sides = ("btc_p_chem_sides" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_chem_cache_probability = ("btc_p_chem_cache_probability" call BIS_fnc_getParamValue)/100;
+btc_p_spect = ("btc_p_spect" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_side_mission_cycle = "btc_p_side_mission_cycle" call BIS_fnc_getParamValue;
+
+//<< Arsenal options >>
+btc_p_arsenal_Type = "btc_p_arsenal_Type" call BIS_fnc_getParamValue;
+btc_p_arsenal_Restrict = "btc_p_arsenal_Restrict" call BIS_fnc_getParamValue;
+btc_p_garage = ("btc_p_garage" call BIS_fnc_getParamValue) isEqualTo 1;
+btc_p_autoloadout = "btc_p_autoloadout" call BIS_fnc_getParamValue;
+
+//<< Other options >>
+btc_global_reputation = "btc_p_rep" call BIS_fnc_getParamValue;
+btc_p_rep_notify = "btc_p_rep_notify" call BIS_fnc_getParamValue;
+btc_city_radiusOffset = ("btc_p_city_radiusOffset" call BIS_fnc_getParamValue) * 100;
+btc_p_trigger = if (("btc_p_trigger" call BIS_fnc_getParamValue) isEqualTo 1) then {
+ "this && (false in (thisList apply {_x isKindOf 'Plane'})) && (false in (thisList apply {(_x isKindOf 'Helicopter') && (speed _x > 190)}))"
+} else {
+ "this"
+};
+private _p_city_free_trigger = "btc_p_city_free_trigger" call BIS_fnc_getParamValue;
+btc_p_flag = "btc_p_flag" call BIS_fnc_getParamValue;
+btc_p_debug = "btc_p_debug" call BIS_fnc_getParamValue;
+
+switch (btc_p_debug) do {
+ case 0 : {
+ btc_debug_log = false;
+ btc_debug = false;
+ };
+ case 1 : {
+ btc_debug_log = true;
+ btc_debug = true;
+ btc_debug_graph = false;
+ btc_debug_frames = 0;
+ };
+ case 2 : {
+ btc_debug_log = true;
+ btc_debug = false;
+ };
+};
+
+if (!isMultiplayer) then {
+ btc_debug_log = true;
+ btc_debug = true;
+ btc_debug_graph = false;
+ btc_debug_frames = 0;
+};
+
+private _cfgVehicles = configFile >> "CfgVehicles";
+private _allClassVehicles = ("true" configClasses _cfgVehicles) apply {configName _x};
+private _allClassSorted = _allClassVehicles select {getNumber (_cfgVehicles >> _x >> "scope") isEqualTo 2};
+
+if (isServer) then {
+ btc_final_phase = false;
+ btc_delay_time = 0;
+
+ //City
+ btc_city_blacklist = [];//NAME FROM CFG
+ btc_p_city_free_trigger_condition = if (_p_city_free_trigger isEqualTo 0) then {
+ "thisList isEqualTo []"
+ } else {
+ format ["[thisList, %1] call btc_city_fnc_trigger_free_condition", _p_city_free_trigger]
+ };
+
+ //Civ
+ btc_civ_veh_active = [];
+
+ //Database
+ btc_db_serverCommandPassword = "btc_password"; //Define the same password in server.cfg like this: serverCommandPassword = "btc_password";
+ btc_db_warningTimeAutoRestart = 5;
+
+ //Hideout
+ btc_hideout_cityID = []; // List of city ID visible in debug mode for custom hideout location
+ btc_hideouts = []; publicVariable "btc_hideouts";
+ btc_hideouts_radius = 800;
+ if (btc_hideout_n isEqualTo 99) then {
+ btc_hideout_n = round random 10;
+ };
+ btc_hideout_safezone = 4000;
+ btc_hideout_range = 3500;
+ btc_hideout_cap_time = 1800;
+ btc_hideout_minRange = btc_hideout_range;
+
+ //IED
+ btc_ied_suic_time = 900;
+ btc_ied_suic_spawned = - btc_ied_suic_time;
+ btc_ied_offset = [0, -0.03, -0.07] select _p_ied_spot;
+ btc_ied_list = [];
+ btc_ied_range = 10;
+ btc_ied_power = ["Bo_GBU12_LGB_MI10", "R_MRAAWS_HE_F"] select btc_p_ied_power;
+
+ //FOB
+ btc_fobs = [[], [], []];
+ btc_fob_rallypointTimer = 60 * btc_p_rallypointTimer;
+ btc_body_deadPlayers = [];
+
+ //Patrol
+ btc_patrol_active = [];
+ btc_patrol_area = 2500;
+
+ //Rep
+ btc_rep_militia_call_time = 600;
+ btc_rep_militia_called = - btc_rep_militia_call_time;
+ btc_rep_delayed = [0, []];
+
+ //Chem
+ btc_chem_decontaminate = [];
+ btc_chem_contaminated = []; publicVariable "btc_chem_contaminated"; //Preserve reference
+
+ //Spect
+ btc_spect_emp = []; publicVariable "btc_spect_emp"; //Preserve reference
+
+ //Cache
+ btc_cache_type = [
+ _allClassSorted select {
+ _x isKindOf "ReammoBox_F" &&
+ {getText(_cfgVehicles >> _x >> "model") isEqualTo "\A3\weapons_F\AmmoBoxes\AmmoBox_F"}
+ },
+ ["Land_PlasticCase_01_small_black_CBRN_F", "Land_PlasticCase_01_small_olive_CBRN_F", "Land_PlasticCase_01_small_CBRN_F"]
+ ];
+ private _weapons_usefull = "true" configClasses (configFile >> "CfgWeapons") select {
+ getNumber (_x >> 'type') isEqualTo 1 &&
+ {getArray (_x >> 'magazines') isNotEqualTo []} &&
+ {getNumber (_x >> 'scope') isEqualTo 2}
+ };
+ btc_cache_weapons_type = _weapons_usefull apply {(toLower getText (_x >> "model")) select [1]};
+
+ //Hideout classname
+ btc_type_campfire = ["MetalBarrel_burning_F"] + (_allClassSorted select {_x isKindOf "Land_Campfire_F"});
+ btc_type_Scrapyard = _allClassSorted select {
+ _x isKindOf "Scrapyard_base_F" &&
+ {!("scrap" in toLower _x)}
+ };
+ btc_type_bigbox = ["Box_FIA_Ammo_F", "Box_East_AmmoVeh_F", "CargoNet_01_box_F", "O_CargoNet_01_ammo_F"] + btc_type_Scrapyard;
+ btc_type_seat = ["Land_WoodenLog_F", "Land_CampingChair_V2_F", "Land_CampingChair_V1_folded_F", "Land_CampingChair_V1_F"];
+ btc_type_sleepingbag = _allClassSorted select {_x isKindOf "Land_Sleeping_bag_F"};
+ btc_type_sleepingbag_folded = _allClassSorted select {_x isKindOf "Land_Sleeping_bag_folded_F"};
+ btc_type_tent = ["Land_TentA_F", "Land_TentDome_F"] + (_allClassSorted select {
+ _x isKindOf "Land_TentSolar_01_base_F" &&
+ {!(_x isKindOf "Land_TentSolar_01_folded_base_F")}
+ });
+ btc_type_camonet = ["Land_IRMaskingCover_02_F"] + (_allClassSorted select {_x isKindOf "Shelter_base_F"});
+ btc_type_satelliteAntenna = _allClassSorted select {_x isKindOf "Land_SatelliteAntenna_01_F"};
+
+ //Side
+ btc_side_ID = 0;
+ btc_side_list = ["supply", "mines", "vehicle", "get_city", "tower", "civtreatment", "checkpoint", "convoy", "rescue", "capture_officer", "hostage", "hack", "kill", "EMP", "removeRubbish", "massacre"]; // On ground (Side "convoy" and "capture_officer" are not design for map with different islands. Start and end city can be on different islands.)
+ if (btc_p_sea) then {btc_side_list append ["civtreatment_boat", "underwater_generator"]}; // On sea
+ if (btc_p_chem_sides) then {btc_side_list append ["chemicalLeak", "pandemic"]};
+ btc_side_list_use = [];
+ btc_type_tower = ["Land_Communication_F", "Land_TTowerBig_1_F", "Land_TTowerBig_2_F"];
+ btc_type_barrel = ["Land_GarbageBarrel_01_F", "Land_BarrelSand_grey_F", "MetalBarrel_burning_F", "Land_BarrelWater_F", "Land_MetalBarrel_F", "Land_MetalBarrel_empty_F"];
+ btc_type_canister = ["Land_CanisterPlastic_F"];
+ btc_type_pallet = ["Land_Pallets_stack_F", "Land_Pallets_F", "Land_Pallet_F"];
+ btc_type_box = ["Box_East_Wps_F", "Box_East_WpsSpecial_F", "Box_East_Ammo_F"] + (btc_cache_type select 0);
+ btc_type_generator = _allClassSorted select {_x isKindOf "Land_Device_assembled_F"};
+ btc_type_storagebladder = _allClassSorted select {_x isKindOf "StorageBladder_base_F"};
+ btc_type_mines = ["APERSMine", "APERSBoundingMine", "APERSTripMine"];
+ btc_type_power = ["Land_PowerGenerator_F", "Land_PortableGenerator_01_F"] + (_allClassSorted select {_x isKindOf "Machine_base_F"});
+ btc_type_cord = ["Land_ExtensionCord_F"];
+ btc_type_cones = ["Land_RoadCone_01_F", "RoadCone_F", "RoadCone_L_F"];
+ btc_type_fences = ["Land_PlasticNetFence_01_long_F", "Land_PlasticNetFence_01_long_d_F", "RoadBarrier_F", "TapeSign_F"];
+ btc_type_barrier = ["Land_CncBarrier_stripes_F", "Land_CncBarrier_F"];
+ btc_type_portable_light = _allClassSorted select {_x isKindOf "Land_PortableLight_single_F"};
+ btc_type_portableLamp = _allClassSorted select {
+ _x isKindOf "Land_PortableLight_02_base_F" ||
+ {_x isKindOf "TentLamp_01_standing_base_F"}
+ };
+ btc_type_tentLamp = _allClassSorted select {_x isKindOf "TentLamp_01_base_F"};
+ btc_type_first_aid_kits = ["Land_FirstAidKit_01_open_F", "Land_FirstAidKit_01_closed_F"];
+ btc_type_body_bags = _allClassSorted select {
+ _x isKindOf "Land_Bodybag_01_base_F" ||
+ {_x isKindOf "Land_Bodybag_01_empty_base_F"} ||
+ {_x isKindOf "Land_Bodybag_01_folded_base_F"}
+ };
+ btc_type_signs = _allClassSorted select {_x isKindOf "Land_Sign_Mines_F"};
+ btc_type_bloods = _allClassSorted select {_x isKindOf "Blood_01_Base_F"};
+ btc_type_medicals = _allClassSorted select {_x isKindOf "MedicalGarbage_01_Base_F"};
+ btc_type_table = _allClassSorted select {_x isKindOf "Land_CampingTable_F"};
+ btc_type_garbage = ["Land_Garbage_line_F","Land_Garbage_square3_F","Land_Garbage_square5_F"];
+ btc_type_foodSack = _allClassSorted select {_x isKindOf "Land_FoodSack_01_empty_base_F"};
+ btc_type_PaperBox = _allClassSorted select {
+ _x isKindOf "Land_PaperBox_01_small_ransacked_base_F" ||
+ {_x isKindOf "Land_PaperBox_01_small_open_base_F"} ||
+ {_x isKindOf "Land_PaperBox_01_small_destroyed_base_F"}
+ };
+ btc_type_EmergencyBlanket = _allClassSorted select {_x isKindOf "Land_EmergencyBlanket_01_base_F"};
+ btc_type_Sponsor = _allClassSorted select {
+ _x isKindOf "SignAd_Sponsor_F" &&
+ {"idap" in toLower _x}
+ };
+ btc_type_PlasticCase = _allClassSorted select {_x isKindOf "PlasticCase_01_base_F"};
+ btc_type_MedicalTent = _allClassSorted select {_x isKindOf "Land_MedicalTent_01_base_F"};
+ btc_type_cargo_ruins = _allClassSorted select {
+ _x isKindOf "Ruins_F" &&
+ {
+ "cargo40" in toLower _x ||
+ "cargo20" in toLower _x
+ }
+ };
+ btc_type_spill = ["Oil_Spill_F", "Land_DirtPatch_01_6x8_F"] + (_allClassSorted select {
+ _x isKindOf "Land_DirtPatch_02_base_F" ||
+ {_x isKindOf "WaterSpill_01_Base_F"}
+ });
+ btc_type_tarp = _allClassSorted select {_x isKindOf "Tarp_01_base_F"};
+ btc_type_SCBA = _allClassSorted select {_x isKindOf "SCBACylinder_01_base_F"};
+ btc_type_brush = _allClassSorted select {_x isKindOf "Brush_01_base_F"};
+ btc_type_broom = _allClassSorted select {_x isKindOf "Broom_01_base_F"};
+ btc_type_sponge = _allClassSorted select {_x isKindOf "Sponge_01_base_F"};
+ btc_type_connectorTentClosed = _allClassSorted select {_x isKindOf "Land_ConnectorTent_01_closed_base_F"};
+ btc_type_crossTent = _allClassSorted select {_x isKindOf "Land_ConnectorTent_01_cross_base_F"};
+ btc_type_connectorTent = (_allClassSorted select {_x isKindOf "Land_ConnectorTent_01_base_F"}) - btc_type_connectorTentClosed - btc_type_crossTent;
+ btc_type_cargoEMP = _allClassSorted select {_x isKindOf "Cargo_EMP_base_F"};
+ btc_type_antenna = _allClassSorted select {_x isKindOf "OmniDirectionalAntenna_01_base_F"};
+ btc_type_solarPanel = _allClassSorted select {_x isKindOf "Land_SolarPanel_04_base_F"};
+ btc_type_sports = (_allClassSorted select {_x isKindOf "SportItems_base_F"}) select {"ball" in _x};
+ btc_type_bottles = (_allClassSorted select {_x isKindOf "Items_base_F"}) select {"Bottle" in _x and (not ("stack" in _x))};
+
+ // The two arrays below are prefixes of buildings and their multiplier.
+ // They will multiply the values of btc_rep_malus_building_destroyed and btc_rep_malus_building_damaged,
+ // if a building is not present here it will be multiplied by 1.0.
+ // Use 0.0 to disable reputation hit on a specific's building destruction.
+ // You can modify this for any other terrain, clearing the table will also make all buildings just have a 1.0 multiplier.
+ // If there's a hit in btc_buildings_multiplier, btc_buildings_categories_multipliers will NOT be run
+ btc_buildings_multipliers = [
+ // Specific buildings that need to have a custom modifier.
+ ["Land_BellTower", 0.2 ], ["Land_WIP", 1.5], ["Land_u_Addon_01", 0.2],
+ ["Land_Airport_Tower", 10.0], ["Land_Mil_ControlTower", 10.0],
+ ["Land_TentHangar", 7.0], ["Land_i_Shed_Ind", 1.5], ["Land_u_Shed_Ind", 1.5],
+ ["Land_TTowerBig", 6.0], ["Land_TTowerSmall", 4.5], ["Land_cmp_Tower", 4.0]
+ ];
+
+ // The multipliers are applied on top of each other, so "Chapel" and "Small" will both multiply the malus value
+ btc_buildings_categories_multipliers = [
+ ["Shed", 0.75], ["Slum", 0.8], ["Small", 0.8], ["Big", 1.5], ["Villa", 2.0], ["Main", 3.0], ["Tower", 2.0],
+ ["HouseBlock", 2.0], ["Panelak", 2.0], ["Tenement", 7.0],
+ ["Barn", 1.5], ["School", 3.0], ["Office", 2.0], ["Shop", 1.5], ["Store", 1.5], ["Hospital", 12.0],
+ ["Castle", 2.5], ["Chapel", 3.0], ["Minaret", 3.0], ["Mosque", 4.0], ["Church", 4.0], ["Kostel", 4.0],
+ ["Lighthouse", 4.0],
+ ["Airport", 4.0], ["Hangar", 1.75], ["ControlTower", 2.25], ["Terminal", 3.0],
+ ["Hopper", 2.0], ["Tank", 4.0], ["Factory", 2.0], ["Transformer", 1.1],
+ ["FuelStation", 5.0],
+ ["Barracks", 1.75],
+ ["spp", 3.0], ["Powerstation", 3.0],
+ ["Pump", 2.5]
+ ];
+ btc_buildings_changed = [];
+
+ //TAGS
+ btc_type_tags = ["Land_Graffiti_01_F", "Land_Graffiti_02_F", "Land_Graffiti_03_F", "Land_Graffiti_04_F", "Land_Graffiti_05_F"];
+ btc_type_tags_sentences = [
+ "STR_BTC_HAM_TAG_GO",
+ "STR_BTC_HAM_TAG_LN",
+ "STR_BTC_HAM_TAG_WWKY",
+ "STR_BTC_HAM_TAG_BA",
+ "STR_BTC_HAM_TAG_GH",
+ "STR_BTC_HAM_TAG_IE",
+ "STR_BTC_HAM_TAG_DWY",
+ "STR_BTC_HAM_TAG_WHY",
+ "STR_BTC_HAM_TAG_YGD"
+ ];
+ btc_tags_player = [];
+ btc_tags_server = [];
+
+ //Flowers
+ btc_type_flowers = _allClassSorted select {_x isKindOf "FlowerBouquet_base_F"};
+
+ //IED
+ private _ieds = ["Land_GarbageContainer_closed_F", "Land_GarbageContainer_open_F", "Land_Portable_generator_F", "Land_WoodenBox_F", "Land_BarrelTrash_grey_F", "Land_Sacks_heap_F", "Land_Wreck_Skodovka_F", "Land_WheelieBin_01_F", "Land_GarbageBin_03_F"] + btc_type_pallet + btc_type_barrel + (_allClassSorted select {
+ _x isKindOf "GasTank_base_F" ||
+ {_x isKindOf "Garbage_base_F"} ||
+ {_x isKindOf "Stall_base_F"} ||
+ {_x isKindOf "Market_base_F"} ||
+ (_x isKindOf "Constructions_base_F" &&
+ {
+ "bricks" in toLower _x
+ }) ||
+ (_x isKindOf "Wreck_base_F" &&
+ {
+ "car" in toLower _x ||
+ "offroad" in toLower _x
+ })
+ });
+ btc_type_ieds = _ieds - ["Land_Garbage_line_F","Land_Garbage_square3_F","Land_Garbage_square5_F", "Land_MarketShelter_F", "Land_ClothShelter_01_F", "Land_ClothShelter_02_F"];
+ btc_model_ieds = btc_type_ieds apply {(toLower getText(_cfgVehicles >> _x >> "model")) select [1]};
+ btc_type_blacklist = btc_type_tags + btc_type_flowers + ["UserTexture1m_F"]; publicVariable "btc_type_blacklist";
+
+ btc_groundWeaponHolder = [];
+
+ //Respawn
+ btc_respawn_tickets = createHashMap;
+
+ btc_slots_serialized = createHashMap;
+
+ //Delay
+ btc_delay_agent = 0.1;
+ btc_delay_unit = 0.2;
+ btc_delay_vehicle = 0.3;
+ btc_delay_exec = 0.1;
+
+ //Explosives
+ btc_explosives = [];
+ btc_explosives_objectSide = createVehicle ["CBA_NamespaceDummy", [-1000, -1000, 0], [], 0, "NONE"];
+};
+
+//Civ
+// Get all faction from mod there are currently running
+//copyToClipboard str (["CIV"] call btc_fnc_get_class);
+private _allfaction = ["AEGIS_CIV_LIV_F","AEGIS_CIV_GEN_F","AEGIS_CIV_MA_F","CIV_F","DEFAULT","CFP_C_AFG","CFP_C_AFRCHRISTIAN","CFP_C_AFRISLAMIC","CFP_C_ASIA","CFP_C_CHERNO_WIN","CFP_C_MALDEN","CFP_C_ME","CSLA_CIV","CUP_C_CHERNARUS","CUP_C_SAHRANI","CUP_C_TK","CUP_C_RU","CWR3_FACTION_CIV","AEGIS_CIV_HI_F","GM_FC_GC_CIV","GM_FC_GE_CIV","LIB_CIV","OPTRE_UEG_CIV","CIV_IDAP_F","RDS_POL_CIV","RDS_RUS_CIV","SPE_CIV","UK3CB_ADC_C","UK3CB_CHC_C","UK3CB_MEC_C","UK3CB_TKC_C","UNSUNG_C","C_VIET","AEGIS_CIV_ARG_F"]; //All factions
+_p_civ = _allfaction select _p_civ; //Select faction selected from mission parameter
+_p_civ_veh = _allfaction select _p_civ_veh; //Select faction selected from mission parameter
+private _allclasse = [[_p_civ]] call btc_civ_fnc_class; //Create classes from factions, you can combine factions from the SAME side : [[_p_civ, "btc_ac","LOP_TAK_CIV"]] call btc_civ_fnc_class.
+
+//Save class name to global variable
+btc_civ_type_units = _allclasse select 0;
+_allclasse = [[_p_civ_veh]] call btc_civ_fnc_class;
+btc_civ_type_veh = _allclasse select 2;
+btc_civ_type_boats = _allclasse select 1;
+
+btc_w_civs = [
+ ["srifle_DMR_06_hunter_F", "sgun_HunterShotgun_01_F", "srifle_DMR_06_hunter_khs_F", "sgun_HunterShotgun_01_Sawedoff_F", "Hgun_PDW2000_F", "arifle_AKM_F", "arifle_AKS_F"],
+ ["hgun_Pistol_heavy_02_F", "hgun_Rook40_F", "hgun_Pistol_01_F"]
+];
+btc_g_civs = ["HandGrenade", "MiniGrenade", "ACE_M84", "ACE_M84"];
+
+// ANIMALS
+btc_animals_type = ["Hen_random_F", "Cock_random_F", "Fin_random_F", "Alsatian_Random_F", "Goat_random_F", "Sheep_random_F"];
+
+//FOB
+btc_fob_mat = "Land_Cargo20_blue_F";
+btc_fob_structure = "Land_Cargo_HQ_V1_F";
+btc_fob_flag = "Flag_NATO_F";
+btc_fob_id = 0;
+btc_fob_minDistance = 1500;
+btc_fob_timeout = 1 * 60;
+
+//IED
+btc_type_ieds_ace = ["IEDLandBig_F", "IEDLandSmall_F"];
+btc_ied_deleteOn = -1;
+
+//Int
+btc_int_ordersRadius = 25;
+btc_int_search_intel_time = 4;
+btc_int_sirenRadius = 35;
+btc_int_beaconRadius = 15;
+btc_int_hornRadius = 20;
+btc_int_hornDelay = time;
+
+//Info
+btc_info_intel_type = [80, 95];//cache - hd - both
+btc_info_hideout_radius = 4000;
+btc_info_intels = ["Land_Camera_01_F", "Land_HandyCam_F", "Land_File1_F", "Land_FilePhotos_F", "Land_File2_F", "Land_File_research_F", "Land_MobilePhone_old_F", "Land_PortableLongRangeRadio_F", "Land_Laptop_02_unfolded_F"];
+private _mapsIntel = switch (worldName) do {
+ case "Altis": {["Land_Map_altis_F", "Land_Map_unfolded_Altis_F"]};
+ case "Stratis": {["Land_Map_stratis_F", "Land_Map_unfolded_F"]};
+ case "Tanoa": {["Land_Map_Tanoa_F", "Land_Map_unfolded_Tanoa_F"]};
+ case "Malden": {["Land_Map_Malden_F", "Land_Map_unfolded_Malden_F"]};
+ case "Enoch": {["Land_Map_Enoch_F", "Land_Map_unfolded_Enoch_F"]};
+ default {["Land_Map_blank_F"]};
+};
+btc_info_intels append _mapsIntel;
+
+//Supplies
+btc_supplies_cargo = "Land_Cargo20_IDAP_F";
+btc_supplies_mat = [
+ _allClassSorted select {_x isKindOf "Land_FoodSack_01_cargo_base_F"},
+ _allClassSorted select {_x isKindOf "Land_WaterBottle_01_stack_F"}
+];
+
+//Hazmat
+btc_type_hazmat = ["HazmatBag_01_F", "Land_MetalBarrel_F"] + (_allClassSorted select {
+ _x isKindOf "Land_GarbageBarrel_02_base_F" ||
+ {_x isKindOf "Land_FoodContainer_01_F"} ||
+ {_x isKindOf "Land_CanisterFuel_F"} ||
+ {_x isKindOf "CBRNContainer_01_base_F"} ||
+ {_x isKindOf "PlasticCase_01_base_F"}
+});
+
+//Containers
+btc_containers_mat = ["Land_Cargo20_military_green_F", "Land_Cargo40_military_green_F"];
+
+//Player
+btc_player_side = west;
+btc_respawn_marker = "respawn_west";
+btc_player_type = ["SoldierWB", "SoldierEB", "SoldierGB"] select ([west, east, independent] find btc_player_side);
+
+//Log
+btc_construction_array =
+[
+ [
+ "Fortifications",
+ "Static",
+ "Ammobox",
+ "Containers",
+ "Supplies",
+ "FOB",
+ "Decontamination",
+ "Vehicle Logistic"
+ ],
+ [
+ [
+ //"Fortifications"
+ "Land_BagBunker_Small_F",
+ "Land_BagFence_Corner_F",
+ "Land_BagFence_End_F",
+ "Land_BagFence_Long_F",
+ "Land_BagFence_Round_F",
+ "Land_BagFence_Short_F",
+ "Land_HBarrier_1_F",
+ "Land_HBarrier_3_F",
+ "Land_HBarrier_5_F",
+ "Land_HBarrierBig_F",
+ "Land_Razorwire_F",
+ "Land_CncBarrier_F",
+ "Land_CncBarrierMedium_F",
+ "Land_CncBarrierMedium4_F",
+ "Land_CncWall1_F",
+ "Land_CncWall4_F",
+ "Land_Mil_ConcreteWall_F",
+ "Land_Mil_WallBig_4m_F",
+ "Land_Mil_WallBig_Corner_F",
+ "Land_PortableLight_double_F",
+ "Land_Pod_Heli_Transport_04_medevac_black_F"
+ ],
+ [
+ //"Static"
+ ] + (_allClassSorted select {(
+ _x isKindOf "GMG_TriPod" ||
+ {_x isKindOf "StaticMortar"} ||
+ {_x isKindOf "HMG_01_base_F"} ||
+ {_x isKindOf "AA_01_base_F"} ||
+ {_x isKindOf "AT_01_base_F"}) && {
+ getNumber (_cfgVehicles >> _x >> "side") isEqualTo ([east, west, independent, civilian] find btc_player_side)
+ }
+ }),
+ [
+ //"Ammobox"
+ "Land_WoodenBox_F"
+
+ ] + (_allClassSorted select {
+ _x isKindOf "ReammoBox_F" &&
+ {!(_x isKindOf "Slingload_01_Base_F")} &&
+ {!(_x isKindOf "Pod_Heli_Transport_04_base_F")}
+ }),
+ [
+ //"Containers"
+
+ ] + btc_containers_mat,
+ [
+ //"Supplies"
+ btc_supplies_cargo
+ ],
+ [
+ //"FOB"
+ btc_fob_mat
+ ],
+ [
+ //"Decontamination"
+ "DeconShower_01_F"
+ ],
+ [
+ //"Vehicle logistic"
+ "ACE_Wheel",
+ "ACE_Track",
+ "B_Slingload_01_Ammo_F",
+ "B_Slingload_01_Fuel_F"
+ ] + (_allClassSorted select {_x isKindOf "FlexibleTank_base_F"})
+ ]
+];
+
+(btc_construction_array select 1) params [
+ "_cFortifications", "_cStatics", "_cAmmobox",
+ "_cContainers", "_cSupplies", "_cFOB",
+ "_cDecontamination", "_cVehicle_logistic"
+];
+btc_log_def_loadable = flatten (btc_construction_array select 1) + flatten btc_supplies_mat + btc_type_hazmat;
+btc_log_def_can_load = _cContainers;
+btc_log_def_placeable = (_cFortifications + _cContainers + _cSupplies + _cFOB + _cDecontamination + _cVehicle_logistic + flatten btc_supplies_mat + btc_type_hazmat) select {
+ getNumber(_cfgVehicles >> _x >> "ace_dragging_canCarry") isEqualTo 0
+};
+btc_tow_vehicleTowing = objNull;
+btc_log_placing_max_h = 12;
+btc_log_placing = false;
+btc_log_obj_created = [];
+
+btc_log_fnc_get_nottowable = {
+ params ["_tower"];
+
+ switch (true) do {
+ case (_tower isKindOf "Tank") : {
+ ["Plane", "Helicopter"]; //The tower is a tank so it can't tow: plane and helicopter
+ };
+ case (_tower isKindOf "Truck_F") : {
+ ["Plane", "Helicopter"];
+ };
+ case (_tower isKindOf "Truck") : {
+ ["Plane", "Helicopter"];
+ };
+ case (_tower isKindOf "Ship") : {
+ [];
+ };
+ case (_tower isKindOf "Car") : {
+ ["Truck", "Truck_F", "Tank", "Plane", "Helicopter"]; //The tower is a car so it can't tow: truck, tank, plane and helicopter
+ };
+ default {
+ ["Car", "Truck", "Truck_F", "Tank", "Plane", "Helicopter", "Ship"];
+ };
+ };
+};
+
+//Lift
+btc_lift_fnc_getLiftable = {
+ params ["_chopper"];
+
+ private _array = [];
+ switch (typeOf _chopper) do {
+ case "B_SDV_01_F" : {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "StaticWeapon", "Car", "Truck", "Wheeled_APC_F", "Tracked_APC", "APC_Tracked_01_base_F", "APC_Tracked_02_base_F", "Air", "Ship", "Tank"] + ((btc_construction_array select 1) select 3) + ((btc_construction_array select 1) select 4) + ((btc_construction_array select 1) select 5);
+ };
+ default {
+ private _MaxCargoMass = getNumber (configOf _chopper >> "slingLoadMaxCargoMass");
+ switch (true) do {
+ case (_MaxCargoMass <= 510) : {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "Quadbike_01_base_F", "Strategic"];
+ };
+ case (_MaxCargoMass <= 2100) : {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "StaticWeapon", "Car"];
+ };
+ case (_MaxCargoMass <= 4100) : {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "StaticWeapon", "Car", "Truck_F", "Truck", "Wheeled_APC_F", "Air", "Ship"] + ((btc_construction_array select 1) select 3) + ((btc_construction_array select 1) select 4) + ((btc_construction_array select 1) select 5);
+ };
+ case (_MaxCargoMass <= 14000) : {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "StaticWeapon", "Car", "Truck_F", "Truck", "Wheeled_APC_F", "Tracked_APC", "APC_Tracked_01_base_F", "APC_Tracked_02_base_F", "Air", "Ship", "Tank"] + ((btc_construction_array select 1) select 3) + ((btc_construction_array select 1) select 4) + ((btc_construction_array select 1) select 5);
+ };
+ default {
+ _array = ["Motorcycle", "ReammoBox", "ReammoBox_F", "StaticWeapon", "Car", "Truck_F", "Truck", "Wheeled_APC_F", "Tracked_APC", "APC_Tracked_01_base_F", "APC_Tracked_02_base_F", "Air", "Ship", "Tank"] + ((btc_construction_array select 1) select 3) + ((btc_construction_array select 1) select 4) + ((btc_construction_array select 1) select 5);
+ };
+ };
+ };
+ };
+ _array
+};
+
+btc_ropes_deployed = false;
+btc_lift_min_h = 7;
+btc_lift_max_h = 12;
+btc_lift_radius = 3;
+btc_lift_HUD_x = 0.874;
+btc_lift_HUD_y = 0.848;
+
+//Mil
+btc_hq = objNull;
+// Get all faction from mod there are currently running
+//copyToClipboard str (["EN"] call btc_fnc_get_class);
+private _allfaction = ["AWAKENED","AFR_ARMY","AOA_CIV_OPERATIONS","ARA_ARMY","ARL_ARMY","BLU_F","BLU_EAF_ARD_F","BLU_EAF_F","IND_F","BLU_CTRG_F","OPF_G_F","IND_G_F","BLU_G_F","IND_C_F","IND_E_F","IND_L_F","CEC_ARMY","CFP_B_CAF","CFP_O_IQARMY","CFP_B_ILIDF","CFP_B_NAARMY","CFP_O_SDMILITIA","CFP_O_ABUSAYYAF","CFP_B_AFGPOLICE","CFP_O_ALQAEDA","CFP_I_ALNUSRA","CFP_O_ALSHABAAB","CFP_O_BOKOHARAM","CFP_O_CFREBELS","CFP_O_HAMAS","CFP_O_HEZBOLLAH","CFP_B_IQARMY","CFP_B_IQPOLICE","CFP_O_IRARMY","CFP_O_IS","CFP_I_IS","CFP_B_KEARMY","CFP_B_MLARMY","CFP_B_PESH","CFP_O_SOREBEL","CFP_I_SSARMY","CFP_O_SSREBELS","CFP_I_SDREBELS","CFP_I_SDREBELSRF","CFP_O_SDARMY","CFP_O_SYARMY","CFP_O_TBAN","CFP_I_TUAREG","CFP_B_UGARMY","CFP_B_USRANGERS_WDL","CFP_B_USSEALS_DES","CFP_B_USSEALS_WDL","CFP_B_YPG","CFP_O_ANSARALLAH","CFP_B_CZARMY_WDL","CFP_I_WESTULTRA","COL_FAC","COL","COL_RHS_FACTION_EJC","COL_FFAA_FUERZAS_MILITARES_DE_COLOMBIA","CSLA_DES","AFMC","CSLA","FIA","US85","CUP_B_AFU","CUP_B_CZ","CUP_B_GB","CUP_B_CDF","CUP_O_CHDKZ","CUP_STATIC_SHIPS","CUP_I_NAPA","CUP_I_RACS","CUP_B_RNZN","CUP_O_RU","CUP_O_SLA","CUP_O_TK","CUP_O_TK_MILITIA","CUP_I_UN","CUP_B_US_ARMY","CUP_B_USMC","CUP_B_GER","CUP_B_HIL","CUP_I_PMC_ION","CUP_O_RUS_M","CFP_B_GBARMY_WDL","CFP_B_DEARMY_WDL","CUP_I_TK_GUE","CFP_B_USMC_DES","CFP_B_CDF_SNW","CFP_O_WAGNER","CFP_I_WAGNER","CFP_O_WAGNER_WIN","CFP_I_WAGNER_WIN","CFP_O_WAGNER_WDL","CFP_I_WAGNER_WDL","CFP_B_USARMY_1991_DES","CFP_B_USARMY_1991_WDL","CFP_B_USARMY_2003_DES","CFP_B_USARMY_2003_WDL","CFP_O_RUMVD","CFP_B_USCIA","CFP_B_USARMY_WDL","CFP_B_AFARMY","CFP_O_CHDKZ_SNW","CFP_O_RUARMY_DES","CWR3_FACTION_FIA","CWR3_FACTION_REBELS_EAST","CWR3_FACTION_REBELS_WEST","CWR3_FACTION_RUS","CWR3_FACTION_USA","CWR3_FACTION_USA_DES","O_FARCS","OPF_R_F","BLU_A_TNA_F","BLU_A_WDL_F","OPF_R_ARD_F","BLU_GEN_F","OPF_V_F","BLU_CTRG_TNA_F","OPF_V_TNA_F","CFP_O_NKARMY","OPF_CD_F","FAP_ARMY","FIA_DES","FOW_HEER","FOW_IJA_NAS","FOW_UK_FAA","FOW_USA_NAVY","FOW_WAFFENSS","FOW_AUS","FOW_LUFTWAFFE","FOW_HI","FOW_UK","FOW_USA_P","FOW_IJA","FOW_USA","FOW_USMC","GAL_ARMY","GANGBLUE_ARMY","GANGRED_ARMY","GM_FC_DK","GM_FC_GC_BGS","GM_FC_GC","GM_FC_PL","GM_FC_XX","GM_FC_GE_BGS","GM_FC_GE","O_TALIBAN","IBR_ZETABORN_FACTION","IBR_ROBOTFAC","IND_RAVEN_F","IND_E_ARD_F","LIB_RKKA_W","LIB_WEHRMACHT_W","LIB_ARR","LIB_MKHL","LIB_RBAF","LIB_ACI","LIB_GUER","LIB_RAAF","LIB_RKKA","LIB_WEHRMACHT","LIB_US_101AB","LIB_US_82AB","LIB_UK_AB_W","LIB_UK_ARMY_W","LIB_US_ARMY_W","LIB_FSJ","LIB_UK_AB","LIB_UK_ARMY","LIB_UK_DR","LIB_US_ARMY","LIB_DAK","LIB_NKVD","LIB_US_RANGERS","LIB_NAC","LIB_FFI","BLU_UN_LXWS","BLU_W_F","MOL_ARMY","OPF_A_F","OPF_F","OPF_T_F","OPF_RAVEN_F","OPTRE_DME","OPTRE_INS","OPTRE_CAA","OPTRE_PD","OPTRE_UNSC","OPTRE_FC_COVENANT","I_COGUEEL_WLD","I_COGUEF_WDL","I_COPARA_WDL","O_COGUEPL_WDL","BLU_A_F","BLU_T_F","RHS_FACTION_VMF","RHS_FACTION_MSV","RHS_FACTION_RVA","RHS_FACTION_TV","RHS_FACTION_VDV","RHS_FACTION_VPVO","RHS_FACTION_VV","RHS_FACTION_VVS_C","RHS_FACTION_VVS","RHSSAF_FACTION_ARMY","RHSSAF_FACTION_ARMY_OPFOR","RHSSAF_FACTION_AIRFORCE_OPFOR","RHSSAF_FACTION_AIRFORCE","RHSSAF_FACTION_UN","B_COPOLICE_WDL","B_CONAVY_SNW","RHS_FACTION_USARMY_D","RHS_FACTION_USARMY_WD","RHS_FACTION_USN","RHS_FACTION_SOCOM","RHS_FACTION_USAF","RHS_FACTION_USMC_D","RHS_FACTION_USMC_WD","RHSGREF_FACTION_UN","RHSGREF_FACTION_NATIONALIST","RHSGREF_FACTION_TLA","RHSGREF_FACTION_TLA_G","RHSGREF_FACTION_CDF_GROUND","RHSGREF_FACTION_CDF_GROUND_B","SC_ARCHONSFACTION","SC_FACTION_AR","SC_FACTION_AC","SC_MDF","SC_FACTION_SE","SG_STURM","SG_STURMPANZER","SPE_FFI","SPE_FR_ARMY","SPE_MILICE","SPE_STURM","SPE_US_ARMY","SPE_WEHRMACHT","UK3CB_AAF_O","UK3CB_AAF_I","UK3CB_AAF_B","UK3CB_ANA_B","UK3CB_ANP_B","UK3CB_ADA_O","UK3CB_ADA_I","UK3CB_ADA_B","UK3CB_ADR_O","UK3CB_ADR_I","UK3CB_ADR_B","UK3CB_ADG_O","UK3CB_ADG_I","UK3CB_ADG_B","UK3CB_ADC_O","UK3CB_ADC_I","UK3CB_ADC_B","UK3CB_ADE_O","UK3CB_ADE_I","UK3CB_ADM_O","UK3CB_ADM_I","UK3CB_ADM_B","UK3CB_ADP_O","UK3CB_ADP_I","UK3CB_ADP_B","UK3CB_APD_O","UK3CB_APD_I","UK3CB_APD_B","UK3CB_ARD_O","UK3CB_ARD_I","UK3CB_ARD_B","UK3CB_CHD_O","UK3CB_CHD_W_O","UK3CB_CHD_B","UK3CB_CHD_W_B","UK3CB_CHD_I","UK3CB_CHD_W_I","UK3CB_CHC_O","UK3CB_CHC_I","UK3CB_CHC_B","UK3CB_CCM_O","UK3CB_CCM_B","UK3CB_CCM_I","UK3CB_CPD_O","UK3CB_CPD_I","UK3CB_CPD_B","UK3CB_CW_US_B_EARLY","UK3CB_CW_US_B_LATE","UK3CB_CW_SOV_O_EARLY","UK3CB_CW_SOV_O_LATE","UK3CB_CSAT_A_O","UK3CB_CSAT_W_O","UK3CB_CSAT_M_O","UK3CB_CSAT_B_O","UK3CB_CSAT_N_O","UK3CB_CSAT_F_O","UK3CB_CSAT_G_O","UK3CB_CSAT_U_O","UK3CB_CSAT_S_O","UK3CB_FIA_O","UK3CB_FIA_I","UK3CB_FIA_B","UK3CB_GAF_O","UK3CB_GAF_I","UK3CB_GAF_B","UK3CB_ION_O_DESERT","UK3CB_ION_I_DESERT","UK3CB_ION_B_DESERT","UK3CB_ION_O_URBAN","UK3CB_ION_I_URBAN","UK3CB_ION_B_URBAN","UK3CB_ION_O_WINTER","UK3CB_ION_I_WINTER","UK3CB_ION_B_WINTER","UK3CB_ION_O_WOODLAND","UK3CB_ION_I_WOODLAND","UK3CB_ION_B_WOODLAND","UK3CB_KRG_O","UK3CB_KRG_I","UK3CB_KRG_B","UK3CB_KDF_O","UK3CB_KDF_I","UK3CB_KDF_B","UK3CB_LDF_O","UK3CB_LDF_I","UK3CB_LDF_B","UK3CB_LFR_O","UK3CB_LFR_I","UK3CB_LFR_B","UK3CB_LSM_O","UK3CB_LSM_I","UK3CB_LSM_B","UK3CB_LNM_O","UK3CB_LNM_I","UK3CB_LNM_B","UK3CB_MDF_O","UK3CB_MDF_I","UK3CB_MDF_B","UK3CB_MEC_O","UK3CB_MEC_I","UK3CB_MEC_B","UK3CB_MEE_O","UK3CB_MEE_I","UK3CB_MEI_O","UK3CB_MEI_I","UK3CB_MEI_B","UK3CB_NAP_O","UK3CB_NAP_I","UK3CB_NAP_B","UK3CB_NFA_O","UK3CB_NFA_I","UK3CB_NFA_B","UK3CB_NPD_O","UK3CB_NPD_I","UK3CB_NPD_B","UK3CB_TKC_O","UK3CB_TKC_I","UK3CB_TKC_B","UK3CB_TKM_O","UK3CB_TKA_O","UK3CB_TKA_I","UK3CB_TKA_B","UK3CB_TKP_O","UK3CB_TKP_I","UK3CB_TKP_B","UK3CB_TKM_B","UK3CB_TKM_I","UK3CB_UN_I","UK3CB_UN_B","RHSGREF_FACTION_CDF_AIR","RHSGREF_FACTION_CDF_AIR_B","RHSGREF_FACTION_CDF_NG","RHSGREF_FACTION_CDF_NG_B","RHSGREF_FACTION_CHDKZ","RHSGREF_FACTION_CHDKZ_G","RHSGREF_FACTION_HIDF","UNSUNG_G","UNSUNG_AUS","UNSUNG_NZ","UNSUNG_ROK","UNSUNG_W","UNSUNG_EV","UNSUNG_E","US85_DES","I_ARVN","B_AUS","I_CAM","O_CAM","B_MACV","B_NZ","O_PL","O_PAVN","B_ROK","I_LAO","B_CIA","B_MEDT","O_VC","B_COARMY_WDL","OPF_GEN_F","BLU_ION_LXWS","OPF_SFIA_LXWS","OPF_TURA_LXWS","IND_TURA_LXWS","BLU_TURA_LXWS","BLU_NATO_LXWS"]; //All factions
+_p_en = _allfaction select _p_en; //Select faction selected from mission parameter
+_allclasse = [[_p_en], _p_en_AA, _p_en_tank] call btc_mil_fnc_class; //Create classes from factions, you can combine factions like that: [[_p_en , "IND_F"], _p_en_AA, _p_en_tank] call btc_mil_fnc_class;
+
+//Save class name to global variable
+btc_enemy_side = _allclasse select 0;
+btc_type_units = _allclasse select 1;
+btc_type_divers = _allclasse select 2;
+btc_type_crewmen = _allclasse select 3;
+btc_type_boats = _allclasse select 4;
+btc_type_motorized = _allclasse select 5;
+btc_type_motorized_armed = _allclasse select 6;
+btc_type_mg = _allclasse select 7;
+btc_type_gl = _allclasse select 8;
+
+//Sometimes you need to remove units: - ["Blabla","moreBlabla"];
+//Sometimes you need to add units: + ["Blabla","moreBlabla"];
+switch (_p_en) do {
+ /*case "Myfactionexemple" : {
+ btc_type_units = btc_type_units - ["Blabla","moreBlabla"];
+ btc_type_divers = btc_type_divers + ["Blabla","moreBlabla"];
+ btc_type_crewmen = "Blabla";
+ btc_type_boats = btc_type_boats;
+ btc_type_motorized = btc_type_motorized;
+ btc_type_mg = btc_type_mg;
+ btc_type_gl = btc_type_gl;
+ };*/
+ case "OPF_G_F" : {
+ btc_type_motorized = btc_type_motorized + ["I_Truck_02_transport_F", "I_Truck_02_covered_F"];
+ btc_type_motorized_armed = btc_type_motorized_armed + ["I_Heli_light_03_F"];
+ };
+ case "IND_C_F" : {
+ btc_type_motorized = btc_type_motorized + ["I_G_Offroad_01_repair_F", "I_G_Offroad_01_F", "I_G_Quadbike_01_F", "I_G_Van_01_fuel_F", "I_Truck_02_transport_F", "I_Truck_02_covered_F"];
+ btc_type_motorized_armed = btc_type_motorized_armed + ["I_Heli_light_03_F", "I_G_Offroad_01_F"];
+ btc_type_units = btc_type_units - ["I_C_Soldier_Camo_F"];
+ };
+};
+
+//Chem
+btc_chem_range = 3;
+
+//Spect
+btc_spect_range = 1000;
+btc_spect_updateOn = -1;
+
+//Rep
+btc_rep_bonus_cache = 100;
+btc_rep_bonus_civ_hh = 3;
+btc_rep_bonus_disarm = 15;
+btc_rep_bonus_hideout = 200;
+btc_rep_bonus_mil_killed = 0.25;
+btc_rep_bonus_IEDCleanUp = 10;
+btc_rep_bonus_removeTag = 3;
+btc_rep_bonus_removeTagLetter = 0.5;
+btc_rep_bonus_foodGive = 0.5;
+btc_rep_bonus_grave = 5;
+
+btc_rep_malus_civ_hd = - 2;
+btc_rep_malus_animal_hd = - 1;
+btc_rep_malus_civ_killed = - 10;
+btc_rep_malus_animal_killed = - 5;
+btc_rep_malus_civ_suppressed = - 4;
+btc_rep_malus_player_respawn = - 10;
+btc_rep_malus_veh_killed = - 25;
+btc_rep_malus_building_damaged = - 2.5;
+btc_rep_malus_building_destroyed = - 5;
+btc_rep_malus_foodRemove = - btc_rep_bonus_foodGive;
+btc_rep_malus_breakDoor = - 2;
+btc_rep_malus_wheelChange = - 7;
+btc_rep_malus_mil_killed = - 10;
+
+btc_rep_level_veryLow = 0;
+btc_rep_level_low = 200;
+btc_rep_level_normal = 500;
+btc_rep_level_high = 750;
+
+btc_rep_food = "ACE_Banana";
+
+//Headless
+btc_units_owners = [];
+
+//Door
+btc_door_breaking_time = 60;
+
+//Flag
+btc_flag_textures = [
+ "\A3\Data_F\Flags\flag_red_CO.paa",
+ "\A3\Data_F\Flags\flag_green_CO.paa",
+ "\A3\Data_F\Flags\flag_blue_CO.paa",
+ "z\ace\addons\flags\data\Flag_yellow_co.paa",
+ "\A3\Data_F\Flags\flag_NATO_CO.paa"
+];
+
+//Respawn
+btc_body_bagTicketPlayer = 1;
+btc_body_prisonerTicket = 1;
+
+btc_startDate = [2035, 6, 24, 12, 15];
diff --git a/hearts_and_minds.kunduz_valley/core/def/param.hpp b/hearts_and_minds.kunduz_valley/core/def/param.hpp
new file mode 100644
index 0000000..19c53ce
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/def/param.hpp
@@ -0,0 +1,506 @@
+class Params {
+ class btc_p_time_title { // << Time options >>
+ title = $STR_BTC_HAM_PARAM_TIME_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_time { // Set the start time:
+ title = __EVAL(format [" %1", localize "STR_A3_CFGVEHICLES_MODULEDATE_F_ARGUMENTS_HOUR_0"]);
+ values[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
+ texts[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"};
+ default = 12;
+ };
+ class btc_p_acctime { // Acceleration time multiplier:
+ title = __EVAL(format [" %1", localize "STR_USRACT_TIME_INC"]);
+ values[]={1,2,3,4,5,6,7,8,9,10,11,12};
+ texts[]={"1","2","3","4","5","6","7","8","9","10","11","12"};
+ default = 5;
+ };
+ class btc_p_change_time { // Enable change day time for officer on the arsenal box:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_CHANGE_TIME_ENABLEARSENAL"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_change_weather { // Enable change weather for officer on the arsenal box
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_CHANGE_WEATHER_ENABLEARSENAL"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_db_title { // << Server management >>
+ title = $STR_BTC_HAM_PARAM_DB_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_load { // Load the savegame (if available)
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_LOAD"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_auto_db { // Auto savegame when all players disconnected
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_ASAVE"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED}; // texts[]={"Off","On"};
+ default = 0;
+ };
+ class btc_p_db_autoRestartTime { // Time before auto restart/shutdown server
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_ARESTARTTIME"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,24,48,72};
+ texts[]={$STR_DISABLED, "1h","2h","3h","4h","5h","6h","7h","8h","9h","10h","11h","12h","24h","48h","72h"};
+ default = 0;
+ };
+ class btc_p_db_autoRestartHour1 { // Hour of auto restart/shutdown server
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_HRESTARTTIME"]);
+ values[]={-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
+ texts[]={$STR_DISABLED,"00h00","01h00","02h00","03h00","04h00","05h00","06h00","07h00","08h00","09h00","10h00","11h00","12h00","13h00","14h00","15h00","16h00","17h00","18h00","19h00","20h00","21h00","22h00","23h00"};
+ default = -1;
+ };
+ class btc_p_db_autoRestartHour2 { // Hour of auto restart/shutdown server
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_HRESTARTTIME"]);
+ values[]={-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
+ texts[]={$STR_DISABLED,"00h00","01h00","02h00","03h00","04h00","05h00","06h00","07h00","08h00","09h00","10h00","11h00","12h00","13h00","14h00","15h00","16h00","17h00","18h00","19h00","20h00","21h00","22h00","23h00"};
+ default = -1;
+ };
+ class btc_p_db_autoRestartType { // Auto restart/shutdown server (Must define in server.cfg: serverCommandPassword = "btc_password")
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_DB_ARESTART"]);
+ values[]={1,2,3,4};
+ texts[]={$STR_DISP_MP_DS_RESTART,$STR_BTC_HAM_PARAM_DB_SHUTDOWN,$STR_BTC_HAM_PARAM_DB_SAVERESTART, $STR_BTC_HAM_PARAM_DB_SAVESHUTDOWN}; // texts[]={"Restart", "Shutdown","Save and restart", "Save and shutdown"};
+ default = 4;
+ };
+ class btc_p_respawn_title { // << Respawn options >>
+ title = $STR_BTC_HAM_RESP_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_respawn_fromOutsideBase { // Enable respawn menu access from outside the base:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_OUTSIDEBASE"]);
+ values[]={0,1,2,3,4,5};
+ texts[]={$STR_DISABLED, $STR_BTC_HAM_RESP_FOB, $STR_BTC_HAM_RESP_FOBHELO, $STR_BTC_HAM_RESP_FOBHELI, $STR_BTC_HAM_RESP_FOBHELIVEHI, $STR_BTC_HAM_RESP_FOBHELIVEHIPLAYER};
+ default = 0;
+ };
+ class btc_p_respawn_fromOutsideTimeout { // Add a 1 min timeout for accessing the respawn menu for:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_OUTSIDETIMEOUT"]);
+ values[]={0,1,2,3,4,5};
+ texts[]={$STR_DISABLED, $STR_BTC_HAM_RESP_TIMEOUTPLAYER, $STR_BTC_HAM_RESP_TIMEOUTVEHIPLAYER, $STR_BTC_HAM_RESP_TIMEOUTHELIVEHIPLAYER, $STR_BTC_HAM_RESP_TIMEOUTFOBHELOVEHIPLAYER, $STR_BTC_HAM_RESP_TIMEOUTFOBHELIVEHIPLAYER};
+ default = 0;
+ };
+ class btc_p_respawn_location { // Respawn locations available:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_LOCATION"]);
+ values[]={0,1,2,3,4};
+ texts[]={$STR_BTC_HAM_RESP_FOBRALLY, $STR_BTC_HAM_RESP_FOBRALLYHELO, $STR_BTC_HAM_RESP_FOBRALLYHELI, $STR_BTC_HAM_RESP_FOBRALLYHELIVEHI, $STR_BTC_HAM_RESP_FOBRALLYHELIVEHILEADER};
+ default = 4;
+ };
+ class btc_p_rallypointTimer { // Time before rallypoint self-destruction:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_RALLYTIMER"]);
+ values[]={0,5,10,30,60};
+ texts[]={$STR_DISABLED,"5 min","10 min","30 min","60 min"};
+ default = 30;
+ };
+ class btc_p_respawn_ticketsAtStart { // Number of tickets at mission start:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_TICKETSATSTART"]);
+ values[]={-1,0,1,2,3,4,5,10,15,20,25,30,50,70,100,150,200};
+ texts[]={$STR_DISABLED,"0","1","2","3","4","5","10","15","20","25","30","50","70","100","150","200"};
+ default = 20;
+ };
+ class btc_p_respawn_ticketsLost { // Number of tickets lost per death:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_TICKETSLOST"]);
+ values[]={1,2,3,4,5,6,7,8,9,10};
+ texts[]={"1","2","3","4","5","6","7","8","9","10"};
+ default = 1;
+ };
+ class btc_p_respawn_ticketsShare { // Tickets are share between:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_TICKETSHARE"]);
+ values[]={0,1};
+ texts[]={$STR_BTC_HAM_RESP_SAMEFACTION, $STR_BTC_HAM_RESP_NOTSHARE};
+ default = 1;
+ };
+ class btc_p_respawn_ticketsFromPrisoners { // Attribute tickets from prisoners to (Enable only if tickets are not share):
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_TICKETPRISONER"]);
+ values[]={1,2,3,4};
+ texts[]={$STR_BTC_HAM_RESP_ALLCONNECTED, $STR_BTC_HAM_RESP_PLAYER, $STR_BTC_HAM_RESP_DEADPLAYER, $STR_BTC_HAM_RESP_LOWESTPLAYER};
+ default = 1;
+ };
+ class btc_p_body_timeBeforeShowMarker { // Time before showing marker of dead player's body:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_TIMEBEFORESHOWMARKER"]);
+ values[]={-1,0,5,10,30,60};
+ texts[]={$STR_DISABLED,"0 min","5 min","10 min","30 min","60 min"};
+ default = 10;
+ };
+ class btc_p_respawn_arsenal { // ACE Arsenal available on respawn after been killed:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_RESP_ENABLEARSENAL"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_slot_isShare { // Each slot is share between players
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SLOT_ISSHARE"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED, $STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_type_title { // << Faction options >>
+ title = $STR_BTC_HAM_PARAM_FAC_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_en { // Enemy type:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_FAC_ETYPE"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403};
+ texts[]={"0 - : Awakened (Side: EAST)","1 - AFR BIS/IceBreakr: Afrenian Army (Side: WEST)","2 - AOA nzdfcrash: (C) Policia Nacional De Colombia (Side: WEST)","3 - ARA Bohemia Interactive: Abramian Rebel Alliance (Side: WEST)","4 - ARL BIS/IceBreakr: ARL Lingor Rebels (Side: EAST)","5 - BLU Bohemia Interactive: US (Side: WEST)","6 - BLU Ravenholme: LDF (Arid) (Side: WEST)","7 - BLU Ravenholme: LDF (Side: WEST)","8 - Bohemia Interactive: 2035 AAF (Side: GUER)","9 - Bohemia Interactive: 2035 CTRG (Side: WEST)","10 - Bohemia Interactive: 2035 FIA (Side: EAST)","11 - Bohemia Interactive: 2035 FIA (Side: GUER)","12 - Bohemia Interactive: 2035 FIA (Side: WEST)","13 - Bohemia Interactive: 2035 Syndikat (Side: GUER)","14 - Bohemia Interactive: LDF (Side: GUER)","15 - Bohemia Interactive: Looters (Side: GUER)","16 - CEC HcPookie: Cecanian Army (Side: EAST)","17 - CFP CFP: Chadian Armed Forces (Side: WEST)","18 - CFP CFP: Iraqi Army (Hussein Regime) (Side: EAST)","19 - CFP CFP: Israeli Defense Force (Side: WEST)","20 - CFP CFP: Nigerian Army (Side: WEST)","21 - CFP CFP: Sudan Rapid Support Forces / Janjaweed (Side: EAST)","22 - CFP Drew: Abu Sayyaf Group (Side: EAST)","23 - CFP Drew: Afghan Police (Side: WEST)","24 - CFP Drew: Al Qaeda (Side: EAST)","25 - CFP Drew: al-Nusra Front (Side: GUER)","26 - CFP Drew: Al-Shabaab (Side: EAST)","27 - CFP Drew: Boko Haram (Side: EAST)","28 - CFP Drew: Central African Rebels (Side: EAST)","29 - CFP Drew: Hamas Al Qassam Brigades (Side: EAST)","30 - CFP Drew: Hezbollah (Side: EAST)","31 - CFP Drew: Iraqi Army (Side: WEST)","32 - CFP Drew: Iraqi Police (Side: WEST)","33 - CFP Drew: Islamic Republic of Iran Army (Side: EAST)","34 - CFP Drew: Islamic State (Side: EAST)","35 - CFP Drew: Islamic State (Side: GUER)","36 - CFP Drew: Kenyan Defense Force (Side: WEST)","37 - CFP Drew: Malian Government Forces (Side: WEST)","38 - CFP Drew: Peshmerga (Side: WEST)","39 - CFP Drew: Somali Rebels (Side: EAST)","40 - CFP Drew: South Sudan People's Defense Force (Side: GUER)","41 - CFP Drew: Sudan People's Liberation Movement In Opposition (Side: EAST)","42 - CFP Drew: Sudan People's Liberation Movement North (Side: GUER)","43 - CFP Drew: Sudan Revolutionary Front (Side: GUER)","44 - CFP Drew: Sudanese Armed Forces (Side: EAST)","45 - CFP Drew: Syrian Arab Army (Side: EAST)","46 - CFP Drew: Taliban Insurgents (Side: EAST)","47 - CFP Drew: Tuareg Rebels (Side: GUER)","48 - CFP Drew: Uganda People's Defense Force (Side: WEST)","49 - CFP Drew: US 75th Rangers (Jungle/Woodland) (Side: WEST)","50 - CFP Drew: US Navy Seals (Arid / Desert) (Side: WEST)","51 - CFP Drew: US Navy Seals (Jungle / Woodland) (Side: WEST)","52 - CFP Drew: YPG (Side: WEST)","53 - CFP Tupolov: Ansar Allah (Houthis) (Side: EAST)","54 - CFP Tupolov: Army of the Czech Rep. (Jungle / Woodland) (Side: WEST)","55 - CFP Tupolov: Western Ultranationalists (Side: GUER)","56 - COL Bohemia Interactive: (A) Fuerza Aérea Colombiana (Side: WEST)","57 - COL nzdfcrash: (Side: WEST)","58 - COL nzdfcrash: (B) Ejercito Nacional De Colombia (Side: WEST)","59 - COL nzdfcrash: Fuerzas Militares de Colombia (Side: WEST)","60 - CSLA CSLA Studio: CSLA (Desert) (Side: EAST)","61 - CSLA Studio: AFMC (Side: WEST)","62 - CSLA Studio: CSLA (Side: EAST)","63 - CSLA Studio: FIA [CSLA] (Side: GUER)","64 - CSLA Studio: US '85 (Side: WEST)","65 - CUP Community Upgrade Project: Armed Forces of Ukraine (Side: WEST)","66 - CUP Community Upgrade Project: Army of the Czech Rep. (Arid / Desert) (Side: WEST)","67 - CUP Community Upgrade Project: British Army (Arid / Desert) (Side: WEST)","68 - CUP Community Upgrade Project: Chernarus Defense Forces (Side: WEST)","69 - CUP Community Upgrade Project: Chernarussian Movement of the Red Star (Side: EAST)","70 - CUP Community Upgrade Project: CUP Static Ships (Side: WEST)","71 - CUP Community Upgrade Project: National Party of Chernarus (Side: GUER)","72 - CUP Community Upgrade Project: Royal Army Corps of Sahrani (Side: GUER)","73 - CUP Community Upgrade Project: Royal New Zealand Navy (Side: WEST)","74 - CUP Community Upgrade Project: Russian Ground Forces (Jungle / Woodland) (Side: EAST)","75 - CUP Community Upgrade Project: Sahrani Liberation Army (Side: EAST)","76 - CUP Community Upgrade Project: Takistani Army (Side: EAST)","77 - CUP Community Upgrade Project: Takistani Militia (Side: EAST)","78 - CUP Community Upgrade Project: United Nations (Side: GUER)","79 - CUP Community Upgrade Project: US Army (Arid / Desert) (Side: WEST)","80 - CUP Community Upgrade Project: US Marine Corps (Jungle / Woodland) (Side: WEST)","81 - CUP CUP: Bundeswehr (Arid / Desert) (Side: WEST)","82 - CUP joker006 + CUP: Horizon Islands Legion (Side: WEST)","83 - CUP joker006 + CUP: ION PMC (Side: GUER)","84 - CUP_Units Community Upgrade Project: Armed Forces of the Russian Federation (Modern) (Side: EAST)","85 - CUP_Units Community Upgrade Project: British Army (Jungle / Woodland) (Side: WEST)","86 - CUP_Units Community Upgrade Project: Bundeswehr (Jungle / Woodland) (Side: WEST)","87 - CUP_Units Community Upgrade Project: Takistani Locals (Side: GUER)","88 - CUP_Units Community Upgrade Project: US Marine Corps (Arid / Desert) (Side: WEST)","89 - CUP_Units Drew: Chernarus Defense Forces [Winter] (Side: WEST)","90 - CUP_Units Drew: PMC Wagner (Arid / Desert) (Side: EAST)","91 - CUP_Units Drew: PMC Wagner (Arid / Desert) (Side: GUER)","92 - CUP_Units Drew: PMC Wagner (Winter) (Side: EAST)","93 - CUP_Units Drew: PMC Wagner (Winter) (Side: GUER)","94 - CUP_Units Drew: PMC Wagner (Woodland) (Side: EAST)","95 - CUP_Units Drew: PMC Wagner (Woodland) (Side: GUER)","96 - CUP_Units Drew: US Army 1991 [Arid/Desert] (Side: WEST)","97 - CUP_Units Drew: US Army 1991 [Woodland] (Side: WEST)","98 - CUP_Units Drew: US Army 2003 [Arid/Desert] (Side: WEST)","99 - CUP_Units Drew: US Army 2003 [Woodland] (Side: WEST)","100 - CUP_Units Tupolov: Russian National Guard (Side: EAST)","101 - CUP_Units Tupolov: US CIA (Middle East) (Side: WEST)","102 - CUP_Vehicles Community Upgrade Project: US Army (Jungle / Woodland) (Side: WEST)","103 - CUP_Vehicles Drew: Afghan Army (Side: WEST)","104 - CUP_Vehicles Drew: Chernarussian Movement of the Red Star [Winter] (Side: EAST)","105 - CUP_Vehicles Tupolov: Russian Ground Forces (Arid / Desert) (Side: EAST)","106 - cwr3_dlc CWR III Modification: FIA (CWR III) (Side: GUER)","107 - cwr3_dlc CWR III Modification: Rebels (CWR III) (Side: EAST)","108 - cwr3_dlc CWR III Modification: Rebels (CWR III) (Side: WEST)","109 - cwr3_dlc CWR III Modification: Soviet Army (CWR III) (Side: EAST)","110 - cwr3_dlc CWR III Modification: United States Army (CWR III) (Side: WEST)","111 - cwr3_dlc CWR III Modification: United States Army, Desert (CWR III) (Side: WEST)","112 - Dinei: [ Farcs ] Colombia (Side: EAST)","113 - Enoch Bohemia Interactive: Russia (Side: EAST)","114 - Expansion Avery Kaiserin: BAF (Pacific) (Side: WEST)","115 - Expansion Avery Kaiserin: BAF (Woodland) (Side: WEST)","116 - Expansion Avery Kaiserin: Russia (Arid) (Side: EAST)","117 - Expansion Bohemia Interactive: 2035 Gendarmerie (Side: WEST)","118 - Expansion Bohemia Interactive: 2035 Viper (Side: EAST)","119 - Expansion Bohemia Interactive: CTRG (Pacific) (Side: WEST)","120 - Expansion Bohemia Interactive: Viper (Pacific) (Side: EAST)","121 - Expansion Drew: Korean People's Army (Side: EAST)","122 - Expansion Ravenholme: China (Desert) (Side: EAST)","123 - FAP nzdfcrash/icebreakr: Fapovian Army (Side: EAST)","124 - FIA CSLA Studio: FIA [CSLA] (Desert) (Side: GUER)","125 - FOW Bohemia Interactive: [DE] Heer (Side: WEST)","126 - FOW Bohemia Interactive: [JP] Navy Air Service (Side: WEST)","127 - FOW Bohemia Interactive: [UK] Fleet Air Arm (Side: GUER)","128 - FOW Bohemia Interactive: [US] Navy (Side: GUER)","129 - FOW FOW Team: [DE] Waffen-SS (Side: WEST)","130 - fow_mod Bohemia Interactive: [AUS] Army (Pacific) (Side: GUER)","131 - fow_mod Bohemia Interactive: [DE] Luftwaffe (Side: WEST)","132 - fow_mod Bohemia Interactive: [HI] Army (Side: GUER)","133 - fow_mod Bohemia Interactive: [UK] Army (Side: GUER)","134 - fow_mod Bohemia Interactive: [US] Army (Pacific) (Side: GUER)","135 - fow_mod FOW team: [JP] Imperial Army (Side: WEST)","136 - fow_mod FOW team: [US] Army (Europe) (Side: GUER)","137 - fow_mod FOW team: [US] Marines Corps (Side: GUER)","138 - GAL HcPookie: GAL (Government Army of Lingor) (Side: WEST)","139 - GANGBLUE BIS/IceBreakr: Blue Gang (Side: WEST)","140 - GANGRED BIS/IceBreakr: Red Gang (Side: EAST)","141 - gm Global Mobilization: Denmark (Side: WEST)","142 - gm Global Mobilization: East Germany (Borderguards) (Side: EAST)","143 - gm Global Mobilization: East Germany (Side: EAST)","144 - gm Global Mobilization: Poland (Side: EAST)","145 - gm Global Mobilization: Revolutionaries (Side: GUER)","146 - gm Global Mobilization: West Germany (Borderguards) (Side: WEST)","147 - gm Global Mobilization: West Germany (Side: WEST)","148 - Howard: Taliban Force 2021 (Side: EAST)","149 - IBR Bohemia Interactive: Alienz (Zetaborn) (Side: GUER)","150 - IBR Lord Frith/IceBreakr: Robots (Side: EAST)","151 - IND Heliotrope: Raven Security (Side: GUER)","152 - IND Ravenholme: LDF (Arid) (Side: GUER)","153 - LIB AWAR & Lennard: [Winter] Red Army (Side: EAST)","154 - LIB AWAR & Lennard: [Winter] Wehrmacht (Side: WEST)","155 - LIB AWAR & Lennard: ARR (Side: WEST)","156 - LIB AWAR & Lennard: MKHL (Side: WEST)","157 - LIB AWAR & Lennard: RBAF (Side: WEST)","158 - LIB AWAR: ACI (Side: GUER)","159 - LIB AWAR: Home Army (Polish) (Side: GUER)","160 - LIB AWAR: RAAF (Side: GUER)","161 - LIB AWAR: Red Army (Side: EAST)","162 - LIB AWAR: Wehrmacht (Side: WEST)","163 - LIB El Tyranos: 101st Airborne Division (Side: GUER)","164 - LIB El Tyranos: 82nd Airborne Division (Side: GUER)","165 - LIB El Tyranos: [Winter] UK Airborne (Side: GUER)","166 - LIB El Tyranos: [Winter] UK Army (Side: GUER)","167 - LIB El Tyranos: [Winter] US Army (Side: GUER)","168 - LIB IFA3 Team: Fallschirmjäger (Side: WEST)","169 - LIB IFA3 Team: UK Airborne (Side: GUER)","170 - LIB IFA3 Team: UK Army (Side: GUER)","171 - LIB IFA3 Team: UK Desert Rats (Side: GUER)","172 - LIB IFA3 team: US Army (Side: GUER)","173 - LIB Lennard: Deutsches Afrikakorps (Side: WEST)","174 - LIB Lennard: NKVD (Side: EAST)","175 - LIB Lennard: US 2nd Ranger Battalion (Side: GUER)","176 - LIB Lennard: US North African Corps (Side: GUER)","177 - LIB Reyhard & Joarius: FFI (Side: GUER)","178 - lxWS Rotators Collective: UNA (Side: WEST)","179 - Mark Bohemia Interactive: US (Woodland) (Side: WEST)","180 - MOL HcPookie: Molatian Army (Side: EAST)","181 - OPF Bohemia Interactive: Argana (Side: EAST)","182 - OPF Bohemia Interactive: Iran (Side: EAST)","183 - OPF Community Upgrade Project: China (Side: EAST)","184 - OPF Heliotrope: Raven Security (Side: EAST)","185 - OPTRE A2S: Dark Moon Enterprises (Side: GUER)","186 - OPTRE A2S: Insurrectionist (Side: EAST)","187 - OPTRE Article 2 Studios: CAA (Side: GUER)","188 - OPTRE Article 2 Studios: Colonial Police (Side: GUER)","189 - OPTRE Article 2 Studios: UNSCDF (Side: WEST)","190 - OPTREFC Article 2 Studios & SkaboodlyDoodle: Covenant (Side: EAST)","191 - Orange OverKlitz: (B) ELN ALiVE (Side: GUER)","192 - Orange OverKlitz: (B) FARC Disidencias ALiVE (Side: GUER)","193 - Orange OverKlitz: (C) AGC Paramilitares ALiVE (Side: EAST)","194 - Orange OverKlitz: (D) EPL ALiVE (Side: EAST)","195 - rf Rotators Collective: BAF (Side: WEST)","196 - rf Rotators Collective: US (Pacific) (Side: WEST)","197 - RHS Red Hammer Studios: Russia (VMF) (Side: EAST)","198 - RHS_AFRF Red Hammer Studios: Russia (MSV) (Side: EAST)","199 - RHS_AFRF Red Hammer Studios: Russia (RVA) (Side: EAST)","200 - RHS_AFRF Red Hammer Studios: Russia (TV) (Side: EAST)","201 - RHS_AFRF Red Hammer Studios: Russia (VDV) (Side: EAST)","202 - RHS_AFRF Red Hammer Studios: Russia (VPVO) (Side: EAST)","203 - RHS_AFRF Red Hammer Studios: Russia (VV) (Side: EAST)","204 - RHS_AFRF Red Hammer Studios: Russia (VVS - Camo) (Side: EAST)","205 - RHS_AFRF Red Hammer Studios: Russia (VVS - Grey) (Side: EAST)","206 - RHS_SAF Red Hammer Studios: SAF (KOV) (Side: GUER)","207 - RHS_SAF RHS (A2 port): SAF (KOV) (Side: EAST)","208 - RHS_SAF RHS (A2 port): SAF (RVIPVO) (Side: EAST)","209 - RHS_SAF RHS (A2 port): SAF (RVIPVO) (Side: GUER)","210 - RHS_SAF RHS (A2 port): SAF (UN Peacekeepers) (Side: GUER)","211 - RHS_USAF OverKlitz: (C) Policia Nacional | ALiVE (Side: WEST)","212 - RHS_USAF OverKlitz: (D) Infanteria de Marina (Side: WEST)","213 - RHS_USAF Red Hammer Studios: USA (Army - D) (Side: WEST)","214 - RHS_USAF Red Hammer Studios: USA (Army - W) (Side: WEST)","215 - RHS_USAF Red Hammer Studios: USA (Navy) (Side: WEST)","216 - RHS_USAF Red Hammer Studios: USA (SOCOM) (Side: WEST)","217 - RHS_USAF Red Hammer Studios: USA (USAF) (Side: WEST)","218 - RHS_USAF Red Hammer Studios: USA (USMC - D) (Side: WEST)","219 - RHS_USAF Red Hammer Studios: USA (USMC - W) (Side: WEST)","220 - RHSGREF Red Hammer Studios: CDF (UN) (Side: GUER)","221 - RHSGREF Red Hammer Studios: NAPA (Side: GUER)","222 - RHSGREF Red Hammer Studios: Tanoan Liberation Army (Side: EAST)","223 - RHSGREF Red Hammer Studios: Tanoan Liberation Army (Side: GUER)","224 - RHSGREF www.3commandobrigade.com: CDF (Ground Forces) (Side: GUER)","225 - RHSGREF www.3commandobrigade.com: CDF (Ground Forces) (Side: WEST)","226 - SC : Archons (Side: GUER)","227 - SC Scion Conflict Mod Team: Amalgamate Republic (Side: WEST)","228 - SC Scion Conflict Mod Team: Atlas Corporation (Side: GUER)","229 - SC Scion Conflict Mod Team: Martian Defence Force (Side: EAST)","230 - SC Scion Conflict Mod Team: Scion Empire (Side: EAST)","231 - SG Stagler: Sturmtroopers (Side: WEST)","232 - SG Stagler: Tank Sturmtroopers (Side: WEST)","233 - SPE Heavy Ordnance Works: [SPE] French Interior Forces (Side: GUER)","234 - SPE Heavy Ordnance Works: [SPE] French Liberation Army (Side: GUER)","235 - SPE Heavy Ordnance Works: [SPE] La Milice (Side: WEST)","236 - SPE Heavy Ordnance Works: [SPE] Sturmtroopers (Side: WEST)","237 - SPE Heavy Ordnance Works: [SPE] US Army (Side: GUER)","238 - SPE Heavy Ordnance Works: [SPE] Wehrmacht (Side: WEST)","239 - UK3CB_Factions www.3commandobrigade.com: 3CB AAF (Side: EAST)","240 - UK3CB_Factions www.3commandobrigade.com: 3CB AAF (Side: GUER)","241 - UK3CB_Factions www.3commandobrigade.com: 3CB AAF (Side: WEST)","242 - UK3CB_Factions www.3commandobrigade.com: 3CB Afghan National Army (Side: WEST)","243 - UK3CB_Factions www.3commandobrigade.com: 3CB Afghan National Police (Side: WEST)","244 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army (Side: EAST)","245 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army (Side: GUER)","246 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army (Side: WEST)","247 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army Paramilitary (Side: EAST)","248 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army Paramilitary (Side: GUER)","249 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Army Paramilitary (Side: WEST)","250 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilian Militia (Side: EAST)","251 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilian Militia (Side: GUER)","252 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilian Militia (Side: WEST)","253 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilians (Side: EAST)","254 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilians (Side: GUER)","255 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilians (Side: WEST)","256 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Extremists (Side: EAST)","257 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Extremists (Side: GUER)","258 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Militia (Side: EAST)","259 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Militia (Side: GUER)","260 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Militia (Side: WEST)","261 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert National Police (Side: EAST)","262 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert National Police (Side: GUER)","263 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert National Police (Side: WEST)","264 - UK3CB_Factions www.3commandobrigade.com: 3CB Altis Police Department (Side: EAST)","265 - UK3CB_Factions www.3commandobrigade.com: 3CB Altis Police Department (Side: GUER)","266 - UK3CB_Factions www.3commandobrigade.com: 3CB Altis Police Department (Side: WEST)","267 - UK3CB_Factions www.3commandobrigade.com: 3CB Ardistan Army (Side: EAST)","268 - UK3CB_Factions www.3commandobrigade.com: 3CB Ardistan Army (Side: GUER)","269 - UK3CB_Factions www.3commandobrigade.com: 3CB Ardistan Army (Side: WEST)","270 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDKZ (Chernarussian Movement of the Red Star) (Side: EAST)","271 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDKZ Winter (Chernarussian Movement of the Red Star) (Side: EAST)","272 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDSZ (Chernarussian Movement of the Blue Star) (Side: WEST)","273 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDSZ Winter (Chernarussian Movement of the Blue Star) (Side: WEST)","274 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDZZ (Chernarussian Movement of the Green Star) (Side: GUER)","275 - UK3CB_Factions www.3commandobrigade.com: 3CB ChDZZ Winter (Chernarussian Movement of the Green Star) (Side: GUER)","276 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Civilians (Side: EAST)","277 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Civilians (Side: GUER)","278 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Civilians (Side: WEST)","279 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Communist Militia (Side: EAST)","280 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Local Defence Volunteers (Side: WEST)","281 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Nationalist Militia (Side: GUER)","282 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Police Department (Side: EAST)","283 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Police Department (Side: GUER)","284 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Police Department (Side: WEST)","285 - UK3CB_Factions www.3commandobrigade.com: 3CB Cold War US - Early (Side: WEST)","286 - UK3CB_Factions www.3commandobrigade.com: 3CB Cold War US - Late (Side: WEST)","287 - UK3CB_Factions www.3commandobrigade.com: 3CB Cold War USSR - Early (Side: EAST)","288 - UK3CB_Factions www.3commandobrigade.com: 3CB Cold War USSR - Late (Side: EAST)","289 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Africa (Side: EAST)","290 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Europe (Side: EAST)","291 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Mediterranean (Side: EAST)","292 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Middle East (Side: EAST)","293 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Navy (Pacific) (Side: EAST)","294 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Navy (Side: EAST)","295 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Pacific (Side: EAST)","296 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Urban (Side: EAST)","297 - UK3CB_Factions www.3commandobrigade.com: 3CB CSAT Winter (Side: EAST)","298 - UK3CB_Factions www.3commandobrigade.com: 3CB FIA (Side: EAST)","299 - UK3CB_Factions www.3commandobrigade.com: 3CB FIA (Side: GUER)","300 - UK3CB_Factions www.3commandobrigade.com: 3CB FIA (Side: WEST)","301 - UK3CB_Factions www.3commandobrigade.com: 3CB Grozovia Armed Forces (Side: EAST)","302 - UK3CB_Factions www.3commandobrigade.com: 3CB Grozovia Armed Forces (Side: GUER)","303 - UK3CB_Factions www.3commandobrigade.com: 3CB Grozovia Armed Forces (Side: WEST)","304 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Desert (Side: EAST)","305 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Desert (Side: GUER)","306 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Desert (Side: WEST)","307 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Urban (Side: EAST)","308 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Urban (Side: GUER)","309 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Urban (Side: WEST)","310 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Winter (Side: EAST)","311 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Winter (Side: GUER)","312 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Winter (Side: WEST)","313 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Woodland (Side: EAST)","314 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Woodland (Side: GUER)","315 - UK3CB_Factions www.3commandobrigade.com: 3CB ION Services - Woodland (Side: WEST)","316 - UK3CB_Factions www.3commandobrigade.com: 3CB Karzeghistan Royal Guard (Side: EAST)","317 - UK3CB_Factions www.3commandobrigade.com: 3CB Karzeghistan Royal Guard (Side: GUER)","318 - UK3CB_Factions www.3commandobrigade.com: 3CB Karzeghistan Royal Guard (Side: WEST)","319 - UK3CB_Factions www.3commandobrigade.com: 3CB Kolgujev Defence Force (Side: EAST)","320 - UK3CB_Factions www.3commandobrigade.com: 3CB Kolgujev Defence Force (Side: GUER)","321 - UK3CB_Factions www.3commandobrigade.com: 3CB Kolgujev Defence Force (Side: WEST)","322 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Defence Force (Side: EAST)","323 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Defence Force (Side: GUER)","324 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Defence Force (Side: WEST)","325 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Forest Rangers (Side: EAST)","326 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Forest Rangers (Side: GUER)","327 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Forest Rangers (Side: WEST)","328 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Separatist Militia (Side: EAST)","329 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Separatist Militia (Side: GUER)","330 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonia Separatist Militia (Side: WEST)","331 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonian Nationalist Militia (Side: EAST)","332 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonian Nationalist Militia (Side: GUER)","333 - UK3CB_Factions www.3commandobrigade.com: 3CB Livonian Nationalist Militia (Side: WEST)","334 - UK3CB_Factions www.3commandobrigade.com: 3CB Malden Defence Force (Side: EAST)","335 - UK3CB_Factions www.3commandobrigade.com: 3CB Malden Defence Force (Side: GUER)","336 - UK3CB_Factions www.3commandobrigade.com: 3CB Malden Defence Force (Side: WEST)","337 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Civilians (Side: EAST)","338 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Civilians (Side: GUER)","339 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Civilians (Side: WEST)","340 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Extremists (Side: EAST)","341 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Extremists (Side: GUER)","342 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Insurgents (Side: EAST)","343 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Insurgents (Side: GUER)","344 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Insurgents (Side: WEST)","345 - UK3CB_Factions www.3commandobrigade.com: 3CB NAPA (The National Party) (Side: EAST)","346 - UK3CB_Factions www.3commandobrigade.com: 3CB NAPA (The National Party) (Side: GUER)","347 - UK3CB_Factions www.3commandobrigade.com: 3CB NAPA (The National Party) (Side: WEST)","348 - UK3CB_Factions www.3commandobrigade.com: 3CB NFA (Nogovan Freedom Alliance) (Side: EAST)","349 - UK3CB_Factions www.3commandobrigade.com: 3CB NFA (Nogovan Freedom Alliance) (Side: GUER)","350 - UK3CB_Factions www.3commandobrigade.com: 3CB NFA (Nogovan Freedom Alliance) (Side: WEST)","351 - UK3CB_Factions www.3commandobrigade.com: 3CB Nogova Police Department (Side: EAST)","352 - UK3CB_Factions www.3commandobrigade.com: 3CB Nogova Police Department (Side: GUER)","353 - UK3CB_Factions www.3commandobrigade.com: 3CB Nogova Police Department (Side: WEST)","354 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Civilians (Side: EAST)","355 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Civilians (Side: GUER)","356 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Civilians (Side: WEST)","357 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Insurgents (Side: EAST)","358 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Army (Side: EAST)","359 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Army (Side: GUER)","360 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Army (Side: WEST)","361 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Police (Side: EAST)","362 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Police (Side: GUER)","363 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan National Police (Side: WEST)","364 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Pro-Government Militia (Side: WEST)","365 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Tribal Fighters (Side: GUER)","366 - UK3CB_Factions www.3commandobrigade.com: 3CB UN Peacekeepers (Side: GUER)","367 - UK3CB_Factions www.3commandobrigade.com: 3CB UN Peacekeepers (Side: WEST)","368 - UK3CB_Factions www.3commandobrigade.com: CDF (Air Forces) (Side: GUER)","369 - UK3CB_Factions www.3commandobrigade.com: CDF (Air Forces) (Side: WEST)","370 - UK3CB_Factions www.3commandobrigade.com: CDF (National Guard) (Side: GUER)","371 - UK3CB_Factions www.3commandobrigade.com: CDF (National Guard) (Side: WEST)","372 - UK3CB_Factions www.3commandobrigade.com: ChDKZ (Side: EAST)","373 - UK3CB_Factions www.3commandobrigade.com: ChDKZ (Side: GUER)","374 - UK3CB_Factions www.3commandobrigade.com: Horizon Islands Defence Force (Side: WEST)","375 - UNSUNG Bohemia Interactive: A.R.V.N. (UNSUNG) (Side: GUER)","376 - UNSUNG Bohemia Interactive: Australia (UNSUNG) (Side: WEST)","377 - UNSUNG Bohemia Interactive: New Zealand (UNSUNG) (Side: WEST)","378 - UNSUNG Bohemia Interactive: R.O.K. (UNSUNG) (Side: WEST)","379 - UNSUNG Bohemia Interactive: U.S. (UNSUNG) (Side: WEST)","380 - UNSUNG Bohemia Interactive: V.C. (UNSUNG) (Side: EAST)","381 - UNSUNG Razorback: N.V.A. (UNSUNG) (Side: EAST)","382 - US85 CSLA Studio: US '85 (Desert) (Side: WEST)","383 - VN Savage Game Design: ARVN (Side: GUER)","384 - VN Savage Game Design: Australia (Side: WEST)","385 - VN Savage Game Design: FANK (Side: GUER)","386 - VN Savage Game Design: Khmer Rouge (Side: EAST)","387 - VN Savage Game Design: MACV (Side: WEST)","388 - VN Savage Game Design: New Zealand (Side: WEST)","389 - VN Savage Game Design: Pathet Lao (Side: EAST)","390 - VN Savage Game Design: PAVN (Side: EAST)","391 - VN Savage Game Design: Republic Of Korea (Side: WEST)","392 - VN Savage Game Design: Royal Lao Army (Side: GUER)","393 - VN Savage Game Design: US CIA (Side: WEST)","394 - VN Savage Game Design: US MEDT (Side: WEST)","395 - VN Savage Game Design: Viet Cong (Side: EAST)","396 - vurtual: (B) Ejercito Nacional ALiVE (Side: WEST)","397 - ws Rotators Collective: 2035 Gendarmerie (Side: EAST)","398 - ws Rotators Collective: ION Services (Side: WEST)","399 - ws Rotators Collective: SFIA (Side: EAST)","400 - ws Rotators Collective: Tura (Side: EAST)","401 - ws Rotators Collective: Tura (Side: GUER)","402 - ws Rotators Collective: Tura (Side: WEST)","403 - ws Rotators Collective: US (Desert) (Side: WEST)"};
+ default = 10;
+ };
+ class btc_p_AA { // Anti-Air infantry:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_FAC_EAA"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_tank { // Enemy uses Tank:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_FAC_ETANK"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_civ { // Civil type:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_FAC_CTYPE"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33};
+ texts[]={"0 - AEGIS Bohemia Interactive: Civilians (Livonia) (Side: CIV)","1 - AEGIS Bohemia Interactive: Civilians (Side: CIV)","2 - AEGIS Ravenholme: Civilians (Malden) (Side: CIV)","3 - Bohemia Interactive: Civilians (Altis) (Side: CIV)","4 - Bohemia Interactive: Other (Side: CIV)","5 - CFP Drew: Civilians (Afghanistan) (Side: CIV)","6 - CFP Drew: Civilians (African Christian) (Side: CIV)","7 - CFP Drew: Civilians (African Islamic) (Side: CIV)","8 - CFP Drew: Civilians (Asian) (Side: CIV)","9 - CFP Drew: Civilians (Chernarus Winter) (Side: CIV)","10 - CFP Drew: Civilians (Malden) (Side: CIV)","11 - CFP Drew: Civilians (Middle Eastern) (Side: CIV)","12 - CSLA CSLA Studio: Civilians [ÄŒSLA] (Side: CIV)","13 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Chernarus) (Side: CIV)","14 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Sahrani) (Side: CIV)","15 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Takistan) (Side: CIV)","16 - CUP_Vehicles Community Upgrade Project: Civilians (Russian) (Side: CIV)","17 - cwr3_dlc CWR III Modification: Civilians (CWR III) (Side: CIV)","18 - Expansion Ravenholme: Civilians (Horizon Islands) (Side: CIV)","19 - gm Global Mobilization: East Germany (Civilians) (Side: CIV)","20 - gm Global Mobilization: West Germany (Civilians) (Side: CIV)","21 - LIB Reyhard & Joarius: 40s Civilians (Side: CIV)","22 - OPTRE A2S: Civilians (UEG) (Side: CIV)","23 - ORANGE Bohemia Interactive: IDAP (Side: CIV)","24 - RDS_CIV_PACK RDS (BIS A2 Port): Polish (Side: CIV)","25 - RDS_CIV_PACK RDS (BIS A2 Port): Russians (Side: CIV)","26 - SPE Heavy Ordnance Works: [SPE] 40s Civilians (Side: CIV)","27 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilians (Side: CIV)","28 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Civilians (Side: CIV)","29 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Civilians (Side: CIV)","30 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Civilians (Side: CIV)","31 - UNSUNG Bohemia Interactive: Vietnamese (UNSUNG) (Side: CIV)","32 - VN Savage Game Design: Vietnamese (Side: CIV)","33 - ws Rotators Collective: Civilians (Argana) (Side: CIV)"};
+ default = 3;
+ };
+ class btc_p_civ_veh { // Civil vehicle type:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_FAC_CTYPEVEH"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33};
+ texts[]={"0 - AEGIS Bohemia Interactive: Civilians (Livonia) (Side: CIV)","1 - AEGIS Bohemia Interactive: Civilians (Side: CIV)","2 - AEGIS Ravenholme: Civilians (Malden) (Side: CIV)","3 - Bohemia Interactive: Civilians (Altis) (Side: CIV)","4 - Bohemia Interactive: Other (Side: CIV)","5 - CFP Drew: Civilians (Afghanistan) (Side: CIV)","6 - CFP Drew: Civilians (African Christian) (Side: CIV)","7 - CFP Drew: Civilians (African Islamic) (Side: CIV)","8 - CFP Drew: Civilians (Asian) (Side: CIV)","9 - CFP Drew: Civilians (Chernarus Winter) (Side: CIV)","10 - CFP Drew: Civilians (Malden) (Side: CIV)","11 - CFP Drew: Civilians (Middle Eastern) (Side: CIV)","12 - CSLA CSLA Studio: Civilians [ÄŒSLA] (Side: CIV)","13 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Chernarus) (Side: CIV)","14 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Sahrani) (Side: CIV)","15 - CUP_Vehicles $CUP_AUTHOR_STRING: Civilians (Takistan) (Side: CIV)","16 - CUP_Vehicles Community Upgrade Project: Civilians (Russian) (Side: CIV)","17 - cwr3_dlc CWR III Modification: Civilians (CWR III) (Side: CIV)","18 - Expansion Ravenholme: Civilians (Horizon Islands) (Side: CIV)","19 - gm Global Mobilization: East Germany (Civilians) (Side: CIV)","20 - gm Global Mobilization: West Germany (Civilians) (Side: CIV)","21 - LIB Reyhard & Joarius: 40s Civilians (Side: CIV)","22 - OPTRE A2S: Civilians (UEG) (Side: CIV)","23 - ORANGE Bohemia Interactive: IDAP (Side: CIV)","24 - RDS_CIV_PACK RDS (BIS A2 Port): Polish (Side: CIV)","25 - RDS_CIV_PACK RDS (BIS A2 Port): Russians (Side: CIV)","26 - SPE Heavy Ordnance Works: [SPE] 40s Civilians (Side: CIV)","27 - UK3CB_Factions www.3commandobrigade.com: 3CB African Desert Civilians (Side: CIV)","28 - UK3CB_Factions www.3commandobrigade.com: 3CB Chernarus Civilians (Side: CIV)","29 - UK3CB_Factions www.3commandobrigade.com: 3CB Middle East Civilians (Side: CIV)","30 - UK3CB_Factions www.3commandobrigade.com: 3CB Takistan Civilians (Side: CIV)","31 - UNSUNG Bohemia Interactive: Vietnamese (UNSUNG) (Side: CIV)","32 - VN Savage Game Design: Vietnamese (Side: CIV)","33 - ws Rotators Collective: Civilians (Argana) (Side: CIV)"};
+ default = 3;
+ };
+ class btc_p_spawn_title { // << Spawn options >>
+ title = $STR_BTC_HAM_PARAM_SPAWN_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_density_of_occupiedCity { // Density of city occupied:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_ISOCCUPIED_DENSITY"]);
+ values[]={0,10,20,30,40,45,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","45%","50%","60%","70%","80%","90%","100%"};
+ default = 45;
+ };
+ class btc_p_mil_group_ratio { // Enemy density:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_ENEMY_DENSITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 40;
+ };
+ class btc_p_wp_houseDensity { // Density of military in house: (Can't be above 100%)
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_MIL_INHOUSE_DENSITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 50;
+ };
+ class btc_p_mil_static_group_ratio { // Enemy static density:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_ENEMY_STATIC_DENSITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 30;
+ };
+ class btc_p_civ_group_ratio { // Civilian density:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_CIVILIAN_DENSITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 50;
+ };
+ class btc_p_animals_group_ratio { // Animal density:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_ANIMALS_DENSITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 100;
+ };
+ class btc_p_veh_armed_ho { // Add armed vehicles in Hideout:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPAWN_ARMEDHIDEOUT"]);
+ values[] = {0,1};
+ texts[] = {$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_veh_armed_spawn_more { // Add armed vehicles in Side mission/Cache:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPAWN_ARMEDOTHER"]);
+ values[] = {0,1};
+ texts[] = {$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_patrol_max { // Maximum number of military patrol:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_PATROL_MAX"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"1","2","3","4","5","6","7","8","9","10"};
+ default = 9;
+ };
+ class btc_p_civ_max_veh { // Maximum number of civilian patrol:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_SPWAN_CIV_MAX_VEH"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ texts[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
+ default = 10;
+ };
+ class btc_p_IED_title { // << IED options >>
+ title = $STR_BTC_HAM_PARAM_IED_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_ied { // IEDs ratio:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_IED_RATIO"]);
+ values[]={0, 1, 2, 3};
+ texts[]={$STR_DISABLED,$STR_A3_TIME_TRIALS_MISCTT_ROF_25,$STR_3DEN_ATTRIBUTES_SPEEDMODE_NORMAL,$STR_A3_TIME_TRIALS_MISCTT_ROF_21}; //texts[]={"Off","Low","Normal","High"};
+ default = 2;
+ };
+ class btc_p_ied_spot { // IEDs spotting difficulty:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_IED_SPOT"]);
+ values[]={0, 1, 2};
+ texts[]={$STR_BTC_HAM_PARAM_IED_SPOT_VERYEASY,$STR_BTC_HAM_PARAM_IED_SPOT_EASY,$STR_3DEN_ATTRIBUTES_SPEEDMODE_NORMAL}; //texts[]={"Very easy","Easy","Normal"};
+ default = 2;
+ };
+ class btc_p_ied_placement { // IEDs type of placement:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_IED_PLACEMENT"]);
+ values[]={2, -1, 3};
+ texts[]={$STR_BTC_HAM_PARAM_IED_PLACEMENT_ROADSIDE,$STR_BTC_HAM_PARAM_IED_PLACEMENT_MIDDLE,$STR_3DEN_ATTRIBUTES_OBJECTTEXTURE_RANDOM_TEXT}; //texts[]={"Roadside", "Middle", "Random"};
+ default = 3;
+ };
+ class btc_p_ied_power { // Power of IED explosion:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_IED_POWER"]);
+ values[]={0, 1};
+ texts[]={$STR_MEDIUM,$STR_SMALL};
+ default = 0;
+ };
+ class btc_p_ied_drone { // Drone bomber:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_IED_DRONE"]);
+ values[]={0, 1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_hideout_cache_title { // << Hideout/Cache options >>
+ title = $STR_BTC_HAM_PARAM_HIDE_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_hideout_n { // Hideout numbers:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_HIDE_NUMBERS"]);
+ values[]={99,0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={$STR_3DEN_ATTRIBUTES_OBJECTTEXTURE_RANDOM_TEXT,"0","1","2","3","4","5","6","7","8","9","10"}; //texts[]={"Random","0","1","2","3","4","5"};
+ default = 5;
+ };
+ class btc_p_cache_info_def { // Info cache distance:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_CACHE_DISTANCE"]);
+ values[]={500,1000,1500,2000,2500,3000,3500,4000,5000};
+ texts[]={"500 m","1000 m","1500 m","2000 m","2500 m","3000 m","3500 m","4000 m","5000 m"};
+ default = 1000;
+ };
+ class btc_p_cache_info_ratio { //Cache info ratio:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_CACHE_RATIO"]);
+ values[]={50,100};
+ texts[]={"50 m","100 m"};
+ default = 100;
+ };
+ class btc_p_info_chance { // Intel from dead bodies chance:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_CACHE_DEADINFO"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"100 %","90 %","80 %","70 %","60 %","50 %","40 %","30 %","20 %","10 %","0 %"};
+ default = 70;
+ };
+ class btc_p_info_houseDensity { // Density of intel in house:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_CACHE_HOUSEINFO"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","1%","2%","3%","4%","5%","6%","7%","8%","9%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 5;
+ };
+ class btc_p_skill_title { // << A3 Skill options >>
+ title = $STR_BTC_HAM_PARAM_SKILL_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_set_skill { // Set skill?
+ title = __EVAL(format [" %1?", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_set_skill_general { // Set skill, general
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_3DEN_SCENARIO_TEXTSINGULAR"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 0;
+ };
+ class btc_p_set_skill_aimingAccuracy { // Set skill, aimingAccuracy
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_AIMACC"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 1;
+ };
+ class btc_p_set_skill_aimingShake { // Set skill, aimingShake
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_AIMSKILL"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 4;
+ };
+ class btc_p_set_skill_aimingSpeed { // Set skill, aimingSpeed
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_AIMSPEED"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 3;
+ };
+ class btc_p_set_skill_endurance { // Set skill, endurance
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_A3_VR_STAMINA"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 5;
+ };
+ class btc_p_set_skill_spotDistance { // Set skill, spotDistance
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_SPOTDIST"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 9;
+ };
+ class btc_p_set_skill_spotTime { // Set skill, spotTime
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_SPOTTIME"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 7;
+ };
+ class btc_p_set_skill_courage { // Set skill, courage
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_COURAGE"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 2;
+ };
+ class btc_p_set_skill_reloadSpeed { // Set skill, reloadSpeed
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_BTC_HAM_PARAM_SKILL_RELOAD"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 10;
+ };
+ class btc_p_set_skill_commanding { // Set skill, commanding
+ title = __EVAL(format [" %1, %2", localize "STR_A3_CFGVEHICLES_MODULESKILL_F_0", localize "STR_A3_CFGHINTS0"]);
+ values[]={0,1,2,3,4,5,6,7,8,9,10};
+ texts[]={"0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"};
+ default = 7;
+ };
+ class btc_p_gameplay_title { // << Gameplay options >>
+ title = $STR_BTC_HAM_PARAM_GAMEPLAY_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_sea { // Extend battlefield to sea:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_GAMEPLAY_SEA"]);
+ values[] = {0,1};
+ texts[] = {$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_chem_sides { // Toggle chemical side missions:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_GAMEPLAY_CHEM_SIDES"]);
+ values[] = {0,1};
+ texts[] = {$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_chem_cache_probability { // Chemical weapon cache probability:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_GAMEPLAY_CHEM_CACHE_PROBABILITY"]);
+ values[]={0,10,20,30,40,50,60,70,80,90,100};
+ texts[]={"0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%"};
+ default = 50;
+ };
+ class btc_p_spect { // Spectrum devices
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_GAMEPLAY_SPECT"]);
+ values[] = {0,1};
+ texts[] = {$STR_DISABLED,$STR_ENABLED};
+ default = 1;
+ };
+ class btc_p_side_mission_cycle { // Side mission cycle:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_GAMEPLAY_SIDEM"]);
+ values[] = {0,1,2,3,4};
+ texts[] = {$STR_DISABLED,1,2,3,4};
+ default = 0;
+ };
+ class btc_p_arsenal_title { // << Arsenal options >>
+ title = $STR_BTC_HAM_PARAM_ARSENAL_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_arsenal_Type { // Type of the arsenal:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE"]);
+ values[]={0,1,2,3,4};
+ texts[]={$STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE_BIS,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE_BA,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE_BA_PLUS,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE_ACE,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALTYPE_ACE_PLUS}; //texts[]={"BIS - Vanilla","BIS - Vanilla and ACE 3","BIS - Vanilla and ACE 3 (scroll wheel action)","ACE 3","ACE 3 (scroll wheel action)"};
+ default = 4;
+ };
+ class btc_p_arsenal_Restrict { // Restricted arsenal (See /define_mod.sqf):
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_ARSENAL_ARSENALRESTR"]);
+ values[]={0,1,2,3};
+ texts[] = {$STR_DISABLED,$STR_3DEN_ATTRIBUTES_SPEEDMODE_FULL,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALRESTR_REMOVEONLY,$STR_BTC_HAM_PARAM_ARSENAL_ARSENALRESTR_FILTER}; //texts[]={"Off","Full","Remove only (works only with ACE3-Arsenal)","Filter on player role (works only with ACE3-Arsenal)"};
+ default = 3;
+ };
+ class btc_p_autoloadout { // loadout:
+ title = __EVAL(format [" %1:", localize "STR_ACE_Interaction_Equipment"]);
+ values[]={0,1,2};
+ texts[]={$STR_DISABLED,$STR_BTC_HAM_PARAM_ARSENAL_AUTOLOADOUT, $STR_BTC_HAM_PARAM_ARSENAL_RMVWEAPONS};
+ default = 1;
+ };
+ class btc_p_garage { // Activate garage for admin:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_ARSENAL_GARAGEADMIN"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_main_title { // << Other options >>
+ title = $STR_BTC_HAM_PARAM_OTHER_TITLE;
+ values[]={0};
+ texts[]={""};
+ default = 0;
+ };
+ class btc_p_rep { // Reputation at start:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_REPSTART"]);
+ values[]={0, 200, 500, 750};
+ texts[]={$STR_ACE_ViewDistance_object_verylow,$STR_A3_TIME_TRIALS_MISCTT_ROF_25,$STR_3DEN_ATTRIBUTES_SPEEDMODE_NORMAL,$STR_A3_TIME_TRIALS_MISCTT_ROF_21}; //texts[]={"Very Low","Low","Normal","High"};
+ default = 200;
+ };
+ class btc_p_rep_notify { // Show reputation change above of:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_SHOWREP"]);
+ values[]={-1, 0, 1, 2, 3, 5, 10, 25, 50, 100, 200};
+ texts[]={$STR_DISABLED, 0, 1, 2, 3, 5, 10, 25, 50, 100, 200};
+ default = 3;
+ };
+ class btc_p_city_radiusOffset { // Spawn city radius offset:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_SPAWNRAD"]);
+ values[]={0,1,2,3,4,5,6,7,8};
+ texts[]={"0 m","100 m","200 m",$STR_BTC_HAM_PARAM_OTHER_SPAWNRAD_DEF,"400 m","500 m (Takistan)","600 m","700 m","800 m"}; // texts[]={"0 m","100 m","200 m","300 m","400 m","500 m (Takistan)","600 m","700 m","800 m"};
+ default = 3;
+ };
+ class btc_p_trigger { // Disable city activation when a plane or helicopter (>190Km/h) is flying above:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_DISABLESPAWN"]);
+ values[]={0,1};
+ texts[]={$STR_DISABLED,$STR_ENABLED};
+ default = 0;
+ };
+ class btc_p_city_free_trigger { // City will be free if number of enemies is equal or lower than:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_CITYFREE"]);
+ values[]={0,1,2,3};
+ texts[]={$STR_DISABLED,"1","2","3"};
+ default = 0;
+ };
+ class btc_p_flag { // Allow the use of flag:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_ALLOWFLAG"]);
+ values[]={0,1,2,3};
+ texts[]={$STR_DISABLED,$STR_BTC_HAM_PARAM_OTHER_FLAGVEH,$STR_BTC_HAM_PARAM_OTHER_FLAGVEHLEADER,$STR_BTC_HAM_PARAM_OTHER_FLAGVEHPLAYER};
+ default = 1;
+ };
+ class btc_p_debug { // Debug:
+ title = __EVAL(format [" %1", localize "STR_BTC_HAM_PARAM_OTHER_DEBUG"]);
+ values[]={0,1,2};
+ texts[]={$STR_DISABLED,$STR_ENABLED, $STR_BTC_HAM_PARAM_OTHER_DEBUG_LOGONLY}; // texts[]={"Off","On","Log only"};
+ default = 0;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/doc.sqf b/hearts_and_minds.kunduz_valley/core/doc.sqf
new file mode 100644
index 0000000..30c53a3
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/doc.sqf
@@ -0,0 +1,59 @@
+private _mainCategory = localize "str_3den_display3den_menubar_helpdoc_text";
+player createDiarySubject [_mainCategory, _mainCategory, "\A3\ui_f\data\igui\cfg\simpleTasks\types\documents_ca.paa"];
+
+//Headless and Data base
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_HEADLESS_TITLE", localize "STR_BTC_HAM_DOC_HEADLESS_TEXT"]];
+
+//Door locked
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_DOOR_TITLE", localize "STR_BTC_HAM_DOC_DOOR_TEXT"]];
+
+//Chemical warfare
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_CHEMICALWARFARE_TITLE", localize "STR_BTC_HAM_DOC_CHEMICALWARFARE_TEXT"]];
+
+//Spectrum devices
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_SPECTRUMDEVICES_TITLE", localize "STR_BTC_HAM_DOC_SPECTRUMDEVICES_TEXT"]];
+
+//Vehicles
+player createDiaryRecord [_mainCategory, [localize "str_a3_cfghints_command_vehicles1", localize "STR_BTC_HAM_DOC_VEHICLES_TEXT"]];
+
+//Side Mission
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_SIDEMISSION_TITLE", localize "STR_BTC_HAM_DOC_SIDEMISSION_TEXT"]];
+
+//Respawn tickets
+player createDiaryRecord [_mainCategory, [localize "str_a3_cfgvehicles_modulerespawntickets_f", localize "STR_BTC_HAM_DOC_RESPAWN_TEXT"]];
+
+//Respawn position
+player createDiaryRecord [_mainCategory, [localize "str_a3_cfgvehicles_modulerespawnposition_f_0", localize "STR_BTC_HAM_DOC_FOB_TEXT"]];
+
+//Sling loading
+player createDiaryRecord [_mainCategory, [localize "STR_A3_SlingLoad1", localize "STR_BTC_HAM_DOC_SLING_TEXT"]];
+
+//Logistic point
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_MSQM_MRK_LOGPOINT", localize "STR_BTC_HAM_DOC_LOGISTICP_TEXT"]];
+
+//Logistic
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_ACTION_LOC_MAIN", localize "STR_BTC_HAM_DOC_LOGISTIC_TEXT"]];
+
+//Hideout
+player createDiaryRecord [_mainCategory, [localize "str_a3_campaign_b_m03_marker02", localize "STR_BTC_HAM_DOC_HIDEOUT_TEXT"]];
+
+//IED
+player createDiaryRecord [_mainCategory, ["IED", localize "STR_BTC_HAM_DOC_IED_TEXT"]];
+
+//Intel
+player createDiaryRecord [_mainCategory, [localize "str_a3_mdl_category_intel", localize "STR_BTC_HAM_DOC_INTEL_TEXT"]];
+
+//Reputation
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_REPUTATION_TITLE", localize "STR_BTC_HAM_DOC_REPUTATION_TEXT"]];
+
+//Orders
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_ACTION_ORDERS_MAIN", localize "STR_BTC_HAM_DOC_ORDERS_TEXT"]];
+
+//Traffic
+player createDiaryRecord [_mainCategory, [localize "STR_BTC_HAM_DOC_TRAFFIC_TITLE", localize "STR_BTC_HAM_DOC_TRAFFIC_TEXT"]];
+
+//Version
+player createDiaryRecord [_mainCategory, [localize "STR_A3_FM_Welcome4",
+ format (["
Version %1.%2.%3
"] + btc_version)
+ ]
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/ammoUsage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/ammoUsage.sqf
new file mode 100644
index 0000000..c31bcf8
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/ammoUsage.sqf
@@ -0,0 +1,63 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_ammoUsage
+
+Description:
+ Select weapons if:
+ - is a type of item
+ - and has a ammo usage allowed
+
+Parameters:
+ _weapons - Array of weapons. [Array]
+ _itemType_ammo_usageAllowed - Weapons allowed filter: array of item type ("AssaultRifle", "MissileLauncher"...), allowed ammo usage ("128 + 512": ammo against vehicles and armored vehicles). [Array]
+
+Returns:
+ Array of selected weapons
+
+Examples:
+ (begin example)
+ _weapons_selected = [["launch_RPG7_F"], ["MissileLauncher", "256"]] call btc_arsenal_fnc_ammoUsage;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_weapons", ["launch_RPG7_F"], [[]]],
+ ["_itemType_ammo_usageAllowed", ["MissileLauncher", "256"], [[]]]
+];
+_itemType_ammo_usageAllowed params [["_itemType", "MissileLauncher", [""]], ["_ammo_usageAllowed", "", [""]]];
+
+private _cfgWeapons = configFile >> "CfgWeapons";
+private _cfgMagazines = configFile >> "CfgMagazines";
+private _cfgAmmo = configFile >> "CfgAmmo";
+
+_weapons select {
+ private _weapon = _x;
+ private _isAllowed = true;
+ if (_ammo_usageAllowed isNotEqualTo "") then {
+ private _magazines = getArray (_cfgWeapons >> _weapon >> "magazines");
+ private _aiAmmoUsage_magazines = _magazines apply {
+ private _ammo = getText (_cfgMagazines >> _x >> "ammo");
+
+ private _aiAmmoUsage = getText (_cfgAmmo >> _ammo >> "aiAmmoUsageFlags");
+ if (_aiAmmoUsage isEqualTo "") then {
+ _aiAmmoUsage = str getNumber (_cfgAmmo >> _ammo >> "aiAmmoUsageFlags");
+ };
+
+ _aiAmmoUsage;
+ };
+
+ if (btc_debug_log) then {
+ if ("" in _aiAmmoUsage_magazines) then {
+ [format ["Weapons: %1 AiAmmoUsage Magazines: %2", _weapon, _aiAmmoUsage_magazines], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ };
+
+ _isAllowed = _ammo_usageAllowed in _aiAmmoUsage_magazines;
+ };
+
+ (_itemType in (_weapon call BIS_fnc_itemType)) && {_isAllowed}
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/data.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/data.sqf
new file mode 100644
index 0000000..cc56381
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/data.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_data
+
+Description:
+ Add virtual weapons to an object (e.g., ammo box) with restriction. Virtual items can be selected in the BIS/ACE3 Arsenal.
+
+Parameters:
+ _box - Object to which items will be added. [Object]
+ _arsenalType - _arsenalType < 3 add BIS Arsenal, _arsenalType > 0 add ACE3 Arsenal. [Number]
+ _arsenalRestrict - 1 to add to Arsenal _arsenalData, other to restrict Arsenal with _arsenalData. [Number]
+ _arsenalData - Array of weapons, magazines and items. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_gear_object, btc_p_arsenal_Type, btc_p_arsenal_Restrict, btc_custom_arsenal] call btc_arsenal_fnc_data;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_box", objNull, [objNull]],
+ ["_arsenalType", 0, [0]],
+ ["_arsenalRestrict", 0, [0]],
+ ["_arsenalData", [], [[]]]
+];
+_arsenalData params [["_weapons", [], [[]]], ["_magazines", [], [[]]], ["_items", [], [[]]], ["_backpacks", [], [[]]]];
+
+//BIS Arsenal
+if (_arsenalType < 3) then {
+ if (_arsenalRestrict isEqualTo 1) then {
+ //add
+ [_box, _weapons, false, false] call BIS_fnc_addVirtualWeaponCargo;
+ [_box, _magazines, false, false] call BIS_fnc_addVirtualMagazineCargo;
+ [_box, _items, false, false] call BIS_fnc_addVirtualItemCargo;
+ [_box, _backpacks, false, false] call BIS_fnc_addVirtualBackpackCargo;
+ };
+
+ // DO NOT WORK FOR BIS ARSENAL
+ if (_arsenalRestrict in [2, 3]) then {
+ //remove
+ [_box, _weapons, false] call BIS_fnc_removeVirtualWeaponCargo;
+ [_box, _magazines, false] call BIS_fnc_removeVirtualMagazineCargo;
+ [_box, _items, false] call BIS_fnc_removeVirtualItemCargo;
+ [_box, _backpacks, false] call BIS_fnc_removeVirtualBackpackCargo;
+ };
+};
+
+//ACE Arsenal
+if (_arsenalType > 0) then {
+ //add
+ if (_arsenalRestrict isEqualTo 1) then {
+ private _aceAdd = [];
+ {_aceAdd append _x;} forEach [_weapons, _magazines, _items, _backpacks];
+ [_box, _aceAdd] call ace_arsenal_fnc_addVirtualItems;
+ };
+
+ //remove
+ if (_arsenalRestrict in [2, 3]) then {
+ private _aceRemove = [];
+ {_aceRemove append _x;} forEach [_weapons, _magazines, _items, _backpacks];
+ [_box, _aceRemove] call ace_arsenal_fnc_removeVirtualItems;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/garage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/garage.sqf
new file mode 100644
index 0000000..38d0b48
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/garage.sqf
@@ -0,0 +1,61 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_garage
+
+Description:
+ Open virtual Arsenal garage on object position.
+
+Parameters:
+ _current_garage - Object where the vehicle from garage will spawn. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_create_object_point] spawn btc_arsenal_fnc_garage;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_current_garage", objNull, [objNull]]
+];
+
+if ([_current_garage] call btc_fnc_checkArea) exitWith {};
+
+disableSerialization;
+uiNamespace setVariable ["current_garage", _current_garage];
+private _fullVersion = missionNamespace getVariable ["BIS_fnc_arsenal_fullGarage", false];
+if !(isNull (uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull])) exitwith {
+ "Garage Viewer is already running" call bis_fnc_logFormat;
+};
+private _veh = createVehicle ["Land_HelipadEmpty_F", getPos _current_garage, [], 0, "CAN_COLLIDE"];
+_veh setPosASL getPosASL _current_garage;
+uiNamespace setVariable ["garage_pad", _veh];
+missionNamespace setVariable ["BIS_fnc_arsenal_fullGarage", [true, 0, false, [false]] call BIS_fnc_param];
+with missionNamespace do {BIS_fnc_garage_center = _veh};
+
+with uiNamespace do {
+ private _displayMission = [] call (uiNamespace getVariable "bis_fnc_displayMission");
+ if !(isNull findDisplay 312) then {_displayMission = findDisplay 312;};
+ _displayMission createDisplay "RscDisplayGarage";
+ uiNamespace setVariable ["running_garage", true];
+ waitUntil {sleep 0.25; isNull (uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull])};
+ private _logistic_point = uiNamespace getVariable "current_garage";
+ private _pad = uiNamespace getVariable "garage_pad";
+ deleteVehicle _pad;
+ private _veh_list = _logistic_point nearEntities 5;
+ {
+ private _type = typeOf _x;
+ private _pos = getPosASL _x;
+ private _dir = getDir _current_garage;
+ private _customization = [_x] call BIS_fnc_getVehicleCustomization;
+
+ _x call CBA_fnc_deleteEntity;
+ [_type, _pos, _dir, _customization] remoteExecCall ["btc_log_fnc_createVehicle", 2];
+ [_type] remoteExecCall ["btc_veh_fnc_init", -2];
+ } forEach _veh_list;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/loadout.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/loadout.sqf
new file mode 100644
index 0000000..5b26b9d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/loadout.sqf
@@ -0,0 +1,228 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_loadout
+
+Description:
+ Generate a loadout from an array of defined loadout depending on trait, medical level, color and hour of the day.
+
+Parameters:
+ _type - Type of loadout: 0 - Rifleman, 1 - Medic, 2 - Repair, 3 - Engineer, 4 - Anti-Tank, 5 - Anti Air, 6 - Sniper, 7 - Machine gunner, 8 - CBRN, 9 - Drone hacker. [Number]
+ _color - Color of skin loadout: 0 - Desert, 1 - Tropic, 2 - Black, 3 - Forest. [Number]
+ _isDay - Select night (false) or day (true) loadout. [Boolean]
+ _medicalParameters - Select the correct medical stuff depends on ACE3 medical parameters. [Array]
+ _arsenal_loadout - Array of defined loadout. [Array]
+
+Returns:
+ Loadout array.
+
+Examples:
+ (begin example)
+ _rifleman_loadout = [0] call btc_arsenal_fnc_loadout;
+ (end)
+ (begin example)
+ [] spawn {
+ {
+ private _i = _x;
+ {
+ private _j = _x;
+ {
+ player setUnitLoadout ([_i, _j, _x] call btc_arsenal_fnc_loadout);
+ sleep 1;
+ } forEach [false,true];
+ } forEach [0,1,2,3];
+ } forEach [0,1,2,3,4,5,6,7,8,9];
+ };
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_type", 0, [0]],
+ ["_color", -1, [0]],
+ ["_isDay", 0, [0, false]],
+ ["_medicalParameters", [ace_medical_treatment_advancedBandages, ace_medical_treatment_locationEpinephrine, ace_medical_treatment_locationSurgicalKit, ace_medical_treatment_locationPAK, ace_medical_fractures], [[]]],
+ ["_arsenal_loadout", btc_arsenal_loadout, [[]]]
+];
+
+if (_color < 0) then {
+ _color = if (sunOrMoon isEqualTo 0) then {
+ 2
+ } else {
+ switch (true) do {
+ case (worldName in ["Tanoa", "lingor3"]): {
+ 1
+ };
+ case (worldName in ["chernarus", "Enoch", "sara", "vt7", "cup_chernarus_A3", "chernarus_summer"]): {
+ 3
+ };
+ default {
+ 0
+ };
+ };
+ }
+};
+
+(_arsenal_loadout apply {_x select _color}) params ["_uniform", "_uniformCBRN", "_uniformSniper", "_vest", "_helmet", "_hood", "_hoodCBRN", "_laserdesignator", "_night_vision", "_weapon", "_weapon_sniper", "_weapon_machineGunner", "_bipod", "_pistol", "_launcher_AT", "_launcher_AA", "_backpack", "_backpack_big", "_backpackCBRN", "_radio"];
+
+if (_isDay isEqualType 0) then {
+ (date call BIS_fnc_sunriseSunsetTime) params ["_sunrise", "_sunset"];
+ _isDay = (_sunrise < dayTime) && (_sunset > dayTime + 1);
+};
+
+_medicalParameters params ["_advancedBandages", "_epi", "_surgicalKit", "_PAK", "_fractures"];
+
+//Item inside Uniform
+private _cfgPatches = configFile >> "CfgPatches";
+private _cargo_uniform = [["acc_flashlight", 1], ["ACE_EarPlugs", 1], ["ACE_CableTie",5], ["optic_ACO_grn_smg", 1], ["ACE_MapTools", 1], ["ACE_RangeTable_82mm", 1]];
+
+//Tweak uniform medical item depends on medical parameters
+private _medical = [["ACE_fieldDressing", 3], ["ACE_tourniquet", 4], ["ACE_morphine", 3]];
+_medical pushBack (if (_advancedBandages > 0) then {
+ ["ACE_packingBandage", 4]
+} else {
+ ["ACE_fieldDressing", 4]
+});
+_medical pushBack (if (_epi < 4) then {
+ ["ACE_epinephrine", 3]
+} else {
+ ["ACE_morphine", 3]
+});
+if (_fractures > 0) then {
+ _medical pushBack ["ACE_splint", 1];
+};
+_cargo_uniform append _medical;
+
+private _uniform = switch (_type) do {
+ case 6: {
+ _uniformSniper
+ };
+ case 8: {
+ _uniformCBRN
+ };
+ default {
+ _uniform
+ };
+};
+
+private _hood = switch (_type) do {
+ case 8: {
+ _hoodCBRN
+ };
+ default {
+ _hood
+ };
+};
+
+//Choose appropriate weapon/optics depends on _type
+private _array = switch (_type) do {
+ case 6: {
+ [_weapon_sniper, ["ACE_optic_Hamr_2D", "ACE_optic_LRPS_2D"]];
+ };
+ case 7: {
+ [_weapon_machineGunner];
+ };
+ default {
+ [_weapon];
+ };
+};
+_array params ["_weapon", ["_optics", ["ACE_optic_Hamr_2D", "ACE_optic_Arco_2D"], [[]]]];
+private _bipod_item = ["", _bipod] select (_type in [6, 7]);
+
+//Generate magazines and boulets count
+private _cfgWeapons = configFile >> "CfgWeapons";
+private _cfgMagazines = configFile >> "CfgMagazines";
+private _launcher = ["", _launcher_AT] select (_type isEqualTo 4);
+private _launcher = [_launcher, _launcher_AA] select (_type isEqualTo 5);
+([_weapon, _pistol, _launcher] apply {getArray (_cfgWeapons >> _x >> "magazines")}) params ["_weaponMagazines", "_pistolMagazines", "_launcherMagazines"];
+([_weaponMagazines, _pistolMagazines, _launcherMagazines] apply {_x select 0}) params ["_weaponMagazine", "_pistolMagazine", ["_launcherMagazine", ""]];
+([_weaponMagazine, _pistolMagazine, _launcherMagazine] apply {getNumber (_cfgMagazines >> _x >> "count")}) params ["_weaponCount", "_pistolCount", "_launcherCount"];
+
+//Backpack content
+//Tweak backpack medical item depends on medical parameters
+private _backpackMedical = [["ACE_fieldDressing", 10], ["ACE_morphine", 12], ["ACE_bloodIV", 2], ["ACE_bloodIV_250", 2], ["ACE_bloodIV_500", 1]];
+_backpackMedical append (if (_advancedBandages > 0) then {
+ [["ACE_packingBandage", 15], ["ACE_elasticBandage", 10], ["ACE_quikclot", 10]]
+} else {
+ [["ACE_fieldDressing", 10]]
+});
+_backpackMedical pushBack (if (_epi < 4) then {
+ ["ACE_epinephrine", 12]
+} else {
+ ["ACE_morphine", 2]
+});
+if (_surgicalKit < 4) then {
+ _backpackMedical pushBack ["ACE_surgicalKit", 1];
+};
+if (_PAK < 4) then {
+ _backpackMedical pushBack ["ACE_personalAidKit", 1];
+};
+if (_fractures > 0) then {
+ _backpackMedical pushBack ["ACE_splint", 3];
+};
+
+private _cargos = [
+ [],
+ [_backpack, [["SmokeShellGreen", 3, 1], ["SmokeShellPurple", 1, 1]] + _backpackMedical],
+ [_backpack, [["ToolKit", 1], ["ACE_EntrenchingTool", 1], ["ACE_wirecutter", 1]]],
+ [_backpack, [["ACE_DefusalKit", 1], ["ACE_Clacker", 2], ["ACE_SpraypaintRed", 1], ["DemoCharge_Remote_Mag", 2, 1], [["ACE_VMM3", "", "", "", [], [], ""], 1], ["ACE_EntrenchingTool", 1]]],
+ [_backpack, [[_launcherMagazines param [1, _launcherMagazine], 1, _launcherCount], [_launcherMagazine, 1, _launcherCount]]],
+ [_backpack_big, [[_launcherMagazine, 2, _launcherCount]]],
+ [_backpack, [["ACE_Sandbag_empty", 1], ["ACE_Kestrel4500", 1], ["ACE_ATragMX", 1], ["ACE_RangeCard", 1], ["ACE_EntrenchingTool", 1]]],
+ [],
+ [_backpackCBRN, [["G_Respirator_white_F", 5]]],
+ [_backpack, [["muzzle_antenna_02_f", 1], ["muzzle_antenna_01_f", 1], [["hgun_esd_01_F", "", "", "", [], [], ""], 1]]]
+];
+private _binocular_array = [_laserdesignator, "", "", "", ["Laserbatteries", 1], [], ""];
+private _launcher_array = [[_launcher, "", "", "", [_launcherMagazine, _launcherCount], [], ""], []] select (_launcher isEqualTo "");
+private _radio_item = [
+ ["ItemRadio", ""] select (isClass(_cfgPatches >> "acre_main")),
+ _radio
+] select (isClass (_cfgPatches >> "task_force_radio"));
+
+private _loadout = if (_isDay) then {
+ [
+ [_weapon, "", "", _optics select _isDay, [_weaponMagazine, _weaponCount], [], _bipod_item],
+ _launcher_array,
+ [_pistol, "", "", "", [_pistolMagazine, _pistolCount], [], ""],
+ [_uniform, _cargo_uniform],
+ [_vest, [
+ ["SmokeShellGreen", 2, 1],
+ [_weaponMagazine, 7, _weaponCount],
+ ["SmokeShellPurple", 2, 1],
+ ["SmokeShellYellow", 1, 1],
+ [_pistolMagazine, 1, _pistolCount],
+ ["ACE_M84", 1, 1],
+ ["HandGrenade", 3, 1]
+ ]],
+ _cargos select _type, _helmet, _hood, _binocular_array,
+ ["ItemMap", "B_UavTerminal", _radio_item, "ItemCompass", "ChemicalDetector_01_watch_F", ""]
+ ]
+} else {
+ [
+ [_weapon, "muzzle_snds_65_TI_blk_F", "acc_pointer_IR", _optics select _isDay, [_weaponMagazines param [1, _weaponMagazine], _weaponCount], [], _bipod_item],
+ _launcher_array,
+ [_pistol, "", "", "", [_pistolMagazine, _pistolCount], [], ""],
+ [_uniform, _cargo_uniform],
+ [_vest, [
+ ["SmokeShellGreen", 1, 1],
+ ["B_IR_Grenade", 2, 1],
+ [_weaponMagazines param [1, _weaponMagazine], 7, _weaponCount],
+ ["Chemlight_green", 1, 1],
+ ["Chemlight_blue", 1, 1],
+ ["ACE_HandFlare_Green", 1, 1],
+ ["HandGrenade", 3, 1],
+ ["ACE_M84", 1, 1]
+ ]],
+ _cargos select _type, _helmet, _hood, _binocular_array,
+ ["ItemMap", "B_UavTerminal", _radio_item, "ItemCompass", "ChemicalDetector_01_watch_F", _night_vision]
+ ]
+};
+
+if (isClass(_cfgPatches >> "acre_main")) then {
+ (_loadout select 4 select 1) pushBack [_radio, 1];
+};
+
+_loadout
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/trait.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/trait.sqf
new file mode 100644
index 0000000..023d4e6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/trait.sqf
@@ -0,0 +1,59 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_trait
+
+Description:
+ Get trait from an object (e.g. Player) and return the corresponding trait and weapons allowed filter (https://community.bistudio.com/wiki/CfgAmmo_Config_Reference#aiAmmoUsageFlags).
+
+Parameters:
+ _player - Object use to determine the trait and the weapons allowed filter accordingly to the trait. [Object]
+
+Returns:
+ _type_ammoUsageAllowed = trait and array of weapons allowed filter: array of item type ("AssaultRifle", "MissileLauncher"...), allowed ammo usage ("128 + 512": ammo against vehicles and armored vehicles).
+
+Examples:
+ (begin example)
+ _type_ammoUsageAllowed = [player] call btc_arsenal_fnc_trait;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]]
+];
+
+switch (true) do {
+ case (_player getUnitTrait "medic"): {
+ [1, [["AssaultRifle"]]]
+ };
+ case (_player getVariable ["ace_isEngineer", 0] in [1, 2]): {
+ [2, [["AssaultRifle"]]]
+ };
+ case (_player getUnitTrait "explosiveSpecialist"): {
+ [3, [["AssaultRifle"]]]
+ };
+ case ([typeOf _player, ["MissileLauncher", "128 + 512"]] call btc_mil_fnc_ammoUsage): {
+ [4, [["AssaultRifle"], ["RocketLauncher"], ["MissileLauncher", "128 + 512"]]]
+ };
+ case ([typeOf _player, ["MissileLauncher", "256"]] call btc_mil_fnc_ammoUsage): {
+ [5, [["AssaultRifle"], ["MissileLauncher", "256"]]]
+ };
+ case ([typeOf _player, ["SniperRifle"]] call btc_mil_fnc_ammoUsage): {
+ [6, [["SniperRifle"]]]
+ };
+ case ([typeOf _player, ["MachineGun"]] call btc_mil_fnc_ammoUsage): {
+ [7, [["MachineGun"]]]
+ };
+ case ("cbrn" in toLower uniform _player): {
+ [8, [["AssaultRifle"]]]
+ };
+ case (_player getUnitTrait "UAVHacker"): {
+ [9, [["AssaultRifle"]]]
+ };
+ default {
+ [0, [["AssaultRifle"], ["RocketLauncher"]]]
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/arsenal/weaponsfilter.sqf b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/weaponsfilter.sqf
new file mode 100644
index 0000000..ce5d115
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/arsenal/weaponsfilter.sqf
@@ -0,0 +1,57 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_arsenal_fnc_weaponsFilter
+
+Description:
+ Filter weapons allowed with the weapons allowed filter: array of item type ("AssaultRifle", "MissileLauncher"...), allowed ammo usage ("128 + 512": ammo against vehicles and armored vehicles).
+
+Parameters:
+ _itemType_ammo_usageAllowed - Array of weapons allowed filter. [Array]
+ _custom_arsenal - Array of weapons, magazines and items. [Array]
+ _arsenalRestrict - 1 to add allowed weapons to Arsenal _custom_arsenal, other to restrict. [Number]
+ _type_units - Array of enemies type. Use to remove enemies weapons from the allowed weapons. [Array]
+
+Returns:
+ _allowedWeapons - Array of allowed weapons [Array]
+
+Examples:
+ (begin example)
+ _allowedWeapons = [[["AssaultRifle", ""], ["RocketLauncher", ""]]] call btc_arsenal_fnc_weaponsFilter;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_itemType_ammo_usageAllowed", [["AssaultRifle", ""], ["RocketLauncher", ""]], [[]]],
+ ["_custom_arsenal", btc_custom_arsenal, [[]]],
+ ["_arsenalRestrict", btc_p_arsenal_Restrict, [0]],
+ ["_type_units", btc_type_units, [[]]]
+];
+
+private _weapons = ("true" configClasses (configFile >> "CfgWeapons") select {
+ getNumber (_x >> "scope") isEqualTo 2 &&
+ {getNumber (_x >> "type") in [1, 4]}
+}) apply {configName _x};
+
+private _allowedWeapons = [];
+{
+ _allowedWeapons append ([_weapons, _x] call btc_arsenal_fnc_ammoUsage);
+} forEach _itemType_ammo_usageAllowed;
+
+private _cfgVehicles = configFile >> "CfgVehicles";
+private _enemyWeapons = [];
+{
+ _enemyWeapons append getArray (_cfgVehicles >> _x >> "weapons");
+} forEach _type_units;
+_allowedWeapons = _allowedWeapons - _enemyWeapons;
+
+if (_arsenalRestrict isEqualTo 1) then {
+ (_custom_arsenal select 0) append _allowedWeapons;
+} else {
+ (_custom_arsenal select 0) append (_weapons - _allowedWeapons);
+};
+
+_allowedWeapons
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover.sqf
new file mode 100644
index 0000000..7d2ce2a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_bagRecover
+
+Description:
+ Add respawn tickets when a body bag is provided.
+
+Parameters:
+ _logistic - Logistic pad. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ {_x addCuratorEditableObjects [btc_body_deadPlayers, false];} forEach allCurators;
+ [btc_create_object_point] call btc_body_fnc_bagRecover;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_logistic", objNull, [objNull]]
+];
+
+private _array = nearestObjects [_logistic, ["ACE_bodyBagObject", "CAManBase"], 10];
+_array = _array select {
+ _x isKindOf "CAManBase" ||
+ _x isKindOf "ACE_bodyBagObject"
+};
+if (_array isEqualTo []) exitWith {
+ localize "STR_BTC_HAM_O_BODYBAG_NO" call CBA_fnc_notify;
+};
+
+[_array select 0, player] remoteExecCall ["btc_body_fnc_bagRecover_s", 2];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover_s.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover_s.sqf
new file mode 100644
index 0000000..f386214
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/bagRecover_s.sqf
@@ -0,0 +1,91 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_bagRecover_s
+
+Description:
+ Add respawn tickets when a body bag or an alive enemy is provided.
+
+Parameters:
+ _bodyBag - Body bag or alive enemy. [Object]
+ _player - Player interacting. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, player] remoteExecCall ["btc_body_fnc_bagRecover_s", 2];
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_bodyBag", objNull, [objNull]],
+ ["_player", objNull, [objNull]]
+];
+
+private _ticket = 0;
+private _UID = _bodyBag getVariable ["btc_UID", ""];
+private _players = [];
+if (_UID isEqualTo "") then {
+ if (
+ alive _bodyBag &&
+ _bodyBag isKindOf "CAManBase" &&
+ side group _bodyBag isEqualTo btc_enemy_side
+ ) then {
+ _ticket = btc_body_prisonerTicket;
+
+ switch (btc_p_respawn_ticketsFromPrisoners) do {
+ case 1 : {
+ _players = allPlayers select {side group _x isEqualTo btc_player_side};
+ };
+ case 2 : {
+ _players = [_player];
+ };
+ case 3 : {
+ _players = allPlayers select {side group _x isEqualTo btc_player_side};
+ private _index = _players findIf {[_x] call BIS_fnc_respawnTickets isEqualTo 0};
+ if (_index isEqualTo -1) then {
+ _players = [];
+ } else {
+ _players = [_players select _index];
+ };
+ };
+ case 4 : {
+ _players = allPlayers select {side group _x isEqualTo btc_player_side};
+ private _tickets = _players apply {[[_x] call BIS_fnc_respawnTickets, _x]};
+ _tickets sort true;
+ _players = [_tickets select 0 select 1];
+ };
+ default {};
+ };
+ };
+} else {
+ _ticket = btc_body_bagTicketPlayer;
+};
+
+if (_ticket isEqualTo 0) exitWith {
+ [23] remoteExecCall ["btc_fnc_show_hint", remoteExecutedOwner];
+};
+if (_UID isEqualTo "" && _players isEqualTo []) exitWith {
+ [25] remoteExecCall ["btc_fnc_show_hint", remoteExecutedOwner];
+};
+[22] remoteExecCall ["btc_fnc_show_hint", remoteExecutedOwner];
+
+if (btc_p_respawn_ticketsShare) then {
+ [btc_player_side, _ticket, btc_player_side] call btc_respawn_fnc_addTicket;
+} else {
+ if (_UID isEqualTo "") then {
+ {
+ [_x, _ticket, getPlayerUID _x] call btc_respawn_fnc_addTicket;
+ } forEach _players;
+ } else {
+ private _player = _UID call BIS_fnc_getUnitByUID;
+ [_player, _ticket, _UID] call btc_respawn_fnc_addTicket;
+ };
+};
+
+deleteMarker (_bodyBag getVariable ["btc_body_deadMarker", ""]);
+_bodyBag call CBA_fnc_deleteEntity;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/create.sqf
new file mode 100644
index 0000000..d952976
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/create.sqf
@@ -0,0 +1,60 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_create
+
+Description:
+ Create dead bodies from a serialized array of bodies.
+
+Parameters:
+ _serializedBodies - Serialized bodies. [Array]
+
+Returns:
+ _bodies - Bodies. [Array]
+
+Examples:
+ (begin example)
+ [] call btc_body_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_serializedBodies", [], [[]]]
+];
+
+private _group = createGroup btc_player_side;
+_bodies = _serializedBodies apply {
+ _x params ["_type", "_pos", "_dir", "_loadout", "_dogtag", "_isContaminated",
+ ["_flagTexture", "", [""]]
+ ];
+ private _body = _group createUnit [_type, ASLToAGL _pos, [], 0, "CAN_COLLIDE"];
+ _body setUnitLoadout _loadout;
+ [_body, _dogtag] call btc_body_fnc_dogtagSet;
+
+ if (_isContaminated) then {
+ if ((btc_chem_contaminated pushBackUnique _body) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+ };
+ _body setDamage 1;
+ _body setVariable ["btc_dont_delete", true];
+ _body forceFlagTexture _flagTexture;
+
+ [{
+ params ["_body", "_dir", "_pos"];
+ _body setDir _dir;
+ _body setPosASL _pos;
+ }, [_body, _dir, _pos], 3] call CBA_fnc_waitAndExecute;
+
+ if (btc_p_body_timeBeforeShowMarker >= 0) then {
+ _body call btc_body_fnc_createMarker;
+ };
+
+ _body
+};
+deleteGroup _group;
+
+_bodies
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/createMarker.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/createMarker.sqf
new file mode 100644
index 0000000..169b38d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/createMarker.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_createMarker
+
+Description:
+ Create a KIA marker on dead body.
+
+Parameters:
+ _deadBody - Dead body. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_body_fnc_createMarker;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+if (isNull _unit) exitwith {};
+
+private _marker = createMarker [
+ format ["btc_body_dead_%1", {"btc_body_dead" in _x} count allMapMarkers],
+ _unit
+];
+_marker setMarkerType "KIA";
+_marker setMarkerSize [0.5, 0.5];
+_marker setMarkerAlpha 0.5;
+_unit setVariable ["btc_body_deadMarker", _marker];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagGet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagGet.sqf
new file mode 100644
index 0000000..4a11a65
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagGet.sqf
@@ -0,0 +1,31 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_dogtagGet
+
+Description:
+ Get ACE dogtag data and player UID.
+
+Parameters:
+ _deadBody - Dead body or body bag. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_body_fnc_dogtagGet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+[
+ _unit call ace_dogtags_fnc_getDogtagData,
+ !isNull (_unit getVariable ["ace_dogtags_dogtagTaken", objNull]),
+ _unit getVariable ["btc_UID", ""]
+]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagSet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagSet.sqf
new file mode 100644
index 0000000..b0eca9c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/dogtagSet.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_dogtagSet
+
+Description:
+ Set ACE dogtag data.
+
+Parameters:
+ _deadBody - Dead body or body bag. [Object]
+ _dogtagDataTaken - Dogtag data and if it has been taken. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_body_fnc_dogtagSet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_deadBody", objNull, [objNull]],
+ ["_dogtagDataTaken", [], [[]]]
+];
+_dogtagDataTaken params [
+ ["_dogtagData", [], [[]]],
+ ["_dogtagTaken", false, [false]],
+ ["_UID", "", [""]]
+];
+
+if (_dogtagData isNotEqualTo []) then {
+ _deadBody setVariable ["ace_dogtags_dogtagData", _dogtagData, true];
+ if (_dogtagTaken) then {
+ _deadBody setVariable ["ace_dogtags_dogtagTaken", _deadBody, true];
+ };
+ _deadBody setVariable ["btc_UID", _UID];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/get.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/get.sqf
new file mode 100644
index 0000000..6c81d32
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/get.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_get
+
+Description:
+ Serialize dead bodies.
+
+Parameters:
+ _bodies - Bodies. [Array]
+
+Returns:
+ _serializedBodies - Serialized bodies. [Array]
+
+Examples:
+ (begin example)
+ [btc_body_deadPlayers] call btc_body_fnc_get;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_bodies", [], [[]]]
+];
+
+private _serializedBodies = (_bodies - [objNull]) apply {[
+ typeOf _x,
+ getPosASL _x,
+ getDir _x,
+ getUnitLoadout _x,
+ _x call btc_body_fnc_dogtagGet,
+ _x in btc_chem_contaminated,
+ getForcedFlagTexture _x
+]};
+
+_serializedBodies
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/body/setBodyBag.sqf b/hearts_and_minds.kunduz_valley/core/fnc/body/setBodyBag.sqf
new file mode 100644
index 0000000..40a14b4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/body/setBodyBag.sqf
@@ -0,0 +1,29 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_body_fnc_setBodyBag
+
+Description:
+ Set bodybag variable from a patient.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_body_fnc_setBodyBag;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_patient", "_bodyBag"];
+
+if (_patient getVariable ["btc_UID", ""] isEqualTo "") exitWith {};
+
+deleteMarker (_patient getVariable ["btc_body_deadMarker", ""]);
+_bodyBag setVariable ["btc_UID", _patient getVariable ["btc_UID", ""]];
+
+[_bodyBag] call btc_log_fnc_init;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/cache/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/cache/create.sqf
new file mode 100644
index 0000000..361aeb5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/cache/create.sqf
@@ -0,0 +1,80 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_cache_fnc_create
+
+Description:
+ Create a cache at btc_cache_pos position.
+
+Parameters:
+ _cache_pos - Position of the cache. [Array]
+ _p_chem - Allow chemical cache. [Boolean]
+ _probabilityChemical - Probability to create a chemical cache. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call {
+ for [{_i=1},{_i<=360},{_i=_i+10}] do {
+ [(allPlayers#0) getpos [10, _i], true, 0.7] call btc_cache_fnc_create;
+ };
+ };
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cache_pos", btc_cache_pos, [[]]],
+ ["_p_chem", btc_p_chem_cache_probability > 0, [true]],
+ ["_probabilityChemical", btc_p_chem_cache_probability, [0]]
+];
+
+private _isChem = false;
+if (_p_chem) then {
+ _isChem = random 1 < _probabilityChemical;
+};
+private _cacheType = selectRandom (btc_cache_type select 0);
+btc_cache_obj = _cacheType createVehicle _cache_pos;
+btc_cache_obj setPosATL _cache_pos;
+btc_cache_obj setDir random 360;
+
+clearWeaponCargoGlobal btc_cache_obj;
+clearItemCargoGlobal btc_cache_obj;
+clearMagazineCargoGlobal btc_cache_obj;
+clearBackpackCargoGlobal btc_cache_obj;
+
+[btc_cache_obj, "HandleDamage", btc_cache_fnc_hd] remoteExecCall ["CBA_fnc_addBISEventHandler", 0, true];
+
+if (_isChem) then {
+ btc_chem_contaminated pushBack btc_cache_obj;
+ publicVariable "btc_chem_contaminated";
+ private _holder = createSimpleObject [selectRandom (btc_cache_type select 1), _cache_pos];
+ [btc_cache_obj, _holder, "TOP", 0.1] call btc_cache_fnc_create_attachto;
+ _holder setVectorDirAndUp [[0, 1, 0], [0, 0, 1]];
+} else {
+ private _pos_type_array = ["TOP", "FRONT", "CORNER_L", "CORNER_R"];
+
+ for "_i" from 1 to (1 + round random 3) do {
+ private _holder = createSimpleObject [selectRandom btc_cache_weapons_type, _cache_pos];
+
+ private _pos_type = selectRandom _pos_type_array;
+ _pos_type_array = _pos_type_array - [_pos_type];
+ [btc_cache_obj, _holder, _pos_type] call btc_cache_fnc_create_attachto;
+ _holder hideSelection ["zasleh", true];
+ };
+};
+
+if (btc_debug_log) then {
+ [format ["ID %1 POS %2", btc_cache_n, _cache_pos], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if (btc_debug) then {
+ [format ["in %1", _cache_pos], __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+ private _marker = createMarker [format ["%1", _cache_pos], _cache_pos];
+ _marker setMarkerType "mil_unknown";
+ _marker setMarkerText format ["Cache %1", btc_cache_n];
+ _marker setMarkerSize [0.8, 0.8];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/cache/create_attachto.sqf b/hearts_and_minds.kunduz_valley/core/fnc/cache/create_attachto.sqf
new file mode 100644
index 0000000..d059a8a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/cache/create_attachto.sqf
@@ -0,0 +1,72 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_cache_fnc_create_attachto
+
+Description:
+ Attach holder to an object at the desired position.
+
+Parameters:
+ _object - Object where holders are attached. [Object]
+ _holder - Object attached to _object [Object]
+ _pos_type - Position ("TOP", "FRONT", "CORNER_L", "CORNER_R") where holder will be attached to object. [String]
+ _offSet - Add verticale offset. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_cache_obj, "groundWeaponHolder" createVehicle btc_cache_obj, "TOP"] call btc_cache_fnc_create_attachto;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]],
+ ["_holder", objNull, [objNull]],
+ ["_pos_type", "", [""]],
+ ["_offSet", 0, [0]]
+];
+
+private _bbr = (boundingBoxReal _object) params ["_p1", "_p2"];
+private _height_box = abs ((_p2 select 2) - (_p1 select 2));
+private _maxWidth_box = abs ((_p2 select 0) - (_p1 select 0));
+private _corner_box = abs ((_p2 select 2) - (_p1 select 2));
+
+private _bbr = (boundingBoxReal _object) params ["_p1", "_p2"];
+private _height_weapon = abs ((_p2 select 2) - (_p1 select 2));
+
+private _y = 0;
+private _p = 0;
+private _r = 0;
+
+switch (_pos_type) do {
+ case "FRONT": {
+ _holder attachTo [_object, [- _maxWidth_box/6, 0, _height_weapon/2 - 0.15]];
+ _y = 90;
+ _p = -10;
+ _r = 90;
+ };
+ case "CORNER_L": {
+ _holder attachTo [_object, [- _maxWidth_box/6.5, _corner_box/2, _height_weapon/2 - 0.15]];
+ _y = -70;
+ _p = 10;
+ _r = 90;
+ };
+ case "CORNER_R": {
+ _holder attachTo [_object, [- _maxWidth_box/6.5, -_corner_box/2, _height_weapon/2 - 0.15]];
+ _y = -110;
+ _p = 10;
+ _r = 90;
+ };
+ default { // TOP
+ _holder attachTo [_object, [0, 0, _height_box/2 + 0.02 + _offSet]];
+ _y = random 180;
+ _p = 90;
+ _r = 0;
+ };
+};
+
+_holder setVectorDirAndUp [[ sin _y * cos _p, cos _y * cos _p, sin _p], [[ sin _r, -sin _p, cos _r * cos _p], -_y] call BIS_fnc_rotateVector2D];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/cache/find_pos.sqf b/hearts_and_minds.kunduz_valley/core/fnc/cache/find_pos.sqf
new file mode 100644
index 0000000..4c0a249
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/cache/find_pos.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_cache_fnc_find_pos
+
+Description:
+ Find a house in a city and spawn in it an ammo cache.
+
+Parameters:
+ _city_all - Array of cities where the ammo cache can be spawn. [Array]
+
+Returns:
+ - Position of the cache. [Array]
+
+Examples:
+ (begin example)
+ [] call btc_cache_fnc_find_pos;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city_all", values btc_city_all, [[]]]
+];
+
+private _useful = _city_all select {_x getVariable ["occupied", false] && {!(_x getVariable ["type", ""] in ["NameLocal", "Hill", "NameMarine"])}};
+
+if (_useful isEqualTo []) then {_useful = _city_all;};
+
+private _city = selectRandom _useful;
+
+if (_city getVariable ["type", ""] in ["NameLocal", "Hill", "NameMarine"]) exitWith {
+ [] call btc_cache_fnc_find_pos;
+};
+
+private _cachingRadius = _city getVariable ["cachingRadius", 200];
+private _houses = ([getPos _city, _cachingRadius/2] call btc_fnc_getHouses) select 0;
+
+if (_houses isEqualTo []) then {
+ [] call btc_cache_fnc_find_pos
+} else {
+ ASLToATL AGLToASL selectRandom (selectRandom _houses buildingPos -1)
+}
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/cache/hd.sqf b/hearts_and_minds.kunduz_valley/core/fnc/cache/hd.sqf
new file mode 100644
index 0000000..444a998
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/cache/hd.sqf
@@ -0,0 +1,82 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_cache_fnc_hd
+
+Description:
+ Destroy an ammo cache only when an explposive with damage > 0.6 is used.
+
+Parameters:
+ _cache - Object to destroy. [Object]
+ _part - Not use. [String]
+ _damage - Amount of damage get by the object. [Number]
+ _injurer - Not use. [Object]
+ _ammo - Type of ammo use to make damage. [String]
+ _hitIndex - Hit part index of the hit point, -1 otherwise. [Number]
+ _instigator - Person who pulled the trigger. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_cache_fnc_hd;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cache", objNull, [objNull]],
+ ["_part", "", [""]],
+ ["_damage", 0, [0]],
+ ["_injurer", objNull, [objNull]],
+ ["_ammo", "", [""]],
+ ["_hitIndex", 0, [0]],
+ ["_instigator", objNull, [objNull]]
+];
+
+private _explosive = getNumber (configFile >> "cfgAmmo" >> _ammo >> "explosive") > 0;
+
+if (
+ !(_cache getVariable ["btc_cache_fnc_hd_fired", false]) &&
+ {_explosive} &&
+ {_damage > 0.6}
+) then {
+ _cache setVariable ["btc_cache_fnc_hd_fired", true];
+
+ if (!isServer) exitWith {
+ _this remoteExecCall ["btc_cache_fnc_hd", 2];
+ };
+
+ //Effects
+ private _pos = getPosATL btc_cache_obj;
+ "Bo_GBU12_LGB_MI10" createVehicle _pos;
+ [{
+ "M_PG_AT" createVehicle _this;
+ [{
+ "M_PG_AT" createVehicle _this;
+ }, _this, random [0.5, 2, 3]] call CBA_fnc_waitAndExecute;
+ }, _pos, random [0.5, 2, 3]] call CBA_fnc_waitAndExecute;
+ [_pos] call btc_deaf_fnc_earringing;
+ [attachedObjects _cache, btc_cache_obj, btc_cache_markers] call CBA_fnc_deleteEntity;
+
+ private _marker = createMarker [format ["btc_cache_%1", btc_cache_n], btc_cache_pos];
+ _marker setMarkerType "hd_destroy";
+ [_marker, "STR_BTC_HAM_O_EH_HDCACHE_MRK", btc_cache_n] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker]; //Cache %1 destroyed
+ _marker setMarkerSize [1, 1];
+ _marker setMarkerColor "ColorRed";
+
+ if (btc_debug_log) then {
+ [format ["DESTROYED: ID %1 POS %2", btc_cache_n, btc_cache_pos], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ [btc_rep_bonus_cache, _instigator] call btc_rep_fnc_change;
+
+ //Notification
+ [0] remoteExecCall ["btc_fnc_show_hint", 0];
+
+ [btc_cache_n + 1, btc_cache_pictures] call btc_cache_fnc_init;
+} else {
+ 0
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/cache/init.sqf b/hearts_and_minds.kunduz_valley/core/fnc/cache/init.sqf
new file mode 100644
index 0000000..9b7adb7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/cache/init.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_cache_fnc_init
+
+Description:
+ Initialise the ammo cache system with all necessary variable and start the search of a suitable position for it.
+
+Parameters:
+ _cache_n - Cache number. [Number]
+ _cache_pictures - Array of building type. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [0, btc_cache_pictures] call btc_cache_fnc_init;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cache_n", 0, [0]],
+ ["_cache_pictures", [[], [], []], [[]]]
+];
+
+btc_cache_n = _cache_n;
+btc_cache_obj = objNull;
+btc_cache_markers = [];
+{
+ remoteExecCall ["", _x];
+} forEach (_cache_pictures select 2);
+btc_cache_pictures = [[], [], []];
+btc_cache_info = btc_info_cache_def;
+btc_cache_pos = [values btc_city_all] call btc_cache_fnc_find_pos;
+[btc_cache_pos] call btc_cache_fnc_create;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/biopsy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/biopsy.sqf
new file mode 100644
index 0000000..ab897ed
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/biopsy.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_biopsy
+
+Description:
+ Do a biopsy to determine if the object is contaminated.
+
+Parameters:
+ _data - Data collected. [Array]
+ _success - Does the biopsy has been correctly done. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [[player, "head", 50], true] call btc_chem_fnc_biopsy;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_data", [], [[]]],
+ ["_success", false, [true]]
+];
+
+if !(_success) exitWith {_this};
+
+private _obj = _data select 0;
+([
+ localize "STR_BTC_HAM_O_CHEM_NOTCONTA",
+ localize "STR_BTC_HAM_O_CHEM_CONTA"
+] select (_obj in btc_chem_contaminated)) call CBA_fnc_notify;
+
+_this
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/checkLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/checkLoop.sqf
new file mode 100644
index 0000000..81d8598
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/checkLoop.sqf
@@ -0,0 +1,94 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_checkLoop
+
+Description:
+ Loop over chemical objects, showers and check if player/objects is around. If yes, decontaminate player/objects or set damage to player.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_chem_fnc_checkLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if !(btc_p_chem_sides || (btc_p_chem_cache_probability > 0)) exitWith {};
+
+private _bodyParts = ["head","body","hand_l","hand_r","leg_l","leg_r"];
+
+[{
+ params ["_args", "_id"];
+ _args params ["_contaminated", "_decontaminate", "_range", "_bodyParts", "_cfgGlasses"];
+
+ if (_contaminated isEqualTo []) exitWith {};
+
+ private _allUnitsUAV = [];
+ {
+ _allUnitsUAV append crew _x;
+ } forEach allUnitsUAV;
+ private _units = allUnits - _allUnitsUAV;
+ private _objtToDecontaminate = [];
+ private _unitsContaminated = _contaminated arrayIntersect _units;
+ {
+ (0 boundingBoxReal _x) params ["_p1", "_p2"];
+ private _maxWidth = abs ((_p2 select 0) - (_p1 select 0));
+ private _maxLength = abs ((_p2 select 1) - (_p1 select 1));
+ private _maxHeight = abs ((_p2 select 2) - (_p1 select 2));
+ private _sorted = _contaminated;
+ if (_x isKindOf "DeconShower_01_F") then {
+ _sorted = _unitsContaminated; // Small shower can only decontaminate units
+ };
+ _objtToDecontaminate append (_sorted inAreaArray [ASLToAGL getPosASL _x, _maxWidth/2, _maxLength/2, getDir _x, true, _maxHeight]);
+ } forEach (_decontaminate select {_x animationSourcePhase "valve_source" isEqualTo 1});
+ {
+ if (!(local _x) && {_x in _units}) then {
+ ["btc_chem_decontaminated", [_x], _x] call CBA_fnc_targetEvent;
+ };
+ _contaminated deleteAt (_contaminated find _x);
+ {
+ if (!(local _x) && {_x in _units}) then {
+ ["btc_chem_decontaminated", [_x], _x] call CBA_fnc_targetEvent;
+ };
+ _contaminated deleteAt (_contaminated find _x);
+ {
+ _contaminated deleteAt (_contaminated find _x);
+ } forEach (_x getVariable ["ace_cargo_loaded", []]);
+ } forEach ((_x getVariable ["ace_cargo_loaded", []]) + crew _x);
+ publicVariable "btc_chem_contaminated";
+ } forEach _objtToDecontaminate;
+
+ if (_contaminated isEqualTo []) exitWith {};
+
+ private _unitContaminate = [];
+ private _tempRange = _range;
+ {
+ if (_x in _units) then {
+ _tempRange = _range / 1.5;
+ };
+ _unitContaminate append (_units inAreaArray [ASLToAGL getPosASL _x, _tempRange, _tempRange, 0, false, 2]);
+ } forEach _contaminated;
+
+ if (_unitContaminate isEqualTo []) exitWith {};
+
+ private _periode = 3 / count _unitContaminate;
+ {
+ private _notAlready = _contaminated pushBackUnique _x > -1;
+ if (_notAlready) then {
+ publicVariable "btc_chem_contaminated";
+ };
+ if (local _x) then {
+ [btc_chem_fnc_damage, [_x, _notAlready, _bodyParts, _cfgGlasses], _forEachIndex * _periode] call CBA_fnc_waitAndExecute;
+ } else {
+ if (_notAlready) then {
+ [_x] remoteExecCall ["btc_chem_fnc_damageLoop", _x];
+ };
+ };
+ } forEach _unitContaminate;
+}, 3.1, [btc_chem_contaminated, btc_chem_decontaminate, btc_chem_range, _bodyParts, configFile >> "CfgGlasses"]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/damage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/damage.sqf
new file mode 100644
index 0000000..4a4a3eb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/damage.sqf
@@ -0,0 +1,95 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_damage
+
+Description:
+ Apply chemical damage.
+
+Parameters:
+ _unit - Unit to apply the damage. [Object]
+ _firstDamage - If no CBRN protection, true: Always apply damage, false: Damage are applied randomly. [Boolean]
+ _bodyParts - List of body part. [Array]
+ _cfgGlasses - Glasses config. [Config]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, true, ["head","body","hand_l","hand_r","leg_l","leg_r"], configFile >> "CfgGlasses"] call btc_chem_fnc_damage;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_firstDamage", true, [true]],
+ ["_bodyParts", [], [[]]],
+ ["_cfgGlasses", configNull, [configNull]]
+];
+
+private _googles = goggles _unit;
+private _backpack = backpack _unit;
+private _uniform = toLower uniform _unit;
+private _protection = 0;
+
+if (
+ [
+ "G_Respirator_base_F"
+ ] findIf {_googles isKindOf [_x, _cfgGlasses]} > -1
+) then {
+ _protection = _protection + selectRandom [0.15, 0.3]; // Less protection than respirator
+} else {
+ if (
+ [
+ "G_RegulatorMask_base_F",
+ "G_AirPurifyingRespirator_01_base_F",
+ "GP21_GasmaskPS",
+ "GP5Filter_RaspiratorPS",
+ "GP7_RaspiratorPS",
+ "SE_M17",
+ "Hamster_PS",
+ "SE_S10",
+ "MK502"
+ ] findIf {_googles isKindOf [_x, _cfgGlasses]} > -1
+ ) then {
+ _protection = _protection + 0.3;
+ };
+};
+if (
+ isPlayer _unit &&
+ {_protection isEqualTo 0}
+) then {
+ if (_unit getVariable ["ace_medical_pain", 0] < 0.9) then {
+ [_unit, 0.01] call ace_medical_fnc_adjustPainLevel;
+ };
+};
+if (
+ [
+ "B_SCBA_01_base_F",
+ "B_CombinationUnitRespirator_01_Base_F"
+ ] findIf {_backpack isKindOf _x} > -1
+) then {
+ _protection = _protection + 0.1;
+};
+if (_uniform isNotEqualTo "") then {
+ _protection = _protection + 0.4;
+ if (
+ [
+ "cbrn"
+ ] findIf {_x in _uniform} > -1
+ ) then {
+ _protection = _protection + 0.2;
+ };
+};
+
+if (_protection >= 1) exitWith {_this};
+
+if (_firstDamage || (random 1 > _protection)) then {
+ _this set [1, false];
+ [_unit, random [0.05, 0.05, 0.2], selectRandom _bodyParts, "stab"] call ace_medical_fnc_addDamageToUnit; // ropeburn
+};
+
+_this
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/damageLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/damageLoop.sqf
new file mode 100644
index 0000000..18a8cac
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/damageLoop.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_damageLoop
+
+Description:
+ Apply chemical damage constantly.
+
+Parameters:
+ _unit - Unit to apply the damage. [Object]
+ _notAlready - false if is already contaminated. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_chem_fnc_damageLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", player, [objNull]],
+ ["_notAlready", true, [true]]
+];
+
+private _bodyParts = ["head","body","hand_l","hand_r","leg_l","leg_r"];
+private _handle = [{
+ params ["_args", "_handle"];
+ private _unit = _args select 0;
+
+ if !(alive _unit) exitWith {
+ ["btc_chem_decontaminated", [_unit]] call CBA_fnc_localEvent;
+ };
+ _this set [0, _args call btc_chem_fnc_damage];
+}, 3, [_unit, _notAlready, _bodyParts, configFile >> "CfgGlasses"]] call CBA_fnc_addPerFrameHandler;
+
+["btc_chem_decontaminated", {
+ params ["_unitfromCallEvent"];
+ _thisArgs params ["_handle", "_unit"];
+
+ if (_unitfromCallEvent isEqualTo _unit) then {
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ [_handle] call CBA_fnc_removePerFrameHandler;
+
+ if (btc_debug || btc_debug_log) then {
+ [format ["Stop: %1", _handle], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+ };
+ };
+}, [_handle, _unit]] call CBA_fnc_addEventHandlerArgs;
+
+if (btc_debug || btc_debug_log) then {
+ [format ["Start: %1", _handle], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/ehDetector.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/ehDetector.sqf
new file mode 100644
index 0000000..ca2684c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/ehDetector.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_ehDetector
+
+Description:
+ Trigger the screen update of the chemical detector when it is opened.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_chem_fnc_ehDetector;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+"btc_chem_detector" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false]; //IGUI display on
+
+[{!isNull (findDisplay 46)}, {
+ (findDisplay 46) displayAddEventHandler ["KeyDown", {
+ params ["_display", "_key"];
+
+ if (
+ (_key in actionKeys "Watch" || _key in actionKeys "WatchToggle") &&
+ {!visibleWatch} &&
+ {"ChemicalDetector_01_watch_F" in (assignedItems player)}
+ ) then {
+ private _ui = uiNamespace getVariable "RscWeaponChemicalDetector";
+ private _obj = _ui displayCtrl 101;
+
+ [{visibleWatch}, btc_chem_fnc_updateDetector, [_obj]] call CBA_fnc_waitUntilAndExecute;
+ };
+ }];
+}] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/handleShower.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/handleShower.sqf
new file mode 100644
index 0000000..e96b829
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/handleShower.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_handleShower
+
+Description:
+ Loop over shower and activate or desactivate them if objects are around.
+
+Parameters:
+ _minDistance - Minimal distance of shower triggered. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_chem_fnc_handleShower;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if !(btc_p_chem_sides || (btc_p_chem_cache_probability > 0)) exitWith {};
+
+params [
+ ["_minDistance", 5, [2]]
+];
+
+[{
+ params ["_args", "_id"];
+ _args params ["_shower", "_minDistance"];
+
+ if (_shower isEqualTo []) exitWith {};
+
+ _needActivate = _shower select {
+ _x animationSourcePhase "valve_source" isEqualTo 0 &&
+ {(nearestObjects [_x, ["Car_F", "Man", "Strategic", "Constructions_base_F", "Cargo_base_F"], _minDistance]) isNotEqualTo []}
+ };
+
+ _needDesactivate = _shower select {
+ _x animationSourcePhase "valve_source" > 0 &&
+ {(nearestObjects [_x, ["Car_F", "Man", "Strategic", "Constructions_base_F", "Cargo_base_F"], _minDistance]) isEqualTo []}
+ };
+
+ {
+ if (_x isKindOf "DeconShower_01_F") then {
+ [_x, 1.5, 9] remoteExec ["BIN_fnc_deconShowerAnim", 0, _x];
+ } else {
+ [_x, 5.4, 4, 2, true] remoteExec ["btc_chem_fnc_deconShowerAnimLarge", 0, _x];
+ };
+ } forEach _needActivate;
+ {
+ remoteExecCall ["", _x];
+ [_x] remoteExecCall ["BIN_fnc_deconShowerAnimStop", 0];
+ } forEach _needDesactivate;
+}, 2, [btc_chem_decontaminate, _minDistance]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/propagate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/propagate.sqf
new file mode 100644
index 0000000..51ee18c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/propagate.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_propagate
+
+Description:
+ Propagate from the item or vehicle contaminated to the item or vehicle not contaminated.
+
+Parameters:
+ _item - Item. [Object]
+ _vehicle - Vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, vehicle player] call btc_chem_fnc_propagate;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_item", objNull, [objNull, ""]],
+ ["_vehicle", objNull, [objNull]]
+];
+
+if (_item isEqualType "") exitWith {_this};
+
+if (_item in btc_chem_contaminated) then {
+ if ((btc_chem_contaminated pushBackUnique _vehicle) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+} else {
+ if (_vehicle in btc_chem_contaminated) then {
+ if ((btc_chem_contaminated pushBackUnique _item) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+ };
+};
+
+_this
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/chem/updateDetector.sqf b/hearts_and_minds.kunduz_valley/core/fnc/chem/updateDetector.sqf
new file mode 100644
index 0000000..ae204dd
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/chem/updateDetector.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_chem_fnc_updateDetector
+
+Description:
+ Refresh chemical level on the chemical detector screen when it is open.
+
+Parameters:
+ _objt - Screen control. [Control]
+
+Returns:
+
+Examples:
+ (begin example)
+ private _ui = uiNamespace getVariable "RscWeaponChemicalDetector";
+ private _obj = _ui displayCtrl 101;
+ [_obj] call btc_chem_fnc_updateDetector;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_arguments", "_idPFH"];
+ _arguments params [
+ ["_obj", controlNull, [controlNull]]
+ ];
+
+ if !(visibleWatch) exitWith {
+ [_idPFH] call CBA_fnc_removePerFrameHandler;
+ };
+ if (btc_chem_contaminated isEqualTo []) exitWith {
+ _obj ctrlAnimateModel ["Threat_Level_Source", 0, true];
+ };
+
+ private _level = selectMin (btc_chem_contaminated apply {player distance _x});
+ if (_level < btc_chem_range) then {
+ _level = 1;
+ } else {
+ _level = (floor (btc_chem_range / _level * 10)) / 10;
+ };
+
+ _obj ctrlAnimateModel ["Threat_Level_Source", _level, true]; //Displaying a threat level (value between 0.0 and 1.0)
+}, 0.3, _this] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/activate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/activate.sqf
new file mode 100644
index 0000000..ad2546d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/activate.sqf
@@ -0,0 +1,372 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_activate
+
+Description:
+ Activate the city with the current id passed. This generate IED, random group, populate city with civilian and suicider. It also spawn military patrol and civilian.
+
+Parameters:
+ _city - City will be activating. [Number]
+ _p_mil_group_ratio - Enemy density. [Number]
+ _p_mil_static_group_ratio - Enemy static density. [Number]
+ _p_civ_group_ratio - Civilian density. [Number]
+ _p_animals_group_ratio - Animal density. [Number]
+ _p_civ_max_veh - Maximum number of civilian patrol. [Number]
+ _p_patrol_max - Maximum number of enemy patrol. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_city_fnc_activate;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_p_mil_group_ratio", btc_p_mil_group_ratio, [0]],
+ ["_p_mil_static_group_ratio", btc_p_mil_static_group_ratio, [0]],
+ ["_p_civ_group_ratio", btc_p_civ_group_ratio, [0]],
+ ["_p_animals_group_ratio", btc_p_animals_group_ratio, [0]],
+ ["_p_civ_max_veh", btc_p_civ_max_veh, [0]],
+ ["_p_patrol_max", btc_p_patrol_max, [0]]
+];
+
+if (btc_debug) then {
+ _city setVariable ["serverTime", serverTime];
+};
+
+_city enableSimulation false;
+_city setVariable ["active", true];
+
+private _data_units = _city getVariable ["data_units", []];
+private _data_animals = _city getVariable ["data_animals", []];
+private _type = _city getVariable ["type", ""];
+private _cachingRadius = _city getVariable ["cachingRadius", 100];
+private _has_en = _city getVariable ["occupied", false];
+private _has_ho = _city getVariable ["has_ho", false];
+private _ieds = _city getVariable ["ieds", []];
+private _spawningRadius = _cachingRadius/2;
+
+if (!(_city getVariable ["initialized", false])) then {
+ private _numberOfIED = (switch _type do {
+ case "Hill" : {1};
+ case "VegetationFir" : {1};
+ case "BorderCrossing" : {2};
+ case "NameLocal" : {2.5};
+ case "StrongpointArea" : {3};
+ case "NameVillage" : {3.5};
+ case "NameCity" : {5};
+ case "NameCityCapital" : {6};
+ case "Airport" : {0};
+ case "NameMarine" : {0};
+ default {0};
+ });
+
+ if (_has_en) then {
+ _numberOfIED = _numberOfIED * 1.5;
+ } else {
+ _numberOfIED = _numberOfIED * 0.75;
+ };
+ if (_has_ho) then {
+ _numberOfIED = _numberOfIED * 2;
+ };
+
+ if (btc_debug_log) then {
+ [format ["_numberOfIED %1 - p %2", _numberOfIED, _numberOfIED * btc_p_ied], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ _numberOfIED = _numberOfIED * btc_p_ied / 2;
+ if (_numberOfIED > 0) then {
+ [[_city, _spawningRadius, _numberOfIED + (random _numberOfIED)], btc_ied_fnc_initArea] call btc_delay_fnc_exec;
+ };
+
+ _city setVariable ["initialized", true];
+};
+[_city, btc_ied_fnc_check] call btc_delay_fnc_exec;
+
+private _delay = 0;
+if (_data_units isNotEqualTo []) then {
+ {
+ _delay = _delay + ([_x, _city, _spawningRadius] call btc_data_fnc_spawn_group);
+ } forEach _data_units;
+} else {
+ // Maximum number of enemy group
+ private _numberOfGroup = (switch _type do {
+ case "Hill" : {4};
+ case "VegetationFir" : {4};
+ case "BorderCrossing" : {7};
+ case "NameLocal" : {7};
+ case "StrongpointArea" : {8};
+ case "NameVillage" : {8};
+ case "NameCity" : {16};
+ case "NameCityCapital" : {32};
+ case "Airport" : {32};
+ case "NameMarine" : {4};
+ default {0};
+ });
+
+ if (_has_en) then {
+ private _finalNumberOfGroup = _p_mil_group_ratio * _numberOfGroup;
+ private _numberOfHouseGroup = _finalNumberOfGroup * btc_p_mil_wp_houseDensity;
+ for "_i" from 1 to round _finalNumberOfGroup do {
+ [
+ _city,
+ [_spawningRadius, _spawningRadius/2] select (_i <= _numberOfHouseGroup),
+ 2 + round random 2,
+ [["PATROL", "SENTRY"] selectRandomWeighted [0.7, 0.3], "HOUSE"] select (_i <= _numberOfHouseGroup)
+ ] call btc_mil_fnc_create_group;
+ };
+ };
+
+ if !(_type in ["Hill", "NameMarine"]) then {
+ ([_city, _spawningRadius/2] call btc_city_fnc_getHouses) params ["_housesEntrerable", "_housesNotEntrerable"];
+
+ if (_has_en) then {
+ private _numberOfStatic = (switch _type do {
+ case "VegetationFir" : {3};
+ case "BorderCrossing" : {6};
+ case "NameLocal" : {3};
+ case "StrongpointArea" : {6};
+ case "NameVillage" : {6};
+ case "NameCity" : {12};
+ case "NameCityCapital" : {15};
+ case "Airport" : {6};
+ default {0};
+ });
+ [_housesEntrerable+_housesNotEntrerable, round (_p_mil_static_group_ratio * _numberOfStatic), _city] call btc_mil_fnc_create_staticOnRoof;
+ };
+
+ // Spawn civilians
+ private _numberOfCivi = (switch _type do {
+ case "VegetationFir" : {2};
+ case "BorderCrossing" : {0};
+ case "NameLocal" : {6};
+ case "StrongpointArea" : {0};
+ case "NameVillage" : {12};
+ case "NameCity" : {20};
+ case "NameCityCapital" : {38};
+ case "Airport" : {12};
+ default {4};
+ });
+ [+_housesEntrerable, round (_p_civ_group_ratio * _numberOfCivi), _city] call btc_civ_fnc_populate;
+ };
+};
+if (btc_p_animals_group_ratio > 0) then {
+ if (_data_animals isNotEqualTo []) then {
+ {
+ (_x + [nil, _city]) call btc_delay_fnc_createAgent;
+ } forEach _data_animals;
+ } else {
+ // Spawn animals
+ private _numberOfAnimalsGroup = (switch _type do {
+ case "Hill" : {3};
+ case "VegetationFir" : {3};
+ case "NameLocal" : {3};
+ case "NameVillage" : {2};
+ case "NameCity" : {1};
+ case "NameCityCapital" : {0};
+ case "Airport" : {0};
+ case "NameMarine" : {0};
+ default {0};
+ });
+ for "_i" from 1 to _numberOfAnimalsGroup do {
+ private _pos = [_city, _spawningRadius/3] call CBA_fnc_randPos;
+ for "_i" from 1 to (round random 3) do {
+ [selectRandom btc_animals_type, [_pos, 6] call CBA_fnc_randPos, nil, _city] call btc_delay_fnc_createAgent;
+ };
+ };
+ };
+};
+
+if (_city getVariable ["spawn_more", false]) then {
+ _city setVariable ["spawn_more", false];
+ private _finalNumberOfGroup = _p_mil_group_ratio * 5;
+ private _numberOfHouseGroup = _finalNumberOfGroup * btc_p_mil_wp_houseDensity;
+ for "_i" from 1 to round _finalNumberOfGroup do {
+ [
+ _city,
+ [_spawningRadius, _spawningRadius/2] select (_i <= _numberOfHouseGroup),
+ 4 + round random 3,
+ ["PATROL", "HOUSE"] select (_i <= _numberOfHouseGroup)
+ ] call btc_mil_fnc_create_group;
+ };
+ if (btc_p_veh_armed_spawn_more) then {
+ [[_city, _spawningRadius, 1, btc_type_motorized_armed, 1 + round random 2], btc_city_fnc_send] call btc_delay_fnc_exec;
+ };
+};
+
+if (
+ (btc_cache_pos isNotEqualTo []) &&
+ {_city inArea [btc_cache_pos, _cachingRadius, _cachingRadius, 0, false]}
+) then {
+ if (btc_cache_obj getVariable ["btc_cache_unitsSpawned", false]) then {
+ [[btc_cache_pos, 5], {
+ if (count (btc_cache_pos nearEntities ["Man", 50]) > 3) exitWith {};
+ [btc_cache_pos, 8, 3, "HOUSE"] call btc_mil_fnc_create_group;
+ [btc_cache_pos, 50, 4, "SENTRY"] call btc_mil_fnc_create_group;
+ }] call btc_delay_fnc_exec;
+ } else {
+ btc_cache_obj setVariable ["btc_cache_unitsSpawned", true];
+
+ [btc_cache_pos, 8, 3, "HOUSE"] call btc_mil_fnc_create_group;
+ [btc_cache_pos, 50, 4, "SENTRY"] call btc_mil_fnc_create_group;
+ if (btc_p_veh_armed_spawn_more) then {
+ [[_city, _spawningRadius, 1, btc_type_motorized_armed, 1 + round random 3], btc_city_fnc_send] call btc_delay_fnc_exec;
+ };
+ };
+};
+
+if (_has_ho && {!(_city getVariable ["ho_units_spawned", false])}) then {
+ _city setVariable ["ho_units_spawned", true];
+ [_city, 20, 10 + round (_p_mil_group_ratio * random 6), "SENTRY"] call btc_mil_fnc_create_group;
+ [_city, 120, 1 + round random 2, "SENTRY"] call btc_mil_fnc_create_group;
+ [_city, 120, 1 + round random 2, "SENTRY"] call btc_mil_fnc_create_group;
+ private _random = random 1;
+ private _pos = getPos _city;
+ switch (true) do {
+ case (_random <= 0.3) : {};
+ case (_random > 0.3 && _random <= 0.75) : {
+ private _statics = btc_type_gl + btc_type_mg;
+ [[(_pos select 0) + 7, (_pos select 1) + 7, 0], _statics, 45, [], _city] call btc_mil_fnc_create_static;
+ };
+ case (_random > 0.75) : {
+ private _statics = btc_type_gl + btc_type_mg;
+ [[(_pos select 0) + 7, (_pos select 1) + 7, 0], _statics, 45, [], _city] call btc_mil_fnc_create_static;
+ [[(_pos select 0) - 7, (_pos select 1) - 7, 0], _statics, 225, [], _city] call btc_mil_fnc_create_static;
+ };
+ };
+ if (btc_p_veh_armed_ho) then {
+ [[_city, _spawningRadius, 1, btc_type_motorized_armed, 2 + round random 3], btc_city_fnc_send] call btc_delay_fnc_exec;
+ };
+};
+
+//Suicider
+if !(_city getVariable ["has_suicider", false]) then {
+ if ((time - btc_ied_suic_spawned) > btc_ied_suic_time && {random (btc_rep_level_high + 250) > btc_global_reputation}) then {
+ btc_ied_suic_spawned = time;
+ _city setVariable ["has_suicider", true];
+ if (selectRandom [false, false, btc_p_ied_drone]) then {
+ [[_city, _spawningRadius, getPosATL _city], btc_ied_fnc_drone_create] call btc_delay_fnc_exec;
+ } else {
+ [[_city, _spawningRadius], btc_ied_fnc_suicider_create] call btc_delay_fnc_exec;
+ };
+ _delay = _delay + btc_delay_unit;
+ };
+};
+
+if (_city getVariable ["data_tags", []] isEqualTo []) then {
+ private _tag_number = (switch _type do {
+ case "Hill" : {1};
+ case "BorderCrossing" : {1};
+ case "NameLocal" : {2.5};
+ case "StrongpointArea" : {3};
+ case "NameVillage" : {3.5};
+ case "NameCity" : {5};
+ case "NameCityCapital" : {6};
+ case "Airport" : {6};
+ case "NameMarine" : {0};
+ default {0};
+ });
+
+ if (_has_en) then {
+ _tag_number = _tag_number * 1.5;
+ };
+ if (_has_ho) then {
+ _tag_number = _tag_number * 2;
+ };
+
+ if (_tag_number > 0) then {
+ [[_city, _spawningRadius, _tag_number / 2 + random _tag_number / 2], btc_tag_fnc_initArea] call btc_delay_fnc_exec;
+ };
+};
+[_city, btc_tag_fnc_create] call btc_delay_fnc_exec;
+
+if (
+ !(_type in ["Hill", "NameMarine"]) &&
+ _city getVariable ["btc_city_housesEntrerable", []] isEqualTo []
+) then {
+ [[_city, _spawningRadius/2], btc_city_fnc_getHouses] call btc_delay_fnc_exec;
+};
+
+[_city, btc_door_fnc_lock] call btc_delay_fnc_exec;
+
+if (btc_p_info_houseDensity > 0) then {
+ [_city, btc_info_fnc_createIntels] call btc_delay_fnc_exec;
+};
+
+private _civKilled = _city getVariable ["btc_rep_civKilled", []];
+if (_civKilled isNotEqualTo []) then {
+ [[_city, _civKilled], btc_civ_fnc_createFlower] call btc_delay_fnc_exec;
+};
+
+private _grave = _city getVariable ["btc_rep_graves", []];
+if (_grave isNotEqualTo []) then {
+ [[_city, _grave], btc_civ_fnc_createGrave] call btc_delay_fnc_exec;
+};
+
+[{
+ params ["_has_en", "_city", "_cachingRadius"];
+
+ if (_has_en) then {
+ private _trigger = createTrigger ["EmptyDetector", _city, false];
+ _trigger setTriggerArea [_cachingRadius, _cachingRadius, 0, false];
+ _trigger setTriggerActivation [str btc_enemy_side, "PRESENT", false];
+ _trigger setTriggerStatements [btc_p_city_free_trigger_condition, "[thisTrigger, thisList] call btc_city_fnc_setClear", ""];
+ _trigger setTriggerInterval 2;
+ _trigger setVariable ["playerTrigger", _city];
+ _city setVariable ["enTrigger", _trigger];
+ };
+
+ _city enableSimulation true;
+}, [_has_en, _city, _cachingRadius], _delay] call btc_delay_fnc_waitAndExecute;
+
+//Patrol
+btc_patrol_active = btc_patrol_active - [grpNull];
+private _numberOfPatrol = count btc_patrol_active;
+if (_numberOfPatrol < _p_patrol_max) then {
+ private _min = [0, 1] select _has_en;
+ private _addMilPatrol = (_min + random 1) min (_p_patrol_max - _numberOfPatrol);
+ for "_i" from 1 to round _addMilPatrol do {
+ private _group = createGroup btc_enemy_side;
+ btc_patrol_active pushBack _group;
+ _group setVariable ["no_cache", true];
+ _group setVariable ["acex_headless_blacklist", true];
+ [[_group, 1 + round random 1, _city, _cachingRadius + btc_patrol_area], btc_mil_fnc_create_patrol] call btc_delay_fnc_exec;
+ };
+};
+//Traffic
+btc_civ_veh_active = btc_civ_veh_active - [grpNull];
+private _numberOfCivVeh = count btc_civ_veh_active;
+if (_numberOfCivVeh < _p_civ_max_veh) then {
+ private _addCivVeh = (random 2) min (_p_civ_max_veh - _numberOfCivVeh);
+ for "_i" from 1 to round _addCivVeh do {
+ private _group = createGroup civilian;
+ btc_civ_veh_active pushBack _group;
+ _group setVariable ["no_cache", true];
+ _group setVariable ["acex_headless_blacklist", true];
+ [[_group, _city, _cachingRadius + btc_patrol_area], btc_civ_fnc_create_patrol] call btc_delay_fnc_exec;
+ };
+};
+
+// https://feedback.bistudio.com/T162941
+private _HCs = entities "HeadlessClient_F";
+if (_HCs isNotEqualTo []) then {
+ private _triggerZSize = (triggerArea _city) select 4;
+ if (_triggerZSize isNotEqualTo -1) then {
+ private _cityPos = getPosASL _city;
+ private _HCPos = _cityPos vectorAdd [0, 0, -(_triggerZSize + 50)];
+ {
+ _x setPosASL _HCPos;
+ } forEach _HCs;
+ };
+};
+
+if (btc_debug || btc_debug_log) then {
+ private _id = _city getVariable "id";
+ [format ["%1 - %2ms", _id, (serverTime - (_city getVariable ["serverTime", serverTime])) * 1000] , __FILE__, [btc_debug, btc_debug_log, true]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/cleanUp.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/cleanUp.sqf
new file mode 100644
index 0000000..fa92034
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/cleanUp.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_cleanUp
+
+Description:
+ Delete all ground weapon holder (in range of 500 m), dead bodies (in range of 500 m) and empty group.
+
+Parameters:
+ _playableUnits - Players connected. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_city_fnc_cleanUp;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_playableUnits", playableUnits, [[]]]
+];
+
+btc_groundWeaponHolder = btc_groundWeaponHolder - [objNull];
+private _toRemove = ((btc_groundWeaponHolder + (entities "WeaponHolderSimulated")) select {!(_x getVariable ["no_cache", false])}) select {
+ private _obj = _x;
+
+ _playableUnits inAreaArray [getPosWorld _obj, 500, 500] isEqualTo []
+};
+
+_toRemove append (allDead select {
+ private _dead = _x;
+
+ (_playableUnits inAreaArray [getPosWorld _dead, 500, 500]) isEqualTo [] && !(_dead getVariable ["btc_dont_delete", false])
+});
+
+_toRemove call CBA_fnc_deleteEntity;
+
+if (btc_delay_time < 0.001) then { // Don't remove group during units creation.
+ (allGroups select {
+ units _x isEqualTo [] &&
+ !(
+ _x in btc_patrol_active ||
+ _x in btc_civ_veh_active
+ )
+ }) call CBA_fnc_deleteEntity;
+};
+
+while {objNull in btc_chem_contaminated} do {
+ btc_chem_contaminated deleteAt (
+ btc_chem_contaminated find objNull
+ )
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/create.sqf
new file mode 100644
index 0000000..9877b16
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/create.sqf
@@ -0,0 +1,63 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_create
+
+Description:
+ Create a city at the desired position with all necessary variable and the trigger to detect player presence.
+
+Parameters:
+ _position - The position where the city will be created. [Array]
+ _type - Type of city. [String]
+ _name - The name of the city. [String]
+ _cachingRadius - The city radius. [Number]
+ _has_en - If the city is occupied by enemies. [Boolean]
+ _id - ID of the city in the cfgworlds. [Number]
+
+Returns:
+ _city - City created [Object]
+
+Examples:
+ (begin example)
+ _city = [[0, 0, 0], "NameCityCapital", "BTC Capital", 500, true] call btc_city_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_position", [0, 0, 0], [[]]],
+ ["_type", "", [""]],
+ ["_name", "", [""]],
+ ["_cachingRadius", 0, [0]],
+ ["_has_en", false, [false]],
+ ["_id", (0 min (selectMin keys btc_city_all)) - 1, [0]]
+];
+
+private _city = createTrigger ["EmptyDetector", [_position select 0, _position select 1, getTerrainHeightASL _position], false];
+
+btc_city_all set [_id, _city];
+_city setVariable ["id", _id];
+
+_city setVariable ["initialized", false];
+_city setVariable ["name", _name];
+_city setVariable ["cachingRadius", _cachingRadius];
+_city setVariable ["active", false];
+_city setVariable ["type", _type];
+_city setVariable ["spawn_more", false];
+_city setVariable ["data_units", []];
+_city setVariable ["data_animals", []];
+_city setVariable ["occupied", _has_en];
+
+if (btc_p_sea) then {
+ _city setVariable ["hasbeach", ((selectBestPlaces [_position, 0.8 * _cachingRadius, "sea", 10, 1]) select 0 select 1) isEqualTo 1];
+};
+
+[{
+ (_this select 0) findEmptyPositionReady (_this select 1)
+}, {}, [_position, [0, _cachingRadius]], 5 * 60] call CBA_fnc_waitUntilAndExecute;
+
+[_city, _cachingRadius] call btc_city_fnc_setPlayerTrigger;
+
+_city
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/de_activate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/de_activate.sqf
new file mode 100644
index 0000000..cf88bf5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/de_activate.sqf
@@ -0,0 +1,117 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_de_activate
+
+Description:
+ Desactivate the city by storing all groups present inside and clean up dead bodies.
+
+Parameters:
+ _city - City to desactivate. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_city_fnc_de_activate;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]]
+];
+
+if !(_city getVariable ["active", false]) exitWith {};
+
+if (btc_debug) then {
+ private _id = _city getVariable "id";
+ [str _id, __FILE__, [btc_debug, btc_debug_log, true]] call btc_debug_fnc_message;
+};
+
+//Save all and delete
+private _cachingRadius = _city getVariable ["cachingRadius", 0];
+private _has_en = _city getVariable ["occupied", false];
+
+if (_has_en) then {
+ private _trigger = _city getVariable ["enTrigger", objNull];
+ deleteVehicle _trigger;
+};
+
+private _pos_city = getPosWorld _city;
+private _data_units = [];
+private _has_suicider = false;
+{
+ if (
+ (leader _x) inArea [_pos_city, _cachingRadius, _cachingRadius, 0, false] &&
+ {side _x != btc_player_side} &&
+ {!(_x getVariable ["no_cache", false])} &&
+ {_x getVariable ["btc_city", _city] in [_city, objNull]}
+ ) then {
+ private _data_group = _x call btc_data_fnc_get_group;
+ _data_units pushBack _data_group;
+
+ if ((_data_group select 0) in [5, 7]) then {_has_suicider = true;};
+ };
+} forEach allGroups;
+
+private _data_animals = [];
+{
+ private _agent = agent _x;
+ if (
+ _agent inArea [_pos_city, _cachingRadius, _cachingRadius, 0, false] &&
+ {alive _agent} &&
+ {!(_x getVariable ["no_cache", false])} &&
+ {_x getVariable ["btc_city", _city] in [_city, objNull]}
+ ) then {
+ _data_animals pushBack [
+ typeOf _agent,
+ getPosATL _agent
+ ];
+ _agent call CBA_fnc_deleteEntity;
+ };
+} forEach agents;
+
+private _data_tags = [];
+{
+ if (_x getVariable ["btc_city", _city] isEqualTo _city) then {
+ private _pos = getPos _x;
+ _pos set [2, 0];
+ _data_tags pushBack [
+ _pos,
+ [vectorDir _x, vectorUp _x],
+ _x getVariable "btc_texture",
+ typeOf _x
+ ];
+ _x call CBA_fnc_deleteEntity;
+ };
+} forEach (btc_tags_server inAreaArray [_pos_city, _cachingRadius, _cachingRadius]);
+btc_tags_server = btc_tags_server - [objNull];
+
+{
+ [_x] call btc_tag_fnc_vehicle;
+} forEach (btc_vehicles inAreaArray [_pos_city, _cachingRadius, _cachingRadius]);
+
+(_city getVariable ["btc_city_intels", []]) call CBA_fnc_deleteEntity;
+
+(_city getVariable ["btc_civ_flowers", []]) call CBA_fnc_deleteEntity;
+
+(_city getVariable ["btc_civ_graves", []]) call CBA_fnc_deleteEntity;
+
+if (btc_debug_log) then {
+ [format ["count data_units = %1", count _data_units], __FILE__, [false]] call btc_debug_fnc_message;
+ [format ["count data_animals = %1", count _data_animals], __FILE__, [false]] call btc_debug_fnc_message;
+ [format ["count data_tags = %1", count _data_tags], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_city setVariable ["has_suicider", _has_suicider];
+_city setVariable ["data_units", _data_units];
+_city setVariable ["data_animals", _data_animals];
+_city setVariable ["data_tags", _data_tags];
+_city setVariable ["active", false];
+
+[] call btc_mil_fnc_check_cap;
+
+[] call btc_city_fnc_cleanUp;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/getHouses.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/getHouses.sqf
new file mode 100644
index 0000000..3eb35c4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/getHouses.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_getHouses
+
+Description:
+ Get random open houses around a position.
+
+Parameters:
+ _city - City to search for houses. [Object]
+ _radius - Radius of search. [Number]
+
+Returns:
+ _houses - Random useful open houses. [Array]
+
+Examples:
+ (begin example)
+ [player] call btc_city_fnc_getHouses;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_radius", 100, [0]]
+];
+
+([_city, _radius] call btc_fnc_getHouses) params ["_housesEntrerable", "_housesNotEntrerable"];
+
+_housesEntrerable = _housesEntrerable call BIS_fnc_arrayShuffle;
+_housesNotEntrerable = _housesNotEntrerable call BIS_fnc_arrayShuffle;
+_city setVariable ["btc_city_housesEntrerable", _housesEntrerable];
+_city setVariable ["btc_city_housesNotEntrerable", _housesNotEntrerable];
+
+[_housesEntrerable, _housesNotEntrerable]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/init.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/init.sqf
new file mode 100644
index 0000000..4bedec2
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/init.sqf
@@ -0,0 +1,86 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_init
+
+Description:
+ Create cities all over the map and store those properties.
+
+Parameters:
+ _density_of_occupiedCity - Density of occupied city. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_city_fnc_init;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_density_of_occupiedCity", btc_p_density_of_occupiedCity, [0]]
+];
+
+private _locations = configfile >> "cfgworlds" >> worldname >> "names";
+
+private _citiesType = ["NameVillage", "NameCity", "NameCityCapital", "NameLocal", "Hill", "Airport", "StrongpointArea", "BorderCrossing", "VegetationFir"];
+if (btc_p_sea) then {_citiesType pushBack "NameMarine";};
+
+btc_city_all = createHashMap;
+for "_id" from 0 to (count _locations - 1) do {
+ private _current = _locations select _id;
+
+ private _type = getText (_current >> "type");
+
+ if (_type in _citiesType) then {
+ private _position = getArray (_current >> "position");
+ if (
+ surfaceIsWater _position &&
+ {_type isNotEqualTo "NameMarine"} &&
+ {getTerrainHeightASL _position < - 1}
+ ) then {
+ private _church = nearestTerrainObjects [_position, ["CHURCH"], 470];
+ if (_church isEqualTo []) then {
+ private _area = 50;
+ for "_i" from 0 to 3 do {
+ private _new_position = [_position, 0, _area, 0.5, 0, -1, 0] call BIS_fnc_findSafePos;
+ if (count _new_position isEqualTo 2) exitWith {
+ _position = _new_position;
+ };
+ _area = _area * 2;
+ };
+ } else {
+ _position = getPos (_church select 0);
+ };
+ };
+ private _name = getText(_current >> "name");
+ private _cachingRadius = getNumber(_current >> "RadiusA") + getNumber(_current >> "RadiusB");
+ _cachingRadius = (_cachingRadius max 160) min 800;
+
+ if (btc_city_blacklist find _name >= 0) exitWith {};
+
+ /*
+ //if you want a safe area
+ if ((getMarkerPos "YOUR_MARKER_AREA") inArea [_position, 500, 500, 0, false]) exitWith {};
+ */
+
+ [_position, _type, _name, _cachingRadius, false, _id] call btc_city_fnc_create;
+ };
+};
+
+private _cities = values btc_city_all;
+[_cities, true] call CBA_fnc_shuffle;
+private _numberOfCity = round ((count _cities) * _density_of_occupiedCity);
+{
+ _x setVariable ["occupied", true];
+ if (btc_debug) then {
+ (format ["loc_%1", _x getVariable "id"]) setMarkerColor "colorRed";
+ };
+} forEach (_cities select [0, _numberOfCity]);
+
+if !(isNil "btc_custom_loc") then {
+ {_x call btc_city_fnc_create;} forEach btc_custom_loc;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/send.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/send.sqf
new file mode 100644
index 0000000..bbed9f4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/send.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_send
+
+Description:
+ Send a group of units to a location then call btc_data_fnc_add_group. If player is around, initiate patrol around the destination, ifnot save in database and delete units.
+
+Parameters:
+ _dest - Destination. [Array, Object]
+ _spawningRadius - Random area for destination. [Number]
+ _typeOf_patrol - Infantry or motorized. [String]
+ _veh_types - Vehicle types for motorized. [String]
+ _sendMultipleGroup - Number of group to send. [Number]
+
+Returns:
+ _group - Created group. [Group]
+
+Examples:
+ (begin example)
+ [allPlayers#0, getPos (allPlayers#0)] call btc_city_fnc_send
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_dest", [0, 0, 0], [[], objNull]],
+ ["_spawningRadius", 0, [0]],
+ ["_typeOf_patrol", 0, [0]],
+ ["_veh_types", [], [[]]],
+ ["_sendMultipleGroup", 1, [1]]
+];
+
+private _closest = [
+ _dest,
+ values btc_city_all select {!(_x getVariable ["active", false])},
+ false
+] call btc_fnc_find_closecity;
+
+for "_i" from 1 to _sendMultipleGroup do {
+ [_closest, [_dest, _spawningRadius / 2] call CBA_fnc_randPos, _typeOf_patrol, selectRandom _veh_types] call btc_mil_fnc_send;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/setClear.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/setClear.sqf
new file mode 100644
index 0000000..edac77c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/setClear.sqf
@@ -0,0 +1,53 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_setClear
+
+Description:
+ Define a city with the corresponding ID as clear (no more occupied).
+
+Parameters:
+ _trigger - Enemy trigger with no more enemy. [Number]
+ _remainEnemyUnits - Remaining enemy units assigned to the city. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_city_fnc_setClear;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_trigger", objNull, [objNull]],
+ ["_remainEnemyUnits", [], [[]]]
+];
+
+private _city = _trigger getVariable "playerTrigger";
+_city setVariable ["occupied", false];
+
+if (_remainEnemyUnits isNotEqualTo []) then {
+ {
+ if (unitIsUAV _x) then {
+ _x setDamage 1;
+ } else {
+ [_x, true] call ace_captives_fnc_setSurrendered;
+ };
+ } forEach _remainEnemyUnits;
+};
+
+if (_city getVariable ["marker", ""] != "") then {
+ (_city getVariable ["marker", ""]) setMarkerColor "ColorGreen";
+};
+
+if (btc_final_phase) then {
+ btc_city_remaining = btc_city_remaining - [_city];
+};
+
+if (btc_debug) then {
+ private _id = _city getVariable "id";
+ (format ["loc_%1", _id]) setMarkerColor "ColorGreen";
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/setPlayerTrigger.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/setPlayerTrigger.sqf
new file mode 100644
index 0000000..51934d9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/setPlayerTrigger.sqf
@@ -0,0 +1,54 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_setPlayerTrigger
+
+Description:
+ Set trigger properties to detect player presence.
+
+Parameters:
+ _trigger - City. [Object]
+ _cachingRadius - Radius of the location. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_trigger, _cachingRadius] call btc_city_fnc_setPlayerTrigger;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_trigger", objNull, [objNull]],
+ ["_cachingRadius", 0, [0]]
+];
+
+_trigger setTriggerArea [_cachingRadius + btc_city_radiusOffset, _cachingRadius + btc_city_radiusOffset, 0, false, 800];
+_trigger setTriggerActivation ["ANYPLAYER", "PRESENT", true];
+_trigger setTriggerStatements [btc_p_trigger, "thisTrigger call btc_city_fnc_activate", "thisTrigger call btc_city_fnc_de_activate"];
+
+if (btc_debug) then {
+ private _id = _trigger getVariable "id";
+ private _has_en = _trigger getVariable "occupied";
+ private _name = _trigger getVariable "name";
+ private _type = _trigger getVariable "type";
+
+ private _marker = createMarker [format ["loc_%1", _id], _trigger];
+ _marker setMarkerShape "ELLIPSE";
+ _marker setMarkerBrush "SolidBorder";
+ _marker setMarkerSize [_cachingRadius + btc_city_radiusOffset, _cachingRadius + btc_city_radiusOffset];
+ _marker setMarkerAlpha 0.3;
+ _marker setMarkerColor (["colorGreen", "colorRed"] select _has_en);
+ _trigger setVariable ["marker", _marker];
+
+ private _marke = createMarker [format ["locn_%1", _id], _trigger];
+ _marke setMarkerType "Contact_dot1";
+ private _spaces = "";
+ for "_i" from 0 to count _name -1 do {
+ _spaces = _spaces + " ";
+ };
+ _marke setMarkerText format [_spaces + "%1 ID %2 - %3", _type, _id, _trigger getVariable ["hasbeach", "empty"]];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/city/trigger_free_condition.sqf b/hearts_and_minds.kunduz_valley/core/fnc/city/trigger_free_condition.sqf
new file mode 100644
index 0000000..27db74f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/city/trigger_free_condition.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_city_fnc_trigger_free_condition
+
+Description:
+ Check if a city should be free.
+
+Parameters:
+ _remainEnemyUnits - Remaining enemy units assigned to the city, passed by the trigger. [Array]
+ _p_city_free_trigger - Minimum number of units to consider a city free. [Number]
+
+Returns:
+ _return - If the city should be free. [Boolean]
+
+Examples:
+ (begin example)
+ [allUnits inAreaArray [getPos player, 100, 100], 2] call btc_city_fnc_trigger_free_condition;
+ (end)
+
+Author:
+ GoldJohnKing
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_remainEnemyUnits", [], [[]]],
+ ["_p_city_free_trigger", 0, [0]]
+];
+
+if (count _remainEnemyUnits > _p_city_free_trigger) exitWith {false};
+_remainEnemyUnits findIf {
+ private _veh = vehicle _x;
+ !(
+ _veh isKindOf "Man" ||
+ {unitIsUAV _veh}
+ )
+} isEqualTo -1
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/addWP.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/addWP.sqf
new file mode 100644
index 0000000..e494da1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/addWP.sqf
@@ -0,0 +1,52 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_addWP
+
+Description:
+ Add waypoints to a group. The group will patrol inside a first house, then 4 waypoints outside are added and finally the group will patrol again in an other house.
+
+Parameters:
+ _group - Group where waypoints will be added. [Group]
+ _pos - Position to search house and position to patrol. [Array]
+ _radius - Radius number to search around the position. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_group] call btc_civ_fnc_addWP;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_pos", getPos leader param [0], [[]]],
+ ["_radius", 50, [0]]
+];
+
+[_group] call CBA_fnc_clearWaypoints;
+[_group, _pos, -1, "MOVE", "SAFE", "NO CHANGE", "LIMITED"] call CBA_fnc_addWaypoint;
+
+private _houses = ([_pos, _radius] call btc_fnc_getHouses) select 0;
+if (_houses isNotEqualTo []) then {
+ private _house = selectRandom _houses;
+ [_group, _house] call btc_fnc_house_addWP_loop;
+ _houses = _houses - [_house];
+};
+
+for "_i" from 1 to 4 do {
+ private _wp_pos = [_pos, _radius] call btc_fnc_randomize_pos;
+ [_group, _wp_pos, -1, "MOVE"] call CBA_fnc_addWaypoint;
+};
+
+if (_houses isNotEqualTo []) then {
+ private _house = selectRandom _houses;
+ [_group, _house] call btc_fnc_house_addWP_loop;
+ _houses = _houses - [_house];
+};
+
+[_group, _pos, -1, "CYCLE"] call CBA_fnc_addWaypoint;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/add_grenade.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_grenade.sqf
new file mode 100644
index 0000000..eb20fc0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_grenade.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_add_grenade
+
+Description:
+ Add grenade to a unit.
+
+Parameters:
+ _unit - Unit where a grenade will be added. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_unit] call btc_civ_fnc_add_grenade;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+_unit addMagazines [selectRandom btc_g_civs, 1];
+
+_unit addEventHandler ["Fired", {
+ params ["_unit", "_weapon"];
+
+ if (_weapon isEqualTo "Throw") then {
+ _unit removeEventHandler ["Fired", _thisEventHandler];
+
+ private _group = createGroup [civilian, true];
+ _group setVariable ["btc_city", group _unit getVariable ["btc_city", objNull]];
+ [_unit] joinSilent _group;
+
+ [{
+ params ["_unit"];
+
+ [group _unit] call btc_civ_fnc_addWP;
+ }, [_unit], 20] call CBA_fnc_waitAndExecute;
+ };
+}];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/add_leaflets.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_leaflets.sqf
new file mode 100644
index 0000000..26cc955
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_leaflets.sqf
@@ -0,0 +1,49 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_add_leaflets
+
+Description:
+ Add leaflets to drone which have parents classe: UAV_06_base_F and UAV_01_base_F.
+
+Parameters:
+ _player - Not used. [Object]
+ _uav - Drone where leaflets will be added. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_player, _uav] call btc_civ_fnc_add_leaflets;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]],
+ ["_uav", objNull, [objNull]]
+];
+
+private _isUAV6 = _uav isKindOf "UAV_06_base_F";
+
+if !(_isUAV6 || _uav isKindOf "UAV_01_base_F") exitWith {};
+
+private _turret = [0, -1] select (_isUAV6);
+
+_uav addMagazine "1Rnd_Leaflets_West_F";
+if !("Bomb_Leaflets" in (_uav weaponsTurret [_turret])) then {
+ _uav addWeapon "Bomb_Leaflets";
+};
+_uav selectWeaponTurret ["Bomb_Leaflets", [_turret]];
+if (needReload _uav isEqualTo 1) then {reload _uav};
+
+if ((_uav getVariable ["btc_leaflets_eh_added" , -1]) isEqualTo -1) then {
+ private _id_f = _uav addEventHandler ["Fired", btc_civ_fnc_leaflets];
+ _uav setVariable ["btc_leaflets_eh_added", _id_f];
+
+ if (btc_debug) then {
+ [format ["EventHandler ID: %1", _id_f], __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/add_weapons.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_weapons.sqf
new file mode 100644
index 0000000..f4e247e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/add_weapons.sqf
@@ -0,0 +1,31 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_add_weapons
+
+Description:
+ Add weapon to a unit.
+
+Parameters:
+ _unit - Unit where a weapon will be added. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_unit] call btc_civ_fnc_add_weapons;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_weapon", "", [""]],
+ ["_magazine", "", [""]]
+];
+
+(uniformContainer _unit) addMagazineCargo [_magazine, 5];
+_unit addWeapon _weapon;
+_unit selectWeapon _weapon;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/class.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/class.sqf
new file mode 100644
index 0000000..a4066ed
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/class.sqf
@@ -0,0 +1,82 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_class
+
+Description:
+ Return civilian classe names sorted by units, boats and vehicules based on faction name.
+
+Parameters:
+ _factions - Faction name used to get civilian classe name sorted. [Array]
+
+Returns:
+ _civilian_classe_names - Array of units, boats and vehicules classe names. [Array]
+
+Examples:
+ (begin example)
+ _civilian_classe_names = ["CIV_F"] call btc_civ_fnc_class;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_factions", [], [[]]]
+];
+
+private _type_units = [];
+private _type_boats = [];
+private _type_veh = [];
+
+//Get all vehicles
+private _cfgVehicles = configFile >> "CfgVehicles";
+private _allClass = ("(configName _x) isKindOf 'AllVehicles'" configClasses _cfgVehicles) apply {configName _x};
+_allClass = _allClass select {getNumber(_cfgVehicles >> _x >> "scope") isEqualTo 2};
+
+//Check if faction existe
+private _cfgFactionClasses = configFile >> "CfgFactionClasses";
+_factions = _factions apply {
+ if !(isClass(_cfgFactionClasses >> _x)) then {
+ "CIV_F"
+ } else {
+ _x
+ };
+};
+
+{
+ private _faction = _x;
+
+ //Get all vehicles of the _faction selected
+ private _allClass_f = _allClass select {(toUpper getText(_cfgVehicles >> _x >> "faction")) isEqualTo _faction};
+
+ //Units
+ _type_units append (_allClass_f select {_x isKindOf "Man"});
+
+ //Vehicles
+ _type_boats append (_allClass_f select {_x isKindOf "Ship"});
+
+ _type_veh append (_allClass_f select {(_x isKindOf "Car") || (_x isKindOf "Truck") || (_x isKindOf "Truck_F")});
+
+} forEach _factions;
+
+//Handle if no class name is found
+if (_type_units isEqualTo []) then {
+ _type_units = ["C_man_1","C_man_1_1_F","C_man_1_2_F","C_man_1_3_F","C_man_polo_1_F","C_man_polo_1_F_afro","C_man_polo_1_F_euro","C_man_polo_1_F_asia","C_man_polo_2_F","C_man_polo_2_F_afro","C_man_polo_2_F_euro","C_man_polo_2_F_asia","C_man_polo_3_F","C_man_polo_3_F_afro","C_man_polo_3_F_euro","C_man_polo_3_F_asia","C_man_polo_4_F","C_man_polo_4_F_afro","C_man_polo_4_F_euro","C_man_polo_4_F_asia","C_man_polo_5_F","C_man_polo_5_F_afro","C_man_polo_5_F_euro","C_man_polo_5_F_asia","C_man_polo_6_F","C_man_polo_6_F_afro","C_man_polo_6_F_euro","C_man_polo_6_F_asia","C_man_p_fugitive_F","C_man_p_fugitive_F_afro","C_man_p_fugitive_F_euro","C_man_p_fugitive_F_asia","C_man_p_beggar_F","C_man_p_beggar_F_afro","C_man_p_beggar_F_euro","C_man_p_beggar_F_asia","C_man_w_worker_F","C_man_hunter_1_F","C_Orestes","C_Nikos","C_Man_casual_4_F","C_Man_casual_5_F","C_Man_casual_6_F","C_Man_sport_1_F","C_Man_sport_2_F","C_Man_sport_3_F","C_Man_casual_1_F","C_Man_casual_2_F","C_Man_casual_3_F"]
+};
+if (_type_boats isEqualTo []) then {
+ _type_boats = ["C_Rubberboat","C_Boat_Civil_01_F","C_Boat_Civil_01_rescue_F","C_Boat_Civil_01_police_F","C_Boat_Transport_02_F","C_Scooter_Transport_01_F"];
+};
+if (_type_veh isEqualTo []) then {
+ _type_veh = ["C_Hatchback_01_F","C_SUV_01_F","C_Offroad_01_F","C_Van_01_transport_F","C_Van_01_box_F","C_Truck_02_transport_F","C_Truck_02_covered_F","C_Offroad_02_unarmed_F"]
+};
+
+//Final filter unwanted units type
+_type_units = _type_units select {
+ getText (_cfgVehicles >> _x >> "role") isNotEqualTo "Crewman" &&
+ (_x find "_unarmed_") isEqualTo -1 &&
+ getText (_cfgVehicles >> _x >> "vehicleClass") isNotEqualTo "MenVR"
+};
+_type_veh = _type_veh select {(getNumber (_cfgVehicles >> _x >> "isUav") isNotEqualTo 1) && !(_x isKindOf "Kart_01_Base_F")};
+
+[_type_units, _type_boats, _type_veh]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/createFlower.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/createFlower.sqf
new file mode 100644
index 0000000..c0b8cda
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/createFlower.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_createFlower
+
+Description:
+ Add flower bouquets next to killed civilians.
+
+Parameters:
+ _city - City. [Object]
+ _civKilled - Array of previous killed civilians. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_city_all get 0, [[getPosASL player, getDir player]]] call btc_civ_fnc_createFlower;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_civKilled", [], [[]]]
+];
+
+_city setVariable [
+ "btc_civ_flowers",
+ _civKilled apply {
+ _x params ["_posASL", "_dir"];
+
+ private _flowers = createSimpleObject [selectRandom btc_type_flowers, _posASL];
+ _flowers setDir _dir;
+
+ _flowers
+ }
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/createGrave.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/createGrave.sqf
new file mode 100644
index 0000000..98e972c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/createGrave.sqf
@@ -0,0 +1,50 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_createGrave
+
+Description:
+ Create graves and add flower bouquets next to them.
+
+Parameters:
+ _city - City. [Object]
+ _graves - Array of grave around city. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_city_all get 1, [[getPosASL player, getDir player, "ACE_Grave"]]] call btc_civ_fnc_createGrave;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_graves", [], [[]]]
+];
+
+_city setVariable [
+ "btc_civ_graves",
+ _graves apply {
+ _x params ["_posASL", "_dir", "_graveType"];
+
+ private _grave = createVehicle [_graveType, [0, 0, 0], [], 0, "NONE"];
+ _grave setPosASL _posASL;
+ _grave setDir _dir;
+ _grave setVectorUp surfaceNormal _posASL;
+
+ _flowers = [];
+ for "_i" from 0 to (1 + round random 2) do {
+ _flowers pushBack createSimpleObject [
+ selectRandom btc_type_flowers,
+ [[_posASL vectorAdd [0, 0, 0.2], 0.2, 0.8, _dir, true]] call CBA_fnc_randPosArea
+ ];
+ (_flowers select _i) setDir random 360;
+ };
+
+ [_flowers, _grave]
+ }
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/create_patrol.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/create_patrol.sqf
new file mode 100644
index 0000000..98a5a2c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/create_patrol.sqf
@@ -0,0 +1,74 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_create_patrol
+
+Description:
+ Create a civilian patrol around a city in a defined area.
+
+Parameters:
+ _group - Group of the traffic. [Group]
+ _active_city - City where the patrol will be done around. [Object]
+ _area - Area to search a start and an end city for the patrol [Number]
+
+Returns:
+ _isCreated - return true if the patrol is created. [Boolean]
+
+Examples:
+ (begin example)
+ _isCreated = [createGroup civilian, _active_city] call btc_civ_fnc_create_patrol;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_active_city", objNull, [objNull]],
+ ["_area", btc_patrol_area, [0]]
+];
+
+if (isNil "btc_civilian_id") then {btc_civilian_id = -1;};
+
+//Find a city
+private _cities = values btc_city_all inAreaArray [getPosWorld _active_city, _area, _area];
+private _usefuls = _cities select {!(_x getVariable ["active", false])};
+if (_usefuls isEqualTo []) exitWith {
+ _group call CBA_fnc_deleteEntity;
+ false
+};
+
+private _start_city = selectRandom _usefuls;
+private _pos = getPos _start_city;
+
+private _pos_isWater = false;
+private _veh_type = "";
+private _safe_pos = [];
+private _roads = _pos nearRoads 200;
+_roads = _roads select {isOnRoad _x};
+if (_roads isEqualTo []) then {
+ _safe_pos = [_pos, 0, 500, 13, [0,1] select btc_p_sea, 60 * (pi / 180), 0] call BIS_fnc_findSafePos;
+ _safe_pos = [_safe_pos select 0, _safe_pos select 1, 0];
+ _pos_isWater = (surfaceIsWater _safe_pos) && {getTerrainHeightASL _safe_pos < -2};
+ if (_pos_isWater) then {
+ _veh_type = selectRandom btc_civ_type_boats;
+ } else {
+ _veh_type = selectRandom btc_civ_type_veh;
+ };
+} else {
+ _safe_pos = getPos (selectRandom _roads);
+ _veh_type = selectRandom btc_civ_type_veh;
+};
+
+_group setVariable ["btc_patrol_id", btc_civilian_id, btc_debug];
+btc_civilian_id = btc_civilian_id - 1;
+
+private _delay = [_group, _veh_type, [selectRandom btc_civ_type_units], _safe_pos] call btc_delay_fnc_createVehicle;
+
+[{
+ _this call btc_patrol_fnc_init;
+ (_this select 0) setVariable ["acex_headless_blacklist", false];
+}, [_group, [_start_city, _active_city], _area, _pos_isWater], _delay] call btc_delay_fnc_waitAndExecute;
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/evacuate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/evacuate.sqf
new file mode 100644
index 0000000..e674080
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/evacuate.sqf
@@ -0,0 +1,50 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_evacuate
+
+Description:
+ Evacuate civlians around a position in an area of 200 to a safe position.
+
+Parameters:
+ _position - Position to search for cilivians in a area of 200. [Array]
+ _position_evac - Safe position where civilians will move to. [Array]
+
+Returns:
+ _civilians - Civlians found. [Array]
+Examples:
+ (begin example)
+ _civilians = [getPos player] call btc_civ_fnc_evacuate;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_position", [], [[]]],
+ ["_position_evac", [], [[]]]
+];
+
+private _civilians = (units civilian) inAreaArray [_position, 200, 200];
+
+if (_position_evac isEqualTo []) then {
+ private _safe = (nearestTerrainObjects [_position, ["CHURCH", "CHAPEL"], 400]);
+ if (_safe isEqualTo []) then {
+ _position_evac = [_position, 0, 500, 30, 0, 60 * (pi / 180), 0] call BIS_fnc_findSafePos;
+ _position_evac set [2, 0];
+ } else {
+ private _safe_building = _safe select 0;
+ if ((_safe_building buildingPos -1) isEqualTo []) then {
+ _position_evac = _safe_building getPos [((boundingBox _safe_building) select 1 select 0) + 10, getDir _safe_building];
+ } else {
+ _position_evac = getPos _safe_building;
+ };
+ };
+};
+
+{
+ [group _x, _position_evac, 20] call btc_civ_fnc_addWP;
+} forEach _civilians;
+
+_civilians
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/get_grenade.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/get_grenade.sqf
new file mode 100644
index 0000000..f539351
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/get_grenade.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_get_grenade
+
+Description:
+ Search for civilians at a position in a range to add grenade to their inventory.
+
+Parameters:
+ _pos - Position to search for civilians. [Array]
+ _range - Range to find civilians around the position. [Number]
+ _units - Pass directly units to add greande. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [[0, 0, 0], 200] call btc_civ_fnc_get_grenade;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_range", 300, [0]],
+ ["_units", [], [[]]]
+];
+
+if (_units isEqualTo []) then {
+ _units = _pos nearEntities [btc_civ_type_units, _range];
+};
+
+_units = _units select {
+ side group _x isEqualTo civilian &&
+ {!(lifeState _x in ["INCAPACITATED", "DEAD"])}
+};
+
+if (_units isEqualTo []) exitWith {};
+
+{
+ if (btc_debug_log) then {
+ [format ["%1 - %2", _x, side _x], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ [_x] call btc_civ_fnc_add_grenade;
+
+ private _group = createGroup [btc_enemy_side, true];
+ _group setVariable ["btc_city", group _x getVariable ["btc_city", objNull]];
+ [_x] joinSilent _group;
+
+ [_group] call CBA_fnc_clearWaypoints;
+ _group setVariable ["getWeapons", true];
+ [_group, _pos, -1, "GUARD", "AWARE", "RED", nil, nil, nil, nil, 10] call CBA_fnc_addWaypoint;
+} forEach [selectRandom _units];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/get_weapons.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/get_weapons.sqf
new file mode 100644
index 0000000..c126a6b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/get_weapons.sqf
@@ -0,0 +1,63 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_get_weapons
+
+Description:
+ Search for civilians at a position in a range to add weapons to their inventory.
+
+Parameters:
+ _pos - Position to search for civilians. [Array]
+ _range - Range to find civilians around the position. [Number]
+ _units - Pass directly units to add weapons. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player, 200] call btc_civ_fnc_get_weapons;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_range", 300, [0]],
+ ["_units", [], [[]]]
+];
+
+if (_units isEqualTo []) then {
+ _units = _pos nearEntities [btc_civ_type_units, _range];
+ _units = _units select {
+ side group _x isEqualTo civilian &&
+ {!(lifeState _x in ["INCAPACITATED", "DEAD"])}
+ };
+};
+
+{
+ if (btc_debug_log) then {
+ [format ["%1 - %2", _x, side _x], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ private _unit = _x;
+
+ [_unit, "", 2] call ace_common_fnc_doAnimation;
+
+ private _playableUnits = playableUnits inAreaArray [getPosWorld _unit, 50, 50];
+ private _hgun = _playableUnits findIf {[_x, _unit] call btc_fnc_check_los} != -1;
+
+ private _weapon = selectRandom ([btc_w_civs select 0, btc_w_civs select 1] select _hgun);
+ private _magazine = (getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines")) select 0;
+
+ [_unit, _weapon, _magazine] remoteExecCall ["btc_civ_fnc_add_weapons", _unit];
+
+ private _group = createGroup [btc_enemy_side, true];
+ _group setVariable ["btc_city", group _unit getVariable ["btc_city", objNull]];
+ [_unit] joinSilent _group;
+
+ [_group] call CBA_fnc_clearWaypoints;
+ _group setVariable ["getWeapons", true];
+ [_group, getPos _unit, -1, "GUARD", "AWARE", "RED", nil, nil, nil, nil, 10] call CBA_fnc_addWaypoint;
+} forEach _units;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/leaflets.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/leaflets.sqf
new file mode 100644
index 0000000..0db7de8
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/leaflets.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_leaflets
+
+Description:
+ Evacuate civilian when player drop leaflets.
+
+Parameters:
+ _uav - UAV use by player. [Object]
+ _weapon - Type of weapon use by player inside UAV. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [player, "Bomb_Leaflets"] call btc_civ_fnc_leaflets;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_uav", objNull, [objNull]],
+ ["_weapon", "", [""]]
+];
+
+if (btc_debug) then {
+ [format ["%1 fired with %2", typeOf _uav, _weapon], __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+};
+
+if (_weapon isEqualTo "Bomb_Leaflets") then {
+ [getPos _uav] remoteExecCall ["btc_civ_fnc_evacuate", 2];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/civ/populate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/civ/populate.sqf
new file mode 100644
index 0000000..71e822c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/civ/populate.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_civ_fnc_populate
+
+Description:
+ Populate a city in an area with a defined number of civilians.
+
+Parameters:
+ _houses - Houses to populate around a city. [Number]
+ _n - Number of civilians to generate. [Number]
+ _city - City where the civilian is created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_city, 200, 3] call btc_civ_fnc_populate;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_houses", [], [[]]],
+ ["_n", 0, [0]],
+ ["_city", objNull, [objNull]]
+];
+
+if (_houses isEqualTo []) exitWith {};
+
+for "_i" from 1 to _n do {
+ if (_houses isEqualTo []) exitWith {};
+
+ private _pos = (_houses deleteAt 0) buildingPos 0;
+
+ private _group = createGroup civilian;
+ _group setVariable ["btc_city", _city];
+ _group setVariable ["btc_data_inhouse", [_pos]];
+ [[_group, _pos], btc_civ_fnc_addWP] call btc_delay_fnc_exec;
+ [_group, selectRandom btc_civ_type_units, _pos] call btc_delay_fnc_createUnit;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/changeWeather.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/changeWeather.sqf
new file mode 100644
index 0000000..1b51549
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/changeWeather.sqf
@@ -0,0 +1,22 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_changeWeather
+
+Description:
+ Change weather: stop rain, stop fog and make sunny weather.
+
+Parameters:
+
+Returns:
+
+Examples:
+
+Author:
+ Ice
+
+---------------------------------------------------------------------------- */
+
+5 setRain 0;
+5 setFog 0;
+5 setOvercast 0;
+10 setRainbow 1;
\ No newline at end of file
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/checkArea.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/checkArea.sqf
new file mode 100644
index 0000000..5040ce1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/checkArea.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_checkArea
+
+Description:
+ Check if the area is clear.
+
+Parameters:
+ _create_obj - Object to check around. [Object]
+ _distance - Distance around the object. [Number]
+
+Returns:
+ _isNotClear - Is not clear. [Boolean]
+
+Examples:
+ (begin example)
+ _isNotClear = [btc_log_create_obj] call btc_fnc_checkArea;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_create_obj", objNull, [objNull]],
+ ["_distance", 5, [0]]
+];
+
+if (
+ count (nearestObjects [_create_obj, ["LandVehicle", "CAManBase", "Strategic", "ThingX"], _distance]) > 0
+) exitWith {
+ (localize "STR_BTC_HAM_LOG_BASICS_CLEARAREA") call CBA_fnc_notify;
+ true
+};
+
+false
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/check_los.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/check_los.sqf
new file mode 100644
index 0000000..fc99baf
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/check_los.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_check_los
+
+Description:
+ Check the line of sight (LOS) between a unit and a target.
+
+Parameters:
+ _unit - Unit for checking. [Object]
+ _target - Target to check. [Object]
+
+Returns:
+ _can_see - Tell if the unit can see or not the target. [Boolean]
+
+Examples:
+ (begin example)
+ _can_see = [player, cursorObject] call btc_fnc_check_los;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_target", objNull, [objNull]]
+];
+
+(eyeDirection _unit) params ["_point1", "_point2"];
+private _atan = _point1 atan2 _point2;
+private _dirTo = _target getDir _unit;
+private _ang = abs (_dirTo - _atan);
+private _can_see = (_ang > 120) && (_ang < 240);
+
+if (_can_see) then {
+ private _eyeu = eyePos _unit;
+ private _eyet = eyePos _target;
+ private _terr = terrainIntersectASL [_eyeu, _eyet];
+ private _int = lineIntersects [_eyeu, _eyet];
+ private _can_see = !(_int || _terr);
+};
+_can_see
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/create_composition.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/create_composition.sqf
new file mode 100644
index 0000000..5b1090f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/create_composition.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_create_composition
+
+Description:
+ Create a composition based on an array containing line for each object of a composition. An objects is describe by: [type of object, direction, real position].
+
+Parameters:
+ _pos - Position where the composition will be created. [Array]
+ _setDir - Set the direction of composition spawn. [Number]
+ _array - Array of each objects in the composition. [Array]
+
+Returns:
+ _composition_objects - Objects created from the _array. [Array]
+
+Examples:
+ (begin example)
+ _composition_objects = [getPos player, 45, [["Land_Money_F",359.991,[0.833984,-2.00586,1]],["Land_Photoframe_01_F",98.7052,[-0.333984,-2.35547,1]],["Land_BriefingRoomDesk_01_F",0.00013937,[0.285156,-2.2207,0]]]] call btc_fnc_create_composition;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_setDir", 0, [0]],
+ ["_array", [], [[]]]
+];
+_pos params ["_pos_x", "_pos_y", ["_pos_z", 0]];
+
+_array apply {
+ _x params ["_type", "_dir", "_rel_pos"];
+ _rel_pos params ["_rel_x", "_rel_y", ["_rel_z", 0]];
+
+ //// Determine position function of setdir \\\\
+ private _final = [_pos_x + _rel_x*cos(_setDir) - _rel_y*sin(- _setDir), _pos_y + _rel_y*cos(_setDir) + _rel_x*sin(- _setDir)];
+ _final pushBack (_pos_z + _rel_z + getTerrainHeightASL _final);
+ private _obj = createVehicle [_type, ASLToATL _final, [], 0, "CAN_COLLIDE"];
+ //// Determine direction function of setdir \\\\
+ _obj setDir (_dir + _setDir);
+
+ _obj setVectorUp surfaceNormal position _obj;
+ _obj setPosASL _final;
+ _obj;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/delete.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/delete.sqf
new file mode 100644
index 0000000..399dec6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/delete.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_delete
+
+Description:
+ Delete markers and the JIP remoteExec associated. Delete objects when player is far from them.
+
+Parameters:
+ _markers - Array of marker to delete. [Array]
+ _objects - Array of objects and or groups to delete. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [["mymarker"], [objNull, grpNull]] call btc_fnc_delete;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_markers", [], [[""]]],
+ ["_objects", [], [[]]]
+];
+
+{
+ deleteMarker _x;
+ //remove JIP remoteExec
+ remoteExecCall ["", _x];
+} forEach _markers;
+
+[_objects] call btc_fnc_deleteEntities;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/deleteEntities.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/deleteEntities.sqf
new file mode 100644
index 0000000..f5ef280
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/deleteEntities.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_deleteEntities
+
+Description:
+ This delete objects or groups when they are far away from a player.
+
+Parameters:
+ _entities - Entities deleted when _playableUnits are far. [Array]
+ _playableUnits - Objects needed to be far before entities are deleted. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [_entities] call btc_fnc_deleteEntities;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{
+ params [
+ ["_entities", [], [[]]],
+ ["_playableUnits", playableUnits, [[]]]
+ ];
+
+ private _entity = _entities deleteAt 0;
+ private _entity_obj = if (_entity isEqualType grpNull) then {
+ leader _entity
+ } else {
+ _entity
+ };
+
+ if (_playableUnits inAreaArray [getPosWorld _entity_obj, 1000, 1000] isEqualTo []) then {
+ _entity call CBA_fnc_deleteEntity;
+ } else {
+ _entities pushBack _entity;
+ };
+
+ if (_entities isNotEqualTo []) exitWith {
+ _this call btc_fnc_deleteEntities;
+ };
+}, _this, 1] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/dlg.hpp b/hearts_and_minds.kunduz_valley/core/fnc/common/dlg.hpp
new file mode 100644
index 0000000..e744abb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/dlg.hpp
@@ -0,0 +1,231 @@
+class btc_dlg_RscText {
+ x = 0;
+ y = 0;
+ h = 0.037;
+ w = 0.3;
+ type = 0;
+ style = 0;
+ shadow = 1;
+ colorShadow[] = {0, 0, 0, 0.5};
+ font = "PuristaMedium";
+ SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ text = "";
+ colorText[] = {1, 1, 1, 1.0};
+ colorBackground[] = {0, 0, 0, 0};
+ linespacing = 1;
+};
+
+class btc_dlg_shortcutButton {
+ idc = -1;
+ style = 0;
+ default = 0;
+ shadow = 1;
+ w = 0.183825;
+ h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)";
+ color[] = {1, 1, 1, 1.0};
+ color2[] = {0.95, 0.95, 0.95, 1};
+ colorDisabled[] = {1, 1, 1, 0.25};
+ colorFocused[] = {0.95, 0.95, 0.95, 1};//{1, 1, 1, 1.0};
+ colorBackgroundFocused[] = {0.95, 0.95, 0.95, 1};//{"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1};
+ colorBackground[] = {0.95, 0.95, 0.95, 1};//{"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1};
+ colorBackground2[] = {1, 1, 1, 1};
+ animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
+ animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
+ animTextureDisabled = "\A3\ui_f\data\GUI\scCommon\RscShortcutButton\normal_ca.paa";
+ animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa";
+ animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa";
+ animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa";
+ textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)";
+ periodFocus = 1.2;
+ periodOver = 0.8;
+
+ class HitZone {
+ left = 0.0;
+ top = 0.0;
+ right = 0.0;
+ bottom = 0.0;
+ };
+
+ class ShortcutPos {
+ left = 0;
+ top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
+ w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
+ h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ };
+
+ class TextPos {
+ left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
+ top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
+ right = 0.005;
+ bottom = 0.0;
+ };
+ period = 0.4;
+ font = "PuristaMedium";
+ size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ text = "";
+ soundEnter[] = {"\A3\ui_f\data\sound\onover", 0.09, 1};
+ soundPush[] = {"\A3\ui_f\data\sound\new1", 0.0, 0};
+ soundClick[] = {"\A3\ui_f\data\sound\onclick", 0.07, 1};
+ soundEscape[] = {"\A3\ui_f\data\sound\onescape", 0.09, 1};
+ action = "";
+
+ class Attributes {
+ font = "PuristaMedium";
+ color = "#E5E5E5";
+ align = "left";
+ shadow = "true";
+ };
+
+ class AttributesImage {
+ font = "PuristaMedium";
+ color = "#E5E5E5";
+ align = "left";
+ };
+};
+class btc_dlg_button : btc_dlg_shortcutButton {
+ idc = -1;
+ type = 16;
+ style = "0x02 + 0xC0";
+ default = 0;
+ shadow = 0;
+ x = 0;
+ y = 0;
+ w = 0.15;//0.095589;
+ h = 0.039216;
+ 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(0,0,0,1)";//"#(argb,8,8,3)color(1,1,1,1)";
+ animTexturePressed = "#(argb,8,8,3)color(0,0,0,1)";//"#(argb,8,8,3)color(1,1,1,1)";
+ animTextureDefault = "#(argb,8,8,3)color(0,0,0,1)";//"#(argb,8,8,3)color(1,1,1,1)";
+ colorBackground[] = {0, 0, 0, 0.8};
+ colorBackground2[] = {1, 1, 1, 0.5};
+ color[] = {1, 1, 1, 1};
+ color2[] = {1, 1, 1, 1};
+ colorText[] = {1, 1, 1, 1};
+ colorDisabled[] = {1, 1, 1, 0.25};
+ period = 1.2;
+ periodFocus = 1.2;
+ periodOver = 1.2;
+ size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+
+ class TextPos {
+ left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
+ top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
+ right = 0.005;
+ bottom = 0.0;
+ };
+
+ class Attributes {
+ font = "PuristaLight";
+ color = "#E5E5E5";
+ align = "left";
+ shadow = "false";
+ };
+
+ class ShortcutPos {
+ left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005";
+ top = 0.005;
+ w = 0.0225;
+ h = 0.03;
+ };
+};
+class btc_dlg_RscListBox {
+ type = 5;
+ style = "0x10";
+ idc=-1;
+ font = "puristaMedium";
+ SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)";//"(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.75)";
+ rowHeight=0.025;
+ lineSpacing = 1;
+ idcRight = -1;
+ idcLeft = -1;
+ drawSideArrows = 1;
+ columns[] = {0.937500,0.968750,1.000000,0.7};
+ colorText[] = {1,1,1,0.7};
+ colorDisabled[] = {1, 1, 1, 0.6};
+ colorScrollBar[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",0.85};
+ colorSelect[] = {0.937500,0.968750,1.000000,0.7};
+ colorSelect2[] = {0.937500,0.968750,1.000000,0.7};
+ colorSelectBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",0.85};
+ colorSelectBackground2[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",0.85};
+ colorBackground[] = {1,1,1,0.05};
+ maxHistoryDelay = 1.0;
+ soundSelect[] = {"",0.1,1};
+ period = 1;
+ autoScrollSpeed = -1;
+ autoScrollDelay = 5;
+ autoScrollRewind = 0;
+ arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)";
+ arrowFull = "#(argb,8,8,3)color(1,1,1,1)";
+ shadow = 0;
+
+ class listScrollBar
+ {
+ color[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",0.85};
+ colorActive[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",0.85};
+ colorDisabled[] = {1, 1, 1, 1};
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ soundSelect[] = {"\A3\ui_f\data\sound\RscListbox\soundSelect",0.09,1};
+ shadow = 1;
+ width = 0.2;
+ };
+};
+class btc_dlg_comboBox {
+ style = 16;
+ type = 4;
+ x = 0;
+ y = 0;
+ w = 0.12;
+ h = 0.035;
+ shadow = 0;
+ colorSelect[] = {0,0,0,1};
+ colorText[] = {0.95,0.95,0.95,1};
+ colorBackground[] = {0,0,0,1};
+ colorSelectBackground[] = {1,1,1,0.7};
+ colorScrollBar[] = {1,0,0,1};
+ arrowEmpty = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_ca.paa";
+ arrowFull = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_active_ca.paa";
+ wholeHeight = 0.45;
+ color[] = {1,1,1,1};
+ colorActive[] = {1,0,0,1};
+ colorDisabled[] = {1,1,1,0.25};
+ font = "PuristaMedium";
+ sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ class ComboScrollBar
+ {
+ 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";
+ };
+ soundSelect[] = { "", 0, 1 };
+ soundExpand[] = { "", 0, 1 };
+ soundCollapse[] = { "", 0, 1 };
+ maxHistoryDelay = 0;
+};
+class btc_dlg_RscEdit {
+ type = 2;
+ style = 16;
+ font = "PuristaMedium";
+ shadow = 2;
+ sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ autocomplete = "";
+ htmlControl = true;
+ lineSpacing = 1;
+ colorBackground[] = {0, 0, 0, 0.65};
+ colorText[] = {0.95, 0.95, 0.95, 1};
+ colorDisabled[] = {1, 1, 1, 0.25};
+ colorFocused[] = {1, 1, 1, 1.0};
+ colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1};
+ colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1};
+ canModify = 1;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/end_mission.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/end_mission.sqf
new file mode 100644
index 0000000..7c90cfb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/end_mission.sqf
@@ -0,0 +1,27 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_end_mission
+
+Description:
+ Message shown when the mission end.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_fnc_end_mission;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+hint localize "STR_BTC_HAM_O_COMMON_ENDMISSION";
+
+while {true} do {
+ hintSilent localize "STR_BTC_HAM_O_COMMON_ENDMISSION";
+ sleep 1;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/final_phase.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/final_phase.sqf
new file mode 100644
index 0000000..c5bc311
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/final_phase.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_final_phase
+
+Description:
+ Start the final mission process by waiting until all cities are free, then trigger the mission end.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_fnc_final_phase;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+["btc_dty", "SUCCEEDED"] call BIS_fnc_taskSetState;
+[["btc_sze", "btc_m"], 2] call btc_task_fnc_create;
+
+btc_final_phase = true;
+
+btc_city_remaining = [];
+{
+ if (_y getVariable ["type", ""] != "NameMarine") then {
+ if (_y getVariable ["marker", ""] != "") then {
+ deleteMarker (_y getVariable ["marker", ""]);
+ };
+ private _cachingRadius = _y getVariable ["cachingRadius", 500];
+
+ private _marker = createMarker [format ["city_%1", position _y], position _y];
+ _marker setMarkerShape "ELLIPSE";
+ _marker setMarkerBrush "SolidBorder";
+ _marker setMarkerSize [_cachingRadius, _cachingRadius];
+ _marker setMarkerAlpha 0.3;
+ if (_y getVariable ["occupied", false]) then {
+ _marker setMarkerColor "colorRed";
+ btc_city_remaining pushBack _y;
+ } else {
+ _marker setMarkerColor "colorGreen";
+ _marker setMarkerAlpha 0;
+ };
+ _y setVariable ["marker", _marker];
+ };
+} forEach btc_city_all;
+
+waitUntil {sleep 15; (btc_city_remaining isEqualTo [])};
+
+["btc_m", "SUCCEEDED"] call btc_task_fnc_setState;
+
+//END
+[] remoteExec ["btc_fnc_end_mission", 0, true];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/find_closecity.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/find_closecity.sqf
new file mode 100644
index 0000000..5c5c01a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/find_closecity.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_find_closecity
+
+Description:
+ Find closer city in an array of cities from an initial city.
+
+Parameters:
+ _obj - City used to find the closer city. [Object]
+ _array - Array of city. [Array]
+ _isOccupied - Activate not occupied city filter. [Boolean]
+
+Returns:
+ _closer_city - Closer city from the array of city. [Object]
+
+Examples:
+ (begin example)
+ _closer_city = [player, values btc_city_all] call btc_fnc_find_closecity;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_obj", objNull, [objNull, []]],
+ ["_array", [], [[]]],
+ ["_isOccupied", true, [true]]
+];
+
+private _city_all_distance = [];
+if (_isOccupied) then {
+ _city_all_distance = _array select {!(_x getVariable ["occupied", false])};
+} else {
+ _city_all_distance = _array;
+};
+if (_city_all_distance isEqualTo []) exitWith {objNull};
+
+_city_all_distance = _city_all_distance apply {[_x distance _obj, _x]};
+_city_all_distance sort true;
+_city_all_distance select 0 select 1;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/findposoutsiderock.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/findposoutsiderock.sqf
new file mode 100644
index 0000000..35dff17
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/findposoutsiderock.sqf
@@ -0,0 +1,60 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_findposoutsiderock
+
+Description:
+ Found position outside rock.
+
+Parameters:
+ _rpos - Position to check. [Array]
+
+Returns:
+ _rpos - New position outside rock.
+
+Examples:
+ (begin example)
+ _rpos = [getPos player] call btc_fnc_findposoutsiderock;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_rpos", [0, 0, 0], [[]]]
+];
+_rpos params ["_x", "_y"];
+
+private _objects = lineIntersectsObjs [[_x, _y, (getTerrainHeightASL _rpos) + 1], [_x, _y, (getTerrainHeightASL _rpos) + 100], objNull, objNull, false, 16];
+
+if (_objects isEqualTo []) exitWith {_rpos};
+
+private _object = _objects select 0;
+if (_object in nearestTerrainObjects [_object, ["HIDE", "ROCK", "ROCKS"], 1]) then {
+ private _roads = _rpos nearRoads 100;
+ if (_roads isEqualTo []) then {
+ _rpos = [_rpos, 5, 50, 10, false] call btc_fnc_findsafepos;
+ } else {
+ _rpos = getPos (_roads select 0);
+ };
+};
+
+if (btc_debug_log) then {
+ _objects = lineIntersectsObjs [[_x, _y, (getTerrainHeightASL _rpos) + 1], [_x, _y, (getTerrainHeightASL _rpos) + 100], objNull, objNull, false, 16];
+ if (_objects isNotEqualTo []) then {
+ _object = _objects select 0;
+ if (_object in nearestTerrainObjects [_object, ["HIDE", "ROCK", "ROCKS"], 1]) then {
+ [format ["POS %1 Still inside rock", _rpos], __FILE__, [false]] call btc_debug_fnc_message;
+ if (btc_debug) then {
+ ["Still inside rock", __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+ private _marker = createMarker [format ["btc_inrock_%1", _rpos], _rpos];
+ _marker setMarkerType "mil_unknown";
+ _marker setMarkerText "In rock";
+ _marker setMarkerSize [0.5, 0.5];
+ };
+ };
+ };
+};
+
+_rpos
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/findsafepos.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/findsafepos.sqf
new file mode 100644
index 0000000..80e83f0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/findsafepos.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_findsafepos
+
+Description:
+ Find safe position.
+
+Parameters:
+ _check_pos - Center position. [Array]
+ _mindist - Minimum distance from the center position. [Number]
+ _random_area - Maximum distance from the center position. [Number]
+ _objdist - Minimum distance from the resulting position to the center of nearest object. Specifying quite large distance here will slow the function and might often fail to find suitable position. Recommended value: 0 - 10. [Number]
+ _allow_water - Allow water position. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [getPos player] call btc_fnc_findsafepos;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_check_pos", [0, 0, 0], [[]]],
+ ["_mindist", 0, [0]],
+ ["_random_area", 100, [0]],
+ ["_objdist", 0, [0]],
+ ["_allow_water", false, [false, 0]]
+];
+
+private _return_pos = [];
+for "_i" from 0 to 4 do {
+ _return_pos = [_check_pos, _mindist, _random_area, _objdist, [0, 1] select _allow_water, 60 * (pi / 180), 0] call BIS_fnc_findSafePos;
+ if (count _return_pos isEqualTo 2) exitWith {
+ _return_pos = [_return_pos select 0, _return_pos select 1, 0];
+ };
+
+ _random_area = _random_area * 1.5;
+};
+_return_pos
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/getHouses.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/getHouses.sqf
new file mode 100644
index 0000000..244f53a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/getHouses.sqf
@@ -0,0 +1,54 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_getHouses
+
+Description:
+ Get enterable and not enterable houses around a position.
+
+Parameters:
+ _pos - Position to search for houses. [Array]
+ _radius - Radius of search. [Number]
+
+Returns:
+ _enterable - Useful open houses. [Array]
+ _notEnterable - Useful not open houses. [Array]
+
+Examples:
+ (begin example)
+ _useful = [getPos player] call btc_fnc_getHouses;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[], objNull]],
+ ["_radius", 100, [0]]
+];
+
+private _enterable = [];
+private _notEnterable = [];
+{
+ if (damage _x isNotEqualTo 0) then {continue;};
+ if ((_x buildingPos -1) isEqualTo []) then {
+ if (
+ _x isKindOf "Lamps_base_F" ||
+ {_x isKindOf "PowerLines_Small_base_F"} ||
+ {_x isKindOf "PowerLines_Wires_base_F"} ||
+ {_x isKindOf "Wall"} ||
+ {_x isKindOf "Camping_base_F"} ||
+ {_x isKindOf "Land_Campfire_F"} ||
+ {_x isKindOf "Land_MetalBarrel_empty_F"} ||
+ {_x isKindOf "FlagCarrierCore"} ||
+ {_x isKindOf "Scrapyard_base_F"} ||
+ {_x isKindOf "Shelter_base_F"}
+ ) then {continue;};
+ _notEnterable pushBack _x;
+ } else {
+ _enterable pushBack _x;
+ };
+} forEach (nearestObjects [_pos, ["Building"], _radius]);
+
+[_enterable, _notEnterable]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/get_cardinal.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/get_cardinal.sqf
new file mode 100644
index 0000000..32aee8c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/get_cardinal.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_get_cardinal
+
+Description:
+ Get cardinal.
+
+Parameters:
+ _n - Degree. [Number]
+
+Returns:
+ _card - Cardinal. [String]
+
+Examples:
+ (begin example)
+ _result = [100] call btc_fnc_get_cardinal;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_n", 0, [0]]
+];
+
+private _card = "";
+switch (true) do {
+ case (_n > 345 || _n <= 15) : {_card = "N";};
+ case (_n > 15 && _n <= 75) : {_card = "NE";};
+ case (_n > 75 && _n <= 105) : {_card = "E";};
+ case (_n > 105 && _n <= 165) : {_card = "SE";};
+ case (_n > 165 && _n <= 195) : {_card = "S";};
+ case (_n > 195 && _n <= 255) : {_card = "SW";};
+ case (_n > 255 && _n <= 285) : {_card = "W";};
+ case (_n > 285 && _n <= 345) : {_card = "NW";};
+};
+
+_card
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/get_class.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/get_class.sqf
new file mode 100644
index 0000000..4517998
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/get_class.sqf
@@ -0,0 +1,105 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_get_class
+
+Description:
+ Get enemy or civilian factions.
+
+Parameters:
+ _get_civ_faction - Search for factions of civilian or enemies. [String]
+
+Returns:
+ _array_of_factions - Array with authos names, text entry for mission parameters, corresponding number for each faction, faction name array. [Array]
+
+Examples:
+ (begin example)
+ copyToClipboard str (["CIV"] call btc_fnc_get_class);
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_get_civ_faction", "EN", [""]]
+];
+
+private _faction_list = if (_get_civ_faction isEqualTo "CIV") then {[3]} else {[0, 1, 2]};
+
+//Get all vehicles/Units
+private _cfgVehicles = configFile >> "CfgVehicles";
+private _allvehicles = ("(configName _x) isKindOf 'AllVehicles'" configClasses (_cfgVehicles)) apply {configName _x};
+_allvehicles = _allvehicles select {getNumber (_cfgVehicles >> _x >> "scope") isEqualTo 2};
+private _cfgFactionClasses = configFile >> "CfgFactionClasses";
+private _allfaction = [];
+private _allside = [];
+private _allauthor = [];
+private _alldlc = [];
+
+// Get factions and store it if new faction are found
+{
+ // Get faction of the vehicle and store it if is a new faction
+ private _index = _allfaction pushBackUnique toUpper getText(_cfgVehicles >> _x >> "faction");
+
+ //If new get the side and author name and dlc name
+ if (_index > -1) then {
+ _allside pushBack getNumber(_cfgVehicles >> _x >> "side");
+ _allauthor pushBack getText(_cfgVehicles >> _x >> "author");
+ private _dlc = getText(_cfgVehicles >> _x >> "dlc");
+ if (_dlc isEqualTo "") then {
+ if ((_allauthor select _index) isEqualTo "Bohemia Interactive") then {
+ //If is BI check if it is really BI, some mod don't change the author
+ private _mod_folder = getText(_cfgFactionClasses >> _allfaction select _index >> "icon") select [if ((getText(_cfgFactionClasses >> _allfaction select _index >> "icon") select [0, 1]) isEqualTo "\") then {1} else {0}];
+ private _mod = _mod_folder select [0, _mod_folder find "\"];
+ if (_mod isNotEqualTo "a3") then {
+ _dlc = (_allfaction select _index) select [0, (_allfaction select _index) find "_"];
+ };
+ } else {
+ _dlc = (_allfaction select _index) select [0, (_allfaction select _index) find "_"];
+ };
+ };
+ if (count _dlc isEqualTo 1) then {
+ _dlc = "";
+ };
+ _alldlc pushBack _dlc;
+ };
+} forEach _allvehicles;
+
+//Create an array of all information get
+private _all = [];
+{
+ if ( //Select faction depending on side CIV or Enemy
+ (_allside select _foreachindex) in _faction_list &&
+ (getNumber (_cfgFactionClasses >> _alldlc select _foreachindex >> "side") in [0, 1, 2, 3])
+ ) then {
+
+ //Return the text usefull in param.hpp
+ private _factionInfo = format [
+ "%1: %2 (Side: %3)",
+ _allauthor select _foreachindex,
+ getText (_cfgFactionClasses >> _x >> "displayName"),
+ [East, West, Independent, Civilian] select (_allside select _foreachindex)
+ ];
+
+ if ((_alldlc select _foreachindex) isNotEqualTo "") then {
+ _factionInfo = format [
+ "%1 %2",
+ _alldlc select _foreachindex,
+ _factionInfo
+ ];
+ };
+
+ _all pushBack [_factionInfo, _alldlc select _foreachindex, _x, _allside select _foreachindex, _allauthor select _foreachindex];
+ };
+} forEach _allfaction;
+_all sort true;
+
+_alldlc = _all apply {_x select 1};
+private _values = [];
+for "_i" from 0 to (count _all) - 1 do {
+ _values pushBack _i;
+};
+_texts = _values apply {format ["%1 - %2", _x, (_all select _x) select 0]};
+
+[_alldlc arrayIntersect _alldlc, _texts, _all apply {_x select 2}, _values]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/get_composition.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/get_composition.sqf
new file mode 100644
index 0000000..86bfb96
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/get_composition.sqf
@@ -0,0 +1,48 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_get_composition
+
+Description:
+ Get a composition of objects around a position.
+
+Parameters:
+ _position - Position ASL to get a composition. [Array]
+ _radius - Radius of the composition. [Number]
+
+Returns:
+ _composition - Array of the corresponding composition. [Array]
+
+Examples:
+ (begin example)
+ copyToClipboard str ([getPosASL player] call btc_fnc_get_composition);
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_position", [0, 0, 0], [[]]],
+ ["_radius", 100, [0]]
+];
+
+private _objs = (nearestObjects [_position, ["All"], _radius]) select {!(isObjectHidden _x) && !(_x isKindOf "Man")};
+
+_position params ["_center_xx", "_center_yy", "_center_zz"];
+
+_objs apply {
+ private _objPos = getPosASL _x;
+ _objPos params ["_xx", "_yy", "_zz"];
+ private _relative_pos = [
+ _xx - _center_xx,
+ _yy - _center_yy,
+ _zz - _center_zz
+ ];
+
+ [
+ typeOf _x,
+ getDir _x,
+ _relative_pos
+ ]
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP.sqf
new file mode 100644
index 0000000..a67cd67
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_house_addWP
+
+Description:
+ Add waypoints to group to patrol inside an house.
+
+Parameters:
+ _group - Group to add waypoints. [Group]
+ _house - House use to patrol. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [group player, (([getPos player] call btc_fnc_getHouses) select 0) select 0] call btc_fnc_house_addWP;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_house", objNull, [objNull]]
+];
+
+[_group] call CBA_fnc_clearWaypoints;
+private _allpositions = [_group, _house] call btc_fnc_house_addWP_loop;
+
+private _wp = [_group, [_allpositions select 0, 0.2] call CBA_fnc_randPos, -1, "CYCLE", "UNCHANGED", "NO CHANGE", "UNCHANGED", "NO CHANGE", "", [15, 20, 30]] call CBA_fnc_addWaypoint;
+_wp waypointAttachObject _house;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP_loop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP_loop.sqf
new file mode 100644
index 0000000..6dea671
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/house_addWP_loop.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_house_addWP_loop
+
+Description:
+ Add waypoints to group to patrol inside an house.
+
+Parameters:
+ _group - Group to add waypoints. [Group]
+ _house - House use to patrol. [Object]
+
+Returns:
+ _allpositions - All position available. [Array]
+
+Examples:
+ (begin example)
+ _allpositions = [group player, (([getPos player] call btc_fnc_getHouses) select 0) select 0] call btc_fnc_house_addWP_loop;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_house", objNull, [objNull]]
+];
+
+private _allpositions = (_house buildingPos -1) call BIS_fnc_arrayShuffle;
+
+if (btc_debug_log) then {
+ [format ["count all pos %1 in %2 ", count _allpositions, _house], __FILE__, [false]] call btc_debug_fnc_message;
+};
+{
+ private _wp = [_group, [_x, 0.2] call CBA_fnc_randPos, -1, "MOVE", "UNCHANGED", "NO CHANGE", "UNCHANGED", "NO CHANGE", "", [15, 20, 30]] call CBA_fnc_addWaypoint;
+ _wp waypointAttachObject _house;
+ _wp setWaypointHousePosition _forEachIndex;
+} forEach _allpositions;
+
+_allpositions
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/moveOut.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/moveOut.sqf
new file mode 100644
index 0000000..443cb20
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/moveOut.sqf
@@ -0,0 +1,26 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_moveOut
+
+Description:
+ Move out crew of a vehicle each frame to avoid dead body colliding.
+
+Parameters:
+ _crew - Crew array. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ crew cursorObject call btc_fnc_moveOut;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (_this isEqualTo []) exitWith {};
+
+moveOut (_this deleteAt 0);
+[btc_fnc_moveOut, _this] call CBA_fnc_execNextFrame;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/randomize_pos.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/randomize_pos.sqf
new file mode 100644
index 0000000..3671a53
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/randomize_pos.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_randomize_pos
+
+Description:
+ Randomize position.
+
+Parameters:
+ _pos - Starting position. [Array]
+ _random_area - Area of radomization. [Number]
+ _allowwater - Allow water position. [Boolean]
+
+Returns:
+ _return_pos - New position. [Array]
+
+Examples:
+ (begin example)
+ _return_pos = [getPos player] call btc_fnc_randomize_pos;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_random_area", 300, [0]],
+ ["_allowwater", false, [true]]
+];
+
+private _return_pos = _pos;
+
+_check_pos = [_pos, _random_area] call CBA_fnc_randPos;
+
+if ((surfaceIsWater _check_pos) && !(_allowwater)) then {
+ _return_pos = [_check_pos, 0, _random_area, 13, false] call btc_fnc_findsafepos;
+} else {
+ _return_pos = _check_pos;
+};
+_return_pos
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/road_direction.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/road_direction.sqf
new file mode 100644
index 0000000..09fa920
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/road_direction.sqf
@@ -0,0 +1,29 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_road_direction
+
+Description:
+ Found road direction.
+
+Parameters:
+ _road - Road to find the direction. [Object]
+
+Returns:
+ _direction - Direction of the road. [Number]
+
+Examples:
+ (begin example)
+ _direction = [(nearRoads player) select 0] call btc_fnc_road_direction;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_road", objNull, [objNull]]
+];
+
+private _info = getRoadInfo _road;
+(_info select 6) getDir (_info select 7)
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/roof.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/roof.sqf
new file mode 100644
index 0000000..5990cc7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/roof.sqf
@@ -0,0 +1,66 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_roof
+
+Description:
+ Get roof.
+
+Parameters:
+ _house - House to find the roof. [Group]
+
+Returns:
+ _spawnPos - Roof position. [Array]
+ _surfaceNormal - Surface normal. [Array]
+
+Examples:
+ (begin example)
+ _result = [(([position player, 30] call btc_fnc_getHouses) select 0) select 0] call btc_fnc_roof;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_house", objNull, [objNull]]
+];
+
+private _positions = _house buildingPos -1;
+private "_ASL";
+if (_positions isEqualTo []) then {
+ private _bbr = (0 boundingBoxReal _house);
+ private _p1 = _bbr select 0;
+ private _p2 = _bbr select 1;
+ private _maxHeight = abs ((_p2 select 2) - (_p1 select 2));
+ _ASL = (getPosASL _house) vectorAdd [0, 0, _maxHeight];
+} else {
+ {
+ reverse _x
+ } forEach _positions;
+ _positions sort false;
+ private _higherPos = _positions select 0;
+ reverse _higherPos;
+ _ASL = AGLToASL _higherPos;
+};
+
+private _surface = lineIntersectsSurfaces [_ASL vectorAdd [0, 0, 10], _ASL];
+
+private _spawnPos = _ASL;
+private _surfaceNormal = [0, 0, 1];
+if (_surface isEqualTo []) then { // Try to find again the roof with house position
+ _surface = lineIntersectsSurfaces [_ASL vectorAdd [0, 0, 10], getPosASL _house];
+};
+
+if (_surface isNotEqualTo []) then {
+ private _intersect = _surface select 0;
+ if (
+ _house in _intersect &&
+ {(_spawnPos select 2) + 0.5 < (_intersect select 0 select 2)}
+ ) then {
+ _spawnPos = (_intersect select 0) vectorAdd [0, 0, 0.2];
+ _surfaceNormal = _intersect select 1;
+ };
+};
+
+[_spawnPos, _surfaceNormal]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/set_damage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/set_damage.sqf
new file mode 100644
index 0000000..6d8ea37
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/set_damage.sqf
@@ -0,0 +1,49 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_set_damage
+
+Description:
+ Set ACE damage.
+
+Parameters:
+ _unit - Unit taking damage. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player] call btc_fnc_set_damage;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+private _selection = [
+ "head",
+ "body",
+ "hand_l",
+ "hand_r",
+ "leg_l",
+ "leg_r"
+];
+private _type = [
+ "bullet",
+ "grenade"/*,
+ "explosive",
+ "shell"*/
+];
+
+_unit setVariable ["ace_medical_ai_lastFired", 9999999]; //Disable AI to self healing
+
+for "_i" from 0 to (1 + floor random 2) do {
+ [_unit, 0.4, selectRandom _selection, selectRandom _type] call ace_medical_fnc_addDamageToUnit;
+ sleep 1;
+};
+
+if (_unit call ace_medical_status_fnc_isInStableCondition) exitWith {[_unit] call btc_fnc_set_damage;};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/set_markerTextLocal.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/set_markerTextLocal.sqf
new file mode 100644
index 0000000..8a5e789
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/set_markerTextLocal.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_set_markerTextLocal
+
+Description:
+ Add local text to a marker.
+
+Parameters:
+ _marker - Marker to add text locally [String]
+ _text - Text to add locally. [String]
+ _arg - Argument for custom text. [String, Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_fnc_set_markerTextLocal;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_marker", "", [""]],
+ ["_text", "", [""]],
+ ["_arg", "", ["", 0]]
+];
+
+_text = if (isLocalized _text) then {localize _text};
+
+_marker setMarkerTextLocal format [_text, _arg];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/showSubtitle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/showSubtitle.sqf
new file mode 100644
index 0000000..4a90ebc
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/showSubtitle.sqf
@@ -0,0 +1,86 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_showSubtitle
+
+Description:
+ Show text as a subtitle.
+
+Parameters:
+ _from - Name of the person speaking [String]
+ _text - Contents of the subtitle [String]
+ _lineBreak - Add a line break [Boolean]
+ _colorFrom - HEX color for speaker (#RGB or #ARGB) [String]
+ _colorText - HEX color for content (#RGB or #ARGB) [String]
+ _fontText - Font (https://community.bistudio.com/wiki/FXY_File_Format#Available_Fonts) [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["Some Guy","How do yo do?"] call btc_fnc_showSubtitle;
+ ["Darth Vader","Come to the dark side. We have cookies!", false, "#ed2939"] call btc_fnc_showSubtitle;
+ ["Luke Skywalker","Whhhhhhyyyyyyyy", true, "#1768d3", nil, "PuristaBold"] call btc_fnc_showSubtitle;
+ (end)
+
+Author:
+ Thomas Ryan
+
+---------------------------------------------------------------------------- */
+
+#define WAIT 10
+#define POS_W (0.4 * safeZoneW)
+#define POS_H (safeZoneH)
+#define POS_X (0.5 - POS_W / 2)
+#define POS_Y (safeZoneY + (6/8) * safeZoneH)
+#define POS_Y_CAM (safeZoneY + (31/32) * safeZoneH)
+
+disableSerialization;
+// Create display and control
+"btc_fnc_showSubtitle" cutRsc ["RscDynamicText", "PLAIN"];
+[{private _display = uiNamespace getVariable "BIS_dynamicText"; !(isNull _display)}, {
+
+ params [
+ ["_from", "", [""]],
+ ["_text", "", [""]],
+ ["_lineBreak", false, [false]],
+ ["_colorFrom", "#d4cd00", [""]], //default color: gold
+ ["_colorText", "#FFFFFF", [""]], //default color: white
+ ["_fontText", "RobotoCondensedBold", [""]]
+ ];
+
+ private _display = uiNamespace getVariable "BIS_dynamicText";
+ private _ctrl = _display ctrlCreate ["RscStructuredText",-1];
+ uiNamespace setVariable ["BIS_dynamicText", displayNull];
+
+ _ctrl ctrlSetBackgroundColor (["Subtitles","Background"] call bis_fnc_displayColorGet);
+ //_ctrl ctrlSetBackgroundColor [0, 0, 0, 0.5]; //optional? - for better readability
+ _ctrl ctrlSetTextColor (["Subtitles", "Text"] call bis_fnc_displayColorGet);
+ _ctrl ctrlSetPosition [POS_X, POS_Y, POS_W, POS_H];
+ _ctrl ctrlCommit 0;
+
+ // Show subtitle
+ _ctrl ctrlSetStructuredText parseText format [
+ if (_from isEqualTo "") then {
+ "%2"
+ } else {
+ if (_lineBreak) then {
+ "%1:
%2"
+ } else {
+ "%1: %2"
+ };
+ },
+ toUpper _from, _text, (safezoneH * 0.65) max 1, _colorFrom, _colorText, _fontText
+ ];
+
+ private _textHeight = ctrlTextHeight _ctrl;
+ _ctrl ctrlSetPosition [POS_X, POS_Y - _textHeight, POS_W, _textHeight];
+ _ctrl ctrlcommit 0;
+
+ [{
+ params ["_ctrl"];
+
+ // Hide subtitle
+ _ctrl ctrlSetFade 1;
+ _ctrl ctrlCommit 0.5;
+ }, [_ctrl], WAIT] call CBA_fnc_waitAndExecute;
+}, _this] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/show_hint.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/show_hint.sqf
new file mode 100644
index 0000000..d90e03d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/show_hint.sqf
@@ -0,0 +1,132 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_show_hint
+
+Description:
+ Show CBA_fnc_notify.
+
+Parameters:
+ _type - Type of CBA_fnc_notify to show. [Number]
+ _custom - Argument for custom text. [String, Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [0] call btc_fnc_show_hint;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+if (isDedicated) exitWith {};
+
+params [
+ ["_type", 0, [0]],
+ ["_custom", 0, [0, "", []]]
+];
+
+private _text = switch (_type) do {
+ case 0 : {
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_0";
+ };
+ case 1 : {
+ [
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_1"],
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_MU"],
+ ['\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa', 0.8, [1, 0, 0]]
+ ];
+ };
+ case 2 : {
+ format [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_2", _custom];
+ };
+ case 3 : {
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_3";
+ };
+ case 5 : {
+ [
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_5"],
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_MU"],
+ ['\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa', 0.8, [1, 0, 0]]
+ ];
+ };
+ case 7 : {
+ format [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_7", _custom];
+ };
+ case 8 : {
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_8";
+ };
+ case 9 : {
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_9";
+ };
+ case 10 : {
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_10";
+ };
+ case 12 : {
+ localize "STR_BTC_HAM_SIDE_CONVOY_STARTCHAT";
+ };
+ case 14 : {
+ [
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_14"],
+ [getText (configfile >> "CfgVehicles" >> _custom >> "editorPreview"), 8]
+ ];
+ };
+ case 15 : {
+ [
+ [localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_15"],
+ [getText (configfile >> "CfgVehicles" >> _custom >> "editorPreview"), 8]
+ ];
+ };
+ case 16 : {
+ [
+ [localize "STR_BTC_HAM_LOG_RWRECK_ISHELO"],
+ ["\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa"]
+ ];
+ };
+ case 17 : {
+ [
+ [localize "STR_BTC_HAM_LOG_LPDELETE"],
+ ["\z\ace\addons\arsenal\data\iconClearContainer.paa"]
+ ];
+ };
+ case 18 : {
+ localize "STR_BTC_HAM_O_FOB_DISMANTLE_H_PROC";
+ };
+ case 19 : {
+ [
+ format [localize "STR_BTC_HAM_O_COMMON_REBOOT", _custom], 1.5, [1, 0, 0]
+ ];
+ };
+ case 20 : {
+ _custom params ["_color", "_player"];
+ [
+ [[name _player], [" "]] select (isNull _player),
+ ["\A3\Data_F_Orange\Logos\arma3_orange_picture_ca.paa", 4, _color],
+ [" "]
+ ];
+ };
+ case 21 : {
+ _custom params ["_color", "_player"];
+ [
+ [[name _player], [" "]] select (isNull _player || (side group _player isNotEqualTo btc_player_side)),
+ ["\a3\Ui_f\data\GUI\Cfg\Debriefing\endDefault_ca.paa", 4, _color],
+ [" "]
+ ];
+ };
+ case 22 : {
+ localize "STR_BTC_HAM_O_COMMON_TICKETADD";
+ };
+ case 23 : {
+ localize "STR_BTC_HAM_O_COMMON_NOBODYBAG";
+ };
+ case 24 : {
+ format [localize "STR_BTC_HAM_O_COMMON_TICKETSLEFT", _custom];
+ };
+ case 25 : {
+ localize "STR_BTC_HAM_O_COMMON_NOPLAYERFTICKET";
+ };
+};
+
+_text call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/typeOf.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/typeOf.sqf
new file mode 100644
index 0000000..47d15ec
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/typeOf.sqf
@@ -0,0 +1,57 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_typeOf
+
+Description:
+ Get the classe name of an object. Very usefull for terrain objects.
+
+Parameters:
+ _object - Object to get the typeOf. [Object]
+
+Returns:
+ _calssenameArray - Array of classename. [Array]
+
+Examples:
+ (begin example)
+ a = nearestTerrainObjects [player, [], 3, false];
+ [[a select 0]] call btc_fnc_typeOf;
+ (end)
+
+Author:
+ PabstMirror
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_objectArray", [], [[]]]
+];
+
+if (isNil "btc_modelNamespace") then {
+ btc_modelNamespace = createHashMap;
+};
+
+private _cfgVehicles = configFile >> "cfgVehicles";
+
+_objectArray apply {
+ private _type = typeOf _x;
+
+ if (_type == "") then {
+ private _model = (getModelInfo _x) select 1;
+ if (_model == "") exitWith {""};
+ _type = btc_modelNamespace get _model;
+ if (isNil "_type") then {
+ private _objects = configProperties [
+ _cfgVehicles,
+ "(isClass _x) && {(((getText (_x >> 'model')) select [1]) == _model) || {(getText (_x >> 'model')) == _model}}",
+ true
+ ];
+ if (_objects isEqualTo []) then {
+ _type = "";
+ } else {
+ _type = configName (_objects select 0);
+ };
+ btc_modelNamespace set [_model, _type];
+ };
+ };
+ _type
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/common/typeOfPreview.sqf b/hearts_and_minds.kunduz_valley/core/fnc/common/typeOfPreview.sqf
new file mode 100644
index 0000000..9df951c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/common/typeOfPreview.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fnc_typeOfPreview
+
+Description:
+ Return the picture of a class name.
+
+Parameters:
+ _typeOf - Class name of the object to preview. [String]
+ _width - Width in pixel. [Number]
+ _height - Height in pixel. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [typeOf player] call btc_fnc_typeOfPreview;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_typeOf", "Land_PowerGenerator_F", [""]],
+ ["_width", 355, [0]],
+ ["_height", 200, [0]]
+];
+
+format [
+ "
",
+ getText (configfile >> "CfgVehicles" >> _typeOf >> "editorPreview"),
+ _width,
+ _height
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/compile.sqf b/hearts_and_minds.kunduz_valley/core/fnc/compile.sqf
new file mode 100644
index 0000000..e787b8b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/compile.sqf
@@ -0,0 +1,444 @@
+/////////////////////SERVER\\\\\\\\\\\\\\\\\\\\\
+if (isServer) then {
+ //BODY
+ btc_body_fnc_bagRecover_s = compileScript ["core\fnc\body\bagRecover_s.sqf"];
+ btc_body_fnc_createMarker = compileScript ["core\fnc\body\createMarker.sqf"];
+ btc_body_fnc_dogtagGet = compileScript ["core\fnc\body\dogtagGet.sqf"];
+ btc_body_fnc_dogtagSet = compileScript ["core\fnc\body\dogtagSet.sqf"];
+ btc_body_fnc_setBodyBag = compileScript ["core\fnc\body\setBodyBag.sqf"];
+ btc_body_fnc_create = compileScript ["core\fnc\body\create.sqf"];
+ btc_body_fnc_get = compileScript ["core\fnc\body\get.sqf"];
+
+ //CACHE
+ btc_cache_fnc_find_pos = compileScript ["core\fnc\cache\find_pos.sqf"];
+ btc_cache_fnc_create = compileScript ["core\fnc\cache\create.sqf"];
+ btc_cache_fnc_create_attachto = compileScript ["core\fnc\cache\create_attachto.sqf"];
+ btc_cache_fnc_init = compileScript ["core\fnc\cache\init.sqf"];
+
+ //COMMON
+ btc_fnc_check_los = compileScript ["core\fnc\common\check_los.sqf"];
+ btc_fnc_create_composition = compileScript ["core\fnc\common\create_composition.sqf"];
+ btc_fnc_house_addWP = compileScript ["core\fnc\common\house_addWP.sqf"];
+ btc_fnc_set_damage = compileScript ["core\fnc\common\set_damage.sqf"];
+ btc_fnc_road_direction = compileScript ["core\fnc\common\road_direction.sqf"];
+ btc_fnc_findsafepos = compileScript ["core\fnc\common\findsafepos.sqf"];
+ btc_fnc_find_closecity = compileScript ["core\fnc\common\find_closecity.sqf"];
+ btc_fnc_delete = compileScript ["core\fnc\common\delete.sqf"];
+ btc_fnc_deleteEntities = compileScript ["core\fnc\common\deleteEntities.sqf"];
+ btc_fnc_final_phase = compileScript ["core\fnc\common\final_phase.sqf"];
+ btc_fnc_findPosOutsideRock = compileScript ["core\fnc\common\findposoutsiderock.sqf"];
+ btc_fnc_typeOf = compileScript ["core\fnc\common\typeOf.sqf"];
+ btc_fnc_roof = compileScript ["core\fnc\common\roof.sqf"];
+ btc_fnc_moveOut = compileScript ["core\fnc\common\moveOut.sqf"];
+ btc_fnc_changeWeather = compileScript ["core\fnc\common\changeWeather.sqf"];
+
+ //CHEM
+ btc_chem_fnc_checkLoop = compileScript ["core\fnc\chem\checkLoop.sqf"];
+ btc_chem_fnc_propagate = compileScript ["core\fnc\chem\propagate.sqf"];
+ btc_chem_fnc_handleShower = compileScript ["core\fnc\chem\handleShower.sqf"];
+
+ //SPECT
+ btc_spect_fnc_checkLoop = compileScript ["core\fnc\spect\checkLoop.sqf"];
+ btc_spect_fnc_electronicFailure = compileScript ["core\fnc\spect\electronicFailure.sqf"];
+
+ //CITY
+ btc_city_fnc_activate = compileScript ["core\fnc\city\activate.sqf"];
+ btc_city_fnc_create = compileScript ["core\fnc\city\create.sqf"];
+ btc_city_fnc_de_activate = compileScript ["core\fnc\city\de_activate.sqf"];
+ btc_city_fnc_setClear = compileScript ["core\fnc\city\setClear.sqf"];
+ btc_city_fnc_setPlayerTrigger = compileScript ["core\fnc\city\setPlayerTrigger.sqf"];
+ btc_city_fnc_cleanUp = compileScript ["core\fnc\city\cleanUp.sqf"];
+ btc_city_fnc_trigger_free_condition = compileScript ["core\fnc\city\trigger_free_condition.sqf"];
+ btc_city_fnc_getHouses = compileScript ["core\fnc\city\getHouses.sqf"];
+ btc_city_fnc_send = compileScript ["core\fnc\city\send.sqf"];
+
+ //CIV
+ btc_civ_fnc_add_grenade = compileScript ["core\fnc\civ\add_grenade.sqf"];
+ btc_civ_fnc_get_weapons = compileScript ["core\fnc\civ\get_weapons.sqf"];
+ btc_civ_fnc_get_grenade = compileScript ["core\fnc\civ\get_grenade.sqf"];
+ btc_civ_fnc_populate = compileScript ["core\fnc\civ\populate.sqf"];
+ btc_civ_fnc_create_patrol = compileScript ["core\fnc\civ\create_patrol.sqf"];
+ btc_civ_fnc_evacuate = compileScript ["core\fnc\civ\evacuate.sqf"];
+ btc_civ_fnc_createFlower = compileScript ["core\fnc\civ\createFlower.sqf"];
+ btc_civ_fnc_createGrave = compileScript ["core\fnc\civ\createGrave.sqf"];
+
+ //DATA
+ btc_data_fnc_add_group = compileScript ["core\fnc\data\add_group.sqf"];
+ btc_data_fnc_get_group = compileScript ["core\fnc\data\get_group.sqf"];
+ btc_data_fnc_spawn_group = compileScript ["core\fnc\data\spawn_group.sqf"];
+
+ //DB
+ btc_db_fnc_save = compileScript ["core\fnc\db\save.sqf"];
+ btc_db_fnc_delete = compileScript ["core\fnc\db\delete.sqf"];
+ btc_db_fnc_loadObjectStatus = compileScript ["core\fnc\db\loadObjectStatus.sqf"];
+ btc_db_fnc_saveObjectStatus = compileScript ["core\fnc\db\saveObjectStatus.sqf"];
+ btc_db_fnc_loadCargo = compileScript ["core\fnc\db\loadcargo.sqf"];
+ btc_db_fnc_autoRestart = compileScript ["core\fnc\db\autoRestart.sqf"];
+ btc_db_fnc_setTurretMagazines = compileScript ["core\fnc\db\setTurretMagazines.sqf"];
+ btc_db_fnc_autoRestartLoop = compileScript ["core\fnc\db\autoRestartLoop.sqf"];
+
+ //DELAY
+ btc_delay_fnc_createUnit = compileScript ["core\fnc\delay\createUnit.sqf"];
+ btc_delay_fnc_createVehicle = compileScript ["core\fnc\delay\createVehicle.sqf"];
+ btc_delay_fnc_createAgent = compileScript ["core\fnc\delay\createAgent.sqf"];
+ btc_delay_fnc_exec = compileScript ["core\fnc\delay\exec.sqf"];
+ btc_delay_fnc_waitAndExecute = compileScript ["core\fnc\delay\waitAndExecute.sqf"];
+
+ //DOOR
+ btc_door_fnc_lock = compileScript ["core\fnc\door\lock.sqf"];
+ btc_door_fnc_get = compileScript ["core\fnc\door\get.sqf"];
+
+ //EH
+ btc_eh_fnc_server = compileScript ["core\fnc\eh\server.sqf"];
+ btc_eh_fnc_playerConnected = compileScript ["core\fnc\eh\playerConnected.sqf"];
+
+ //IED
+ btc_ied_fnc_boom = compileScript ["core\fnc\ied\boom.sqf"];
+ btc_ied_fnc_check = compileScript ["core\fnc\ied\check.sqf"];
+ btc_ied_fnc_checkLoop = compileScript ["core\fnc\ied\checkLoop.sqf"];
+ btc_ied_fnc_create = compileScript ["core\fnc\ied\create.sqf"];
+ btc_ied_fnc_fired_near = compileScript ["core\fnc\ied\fired_near.sqf"];
+ btc_ied_fnc_initArea = compileScript ["core\fnc\ied\initArea.sqf"];
+ btc_ied_fnc_suicider_active = compileScript ["core\fnc\ied\suicider_active.sqf"];
+ btc_ied_fnc_suicider_activeLoop = compileScript ["core\fnc\ied\suicider_activeLoop.sqf"];
+ btc_ied_fnc_suicider_create = compileScript ["core\fnc\ied\suicider_create.sqf"];
+ btc_ied_fnc_suiciderLoop = compileScript ["core\fnc\ied\suiciderLoop.sqf"];
+ btc_ied_fnc_allahu_akbar = compileScript ["core\fnc\ied\allahu_akbar.sqf"];
+ btc_ied_fnc_drone_active = compileScript ["core\fnc\ied\drone_active.sqf"];
+ btc_ied_fnc_drone_create = compileScript ["core\fnc\ied\drone_create.sqf"];
+ btc_ied_fnc_droneLoop = compileScript ["core\fnc\ied\droneLoop.sqf"];
+ btc_ied_fnc_drone_fire = compileScript ["core\fnc\ied\drone_fire.sqf"];
+ btc_ied_fnc_randomRoadPos = compileScript ["core\fnc\ied\randomRoadPos.sqf"];
+
+ //INFO
+ btc_info_fnc_cache = compileScript ["core\fnc\info\cache.sqf"];
+ btc_info_fnc_give_intel = compileScript ["core\fnc\info\give_intel.sqf"];
+ btc_info_fnc_has_intel = compileScript ["core\fnc\info\has_intel.sqf"];
+ btc_info_fnc_hideout = compileScript ["core\fnc\info\hideout.sqf"];
+ btc_info_fnc_cacheMarker = compileScript ["core\fnc\info\cacheMarker.sqf"];
+ btc_info_fnc_path = compileScript ["core\fnc\info\path.sqf"];
+ btc_info_fnc_createIntels = compileScript ["core\fnc\info\createIntels.sqf"];
+
+ //FOB
+ btc_fob_fnc_create_s = compileScript ["core\fnc\fob\create_s.sqf"];
+ btc_fob_fnc_dismantle_s = compileScript ["core\fnc\fob\dismantle_s.sqf"];
+ btc_fob_fnc_killed = compileScript ["core\fnc\fob\killed.sqf"];
+ btc_fob_fnc_rallypointTimer = compileScript ["core\fnc\fob\rallypointTimer.sqf"];
+
+ //MIL
+ btc_mil_fnc_addWP = compileScript ["core\fnc\mil\addWP.sqf"];
+ btc_mil_fnc_check_cap = compileScript ["core\fnc\mil\check_cap.sqf"];
+ btc_mil_fnc_create_group = compileScript ["core\fnc\mil\create_group.sqf"];
+ btc_mil_fnc_create_static = compileScript ["core\fnc\mil\create_static.sqf"];
+ btc_mil_fnc_create_patrol = compileScript ["core\fnc\mil\create_patrol.sqf"];
+ btc_mil_fnc_send = compileScript ["core\fnc\mil\send.sqf"];
+ btc_mil_fnc_set_skill = compileScript ["core\fnc\mil\set_skill.sqf"];
+ btc_mil_fnc_getStructures = compileScript ["core\fnc\mil\getStructures.sqf"];
+ btc_mil_fnc_getBuilding = compileScript ["core\fnc\mil\getBuilding.sqf"];
+ btc_mil_fnc_createVehicle = compileScript ["core\fnc\mil\createVehicle.sqf"];
+ btc_mil_fnc_createUnits = compileScript ["core\fnc\mil\createUnits.sqf"];
+ btc_mil_fnc_unit_killed = compileScript ["core\fnc\mil\unit_killed.sqf"];
+ btc_mil_fnc_create_staticOnRoof = compileScript ["core\fnc\mil\create_staticOnRoof.sqf"];
+
+ //HIDEOUT
+ btc_hideout_fnc_hd = compileScript ["core\fnc\hideout\hd.sqf"];
+ btc_hideout_fnc_create = compileScript ["core\fnc\hideout\create.sqf"];
+ btc_hideout_fnc_create_composition = compileScript ["core\fnc\hideout\create_composition.sqf"];
+
+ //PATROL
+ btc_patrol_fnc_playersInAreaCityGroup = compileScript ["core\fnc\patrol\playersInAreaCityGroup.sqf"];
+ btc_patrol_fnc_usefulCity = compileScript ["core\fnc\patrol\usefulCity.sqf"];
+ btc_patrol_fnc_WPCheck = compileScript ["core\fnc\patrol\WPCheck.sqf"];
+ btc_patrol_fnc_init = compileScript ["core\fnc\patrol\init.sqf"];
+ btc_patrol_fnc_addWP = compileScript ["core\fnc\patrol\addWP.sqf"];
+ btc_patrol_fnc_eh = compileScript ["core\fnc\patrol\eh.sqf"];
+ btc_patrol_fnc_addEH = compileScript ["core\fnc\patrol\addEH.sqf"];
+
+ //SLOT
+ btc_slot_fnc_serializeState = compileScript ["core\fnc\slot\serializeState.sqf"];
+ btc_slot_fnc_deserializeState_s = compileScript ["core\fnc\slot\deserializeState_s.sqf"];
+ btc_slot_fnc_createKey = compileScript ["core\fnc\slot\createKey.sqf"];
+
+ //REP
+ btc_rep_fnc_call_militia = compileScript ["core\fnc\rep\call_militia.sqf"];
+ btc_rep_fnc_change = compileScript ["core\fnc\rep\change.sqf"];
+ btc_rep_fnc_eh_effects = compileScript ["core\fnc\rep\eh_effects.sqf"];
+ btc_rep_fnc_hh = compileScript ["core\fnc\rep\hh.sqf"];
+ btc_rep_fnc_buildingchanged = compileScript ["core\fnc\rep\buildingchanged.sqf"];
+ btc_rep_fnc_explosives_defuse = compileScript ["core\fnc\rep\explosives_defuse.sqf"];
+ btc_rep_fnc_notify = compileScript ["core\fnc\rep\notify.sqf"];
+ btc_rep_fnc_killed = compileScript ["core\fnc\rep\killed.sqf"];
+ btc_rep_fnc_wheelChange = compileScript ["core\fnc\rep\wheelChange.sqf"];
+ btc_rep_fnc_grave = compileScript ["core\fnc\rep\grave.sqf"];
+
+ //RESPAWN
+ btc_respawn_fnc_addTicket = compileScript ["core\fnc\respawn\addTicket.sqf"];
+ btc_respawn_fnc_playerConnected = compileScript ["core\fnc\respawn\playerConnected.sqf"];
+ btc_respawn_fnc_player = compileScript ["core\fnc\respawn\player.sqf"];
+
+ //SIDE
+ btc_side_fnc_create = compileScript ["core\fnc\side\create.sqf"];
+ btc_side_fnc_get_city = compileScript ["core\fnc\side\get_city.sqf"];
+ btc_side_fnc_mines = compileScript ["core\fnc\side\mines.sqf"];
+ btc_side_fnc_supply = compileScript ["core\fnc\side\supply.sqf"];
+ btc_side_fnc_vehicle = compileScript ["core\fnc\side\vehicle.sqf"];
+ btc_side_fnc_civtreatment = compileScript ["core\fnc\side\civtreatment.sqf"];
+ btc_side_fnc_tower = compileScript ["core\fnc\side\tower.sqf"];
+ btc_side_fnc_checkpoint = compileScript ["core\fnc\side\checkpoint.sqf"];
+ btc_side_fnc_civtreatment_boat = compileScript ["core\fnc\side\civtreatment_boat.sqf"];
+ btc_side_fnc_underwater_generator= compileScript ["core\fnc\side\underwater_generator.sqf"];
+ btc_side_fnc_convoy = compileScript ["core\fnc\side\convoy.sqf"];
+ btc_side_fnc_rescue = compileScript ["core\fnc\side\rescue.sqf"];
+ btc_side_fnc_capture_officer = compileScript ["core\fnc\side\capture_officer.sqf"];
+ btc_side_fnc_hostage = compileScript ["core\fnc\side\hostage.sqf"];
+ btc_side_fnc_hack = compileScript ["core\fnc\side\hack.sqf"];
+ btc_side_fnc_kill = compileScript ["core\fnc\side\kill.sqf"];
+ btc_side_fnc_chemicalLeak = compileScript ["core\fnc\side\chemicalLeak.sqf"];
+ btc_side_fnc_EMP = compileScript ["core\fnc\side\EMP.sqf"];
+ btc_side_fnc_removeRubbish = compileScript ["core\fnc\side\removeRubbish.sqf"];
+ btc_side_fnc_pandemic = compileScript ["core\fnc\side\pandemic.sqf"];
+ btc_side_fnc_massacre = compileScript ["core\fnc\side\massacre.sqf"];
+
+ //TAG
+ btc_tag_fnc_initArea = compileScript ["core\fnc\tag\initArea.sqf"];
+ btc_tag_fnc_eh = compileScript ["core\fnc\tag\eh.sqf"];
+ btc_tag_fnc_create = compileScript ["core\fnc\tag\create.sqf"];
+ btc_tag_fnc_vehicle = compileScript ["core\fnc\tag\vehicle.sqf"];
+
+ //LOG
+ btc_log_fnc_createVehicle = compileScript ["core\fnc\log\createVehicle.sqf"];
+ btc_log_fnc_init = compileScript ["core\fnc\log\init.sqf"];
+ btc_log_fnc_server_delete = compileScript ["core\fnc\log\server_delete.sqf"];
+ btc_log_fnc_create_s = compileScript ["core\fnc\log\create_s.sqf"];
+ btc_log_fnc_server_repair_wreck = compileScript ["core\fnc\log\server_repair_wreck.sqf"];
+
+ //DEAF
+ btc_deaf_fnc_earringing = compileScript ["core\fnc\deaf\earringing.sqf"];
+
+ //TASK
+ btc_task_fnc_create = compileScript ["core\fnc\task\create.sqf"];
+ btc_task_fnc_setState = compileScript ["core\fnc\task\setState.sqf"];
+
+ //TOW
+ btc_tow_fnc_ropeBreak = compileScript ["core\fnc\tow\ropeBreak.sqf"];
+ btc_tow_fnc_ViV = compileScript ["core\fnc\tow\ViV.sqf"];
+
+ //VEH
+ btc_veh_fnc_addRespawn = compileScript ["core\fnc\veh\addRespawn.sqf"];
+ btc_veh_fnc_killed = compileScript ["core\fnc\veh\killed.sqf"];
+ btc_veh_fnc_respawn = compileScript ["core\fnc\veh\respawn.sqf"];
+ btc_veh_fnc_propertiesGet = compileScript ["core\fnc\veh\propertiesGet.sqf"];
+ btc_veh_fnc_propertiesSet = compileScript ["core\fnc\veh\propertiesSet.sqf"];
+ btc_veh_fnc_add = compileScript ["core\fnc\veh\add.sqf"];
+ btc_veh_fnc_inventoryRestore = compileScript ["core\fnc\veh\inventoryRestore.sqf"];
+};
+
+/////////////////////CLIENT AND SERVER\\\\\\\\\\\\\\\\\\\\\
+
+//CACHE
+btc_cache_fnc_hd = compileScript ["core\fnc\cache\hd.sqf"];
+
+//COMMON
+btc_fnc_get_class = compileScript ["core\fnc\common\get_class.sqf"];
+btc_fnc_randomize_pos = compileScript ["core\fnc\common\randomize_pos.sqf"];
+btc_fnc_getHouses = compileScript ["core\fnc\common\getHouses.sqf"];
+btc_fnc_house_addWP_loop = compileScript ["core\fnc\common\house_addWP_loop.sqf"];
+
+//CHEM
+btc_chem_fnc_damage = compileScript ["core\fnc\chem\damage.sqf"];
+btc_chem_fnc_deconShowerAnimLarge = {(_this select 0) setVariable ["BIN_Shower_Stop",false]; _this call BIN_fnc_deconShowerAnimLarge;};
+btc_chem_fnc_damageLoop = compileScript ["core\fnc\chem\damageLoop.sqf"];
+
+//DOOR
+btc_door_fnc_broke = compileScript ["core\fnc\door\broke.sqf"];
+
+//DEBUG
+btc_debug_fnc_message = compileScript ["core\fnc\debug\message.sqf"];
+
+//EH
+btc_eh_fnc_trackItem = compileScript ["core\fnc\eh\trackItem.sqf"];
+
+//FLAG
+btc_flag_fnc_int = compileScript ["core\fnc\flag\int.sqf"];
+
+//CIV
+btc_civ_fnc_class = compileScript ["core\fnc\civ\class.sqf"];
+btc_civ_fnc_addWP = compileScript ["core\fnc\civ\addWP.sqf"];
+btc_civ_fnc_add_weapons = compileScript ["core\fnc\civ\add_weapons.sqf"];
+
+//IED
+btc_ied_fnc_belt = compileScript ["core\fnc\ied\belt.sqf"];
+
+//INT
+btc_int_fnc_orders_give = compileScript ["core\fnc\int\orders_give.sqf"];
+btc_int_fnc_orders_behaviour = compileScript ["core\fnc\int\orders_behaviour.sqf"];
+btc_int_fnc_ask_var = compileScript ["core\fnc\int\ask_var.sqf"];
+
+//LOG
+btc_log_fnc_place_destroy_camera = compileScript ["core\fnc\log\place_destroy_camera.sqf"];
+btc_log_fnc_inventoryGet = compileScript ["core\fnc\log\inventoryGet.sqf"];
+btc_log_fnc_inventorySet = compileScript ["core\fnc\log\inventorySet.sqf"];
+
+//MIL
+btc_mil_fnc_class = compileScript ["core\fnc\mil\class.sqf"];
+btc_mil_fnc_ammoUsage = compileScript ["core\fnc\mil\ammoUsage.sqf"];
+
+//PATROL
+btc_patrol_fnc_disabled = compileScript ["core\fnc\patrol\disabled.sqf"];
+
+//REP
+btc_rep_fnc_hd = compileScript ["core\fnc\rep\hd.sqf"];
+btc_rep_fnc_suppressed = compileScript ["core\fnc\rep\suppressed.sqf"];
+btc_rep_fnc_foodRemoved = compileScript ["core\fnc\rep\foodRemoved.sqf"];
+
+//ARSENAL
+btc_arsenal_fnc_ammoUsage = compileScript ["core\fnc\arsenal\ammoUsage.sqf"];
+
+//TOW
+btc_tow_fnc_int = compileScript ["core\fnc\tow\int.sqf"];
+
+//VEH
+btc_veh_fnc_init = compileScript ["core\fnc\veh\init.sqf"];
+
+/////////////////////CLIENT\\\\\\\\\\\\\\\\\\\\\
+if (!isDedicated) then {
+ //BODY
+ btc_body_fnc_bagRecover = compileScript ["core\fnc\body\bagRecover.sqf"];
+
+ //COMMON
+ btc_fnc_end_mission = compileScript ["core\fnc\common\end_mission.sqf"];
+ btc_fnc_get_cardinal = compileScript ["core\fnc\common\get_cardinal.sqf"];
+ btc_fnc_show_hint = compileScript ["core\fnc\common\show_hint.sqf"];
+ btc_fnc_set_markerTextLocal = compileScript ["core\fnc\common\set_markerTextLocal.sqf"];
+ btc_fnc_showSubtitle = compileScript ["core\fnc\common\showSubtitle.sqf"];
+ btc_fnc_get_composition = compileScript ["core\fnc\common\get_composition.sqf"];
+ btc_fnc_checkArea = compileScript ["core\fnc\common\checkArea.sqf"];
+ btc_fnc_typeOfPreview = compileScript ["core\fnc\common\typeOfPreview.sqf"];
+
+ //CHEM
+ btc_chem_fnc_biopsy = compileScript ["core\fnc\chem\biopsy.sqf"];
+ btc_chem_fnc_ehDetector = compileScript ["core\fnc\chem\ehDetector.sqf"];
+ btc_chem_fnc_updateDetector = compileScript ["core\fnc\chem\updateDetector.sqf"];
+
+ //DEBUG
+ btc_debug_fnc_marker = compileScript ["core\fnc\debug\marker.sqf"];
+ btc_debug_fnc_units = compileScript ["core\fnc\debug\units.sqf"];
+ btc_debug_fnc_fps = compileScript ["core\fnc\debug\fps.sqf"];
+ btc_debug_fnc_graph = compileScript ["core\fnc\debug\graph.sqf"];
+
+ //CIV
+ btc_civ_fnc_add_leaflets = compileScript ["core\fnc\civ\add_leaflets.sqf"];
+ btc_civ_fnc_leaflets = compileScript ["core\fnc\civ\leaflets.sqf"];
+
+ //DOOR
+ btc_door_fnc_break = compileScript ["core\fnc\door\break.sqf"];
+
+ //IED
+ btc_ied_fnc_effects = compileScript ["core\fnc\ied\effects.sqf"];
+ btc_ied_fnc_effect_smoke = compileScript ["core\fnc\ied\effect_smoke.sqf"];
+ btc_ied_fnc_effect_color_smoke = compileScript ["core\fnc\ied\effect_color_smoke.sqf"];
+ btc_ied_fnc_effect_rocks = compileScript ["core\fnc\ied\effect_rocks.sqf"];
+ btc_ied_fnc_effect_blurEffect = compileScript ["core\fnc\ied\effect_blurEffect.sqf"];
+ btc_ied_fnc_effect_shock_wave = compileScript ["core\fnc\ied\effect_shock_wave.sqf"];
+ btc_ied_fnc_deleteLoop = compileScript ["core\fnc\ied\deleteLoop.sqf"];
+
+ //EH
+ btc_eh_fnc_CuratorObjectPlaced = compileScript ["core\fnc\eh\CuratorObjectPlaced.sqf"];
+ btc_eh_fnc_player = compileScript ["core\fnc\eh\player.sqf"];
+
+ //FLAG
+ btc_flag_fnc_deploy = compileScript ["core\fnc\flag\deploy.sqf"];
+
+ //FOB
+ btc_fob_fnc_create = compileScript ["core\fnc\fob\create.sqf"];
+ btc_fob_fnc_rallypointAssemble = compileScript ["core\fnc\fob\rallypointAssemble.sqf"];
+ btc_fob_fnc_redeploy = compileScript ["core\fnc\fob\redeploy.sqf"];
+ btc_fob_fnc_redeployCheck = compileScript ["core\fnc\fob\redeployCheck.sqf"];
+ btc_fob_fnc_addInteraction = compileScript ["core\fnc\fob\addInteraction.sqf"];
+
+ //INT
+ btc_int_fnc_add_actions = compileScript ["core\fnc\int\add_actions.sqf"];
+ btc_int_fnc_orders = compileScript ["core\fnc\int\orders.sqf"];
+ btc_int_fnc_shortcuts = compileScript ["core\fnc\int\shortcuts.sqf"];
+ btc_int_fnc_terminal = compileScript ["core\fnc\int\terminal.sqf"];
+ btc_int_fnc_foodGive = compileScript ["core\fnc\int\foodGive.sqf"];
+ btc_int_fnc_ordersLoop = compileScript ["core\fnc\int\ordersLoop.sqf"];
+ btc_int_fnc_checkSirenBeacons = compileScript ["core\fnc\int\checkSirenBeacons.sqf"];
+ btc_int_fnc_horn = compileScript ["core\fnc\int\horn.sqf"];
+
+ //INFO
+ btc_info_fnc_ask = compileScript ["core\fnc\info\ask.sqf"];
+ btc_info_fnc_hideout_asked = compileScript ["core\fnc\info\hideout_asked.sqf"];
+ btc_info_fnc_search_for_intel = compileScript ["core\fnc\info\search_for_intel.sqf"];
+ btc_info_fnc_troops = compileScript ["core\fnc\info\troops.sqf"];
+ btc_info_fnc_ask_reputation = compileScript ["core\fnc\info\ask_reputation.sqf"];
+ btc_info_fnc_cachePicture = compileScript ["core\fnc\info\cachePicture.sqf"];
+
+ //LIFT
+ btc_lift_fnc_check = compileScript ["core\fnc\lift\check.sqf"];
+ btc_lift_fnc_deployRopes = compileScript ["core\fnc\lift\deployRopes.sqf"];
+ btc_lift_fnc_destroyRopes = compileScript ["core\fnc\lift\destroyRopes.sqf"];
+ btc_lift_fnc_hook = compileScript ["core\fnc\lift\hook.sqf"];
+ btc_lift_fnc_hookFake = compileScript ["core\fnc\lift\hookFake.sqf"];
+ btc_lift_fnc_hud = compileScript ["core\fnc\lift\hud.sqf"];
+ btc_lift_fnc_hudLoop = compileScript ["core\fnc\lift\hudLoop.sqf"];
+ btc_lift_fnc_shortcuts = compileScript ["core\fnc\lift\shortcuts.sqf"];
+
+ //LOG
+ btc_log_fnc_get_corner_points = compileScript ["core\fnc\log\get_corner_points.sqf"];
+ btc_log_fnc_delete = compileScript ["core\fnc\log\delete.sqf"];
+ btc_log_fnc_create = compileScript ["core\fnc\log\create.sqf"];
+ btc_log_fnc_create_apply = compileScript ["core\fnc\log\create_apply.sqf"];
+ btc_log_fnc_create_load = compileScript ["core\fnc\log\create_load.sqf"];
+ btc_log_fnc_create_change_target = compileScript ["core\fnc\log\create_change_target.sqf"];
+ btc_log_fnc_place_create_camera = compileScript ["core\fnc\log\place_create_camera.sqf"];
+ btc_log_fnc_place = compileScript ["core\fnc\log\place.sqf"];
+ btc_log_fnc_place_key_down = compileScript ["core\fnc\log\place_key_down.sqf"];
+ btc_log_fnc_repair_wreck = compileScript ["core\fnc\log\repair_wreck.sqf"];
+ btc_log_fnc_copy = compileScript ["core\fnc\log\copy.sqf"];
+ btc_log_fnc_paste = compileScript ["core\fnc\log\paste.sqf"];
+ btc_log_fnc_refuelSource = compileScript ["core\fnc\log\refuelSource.sqf"];
+ btc_log_fnc_rearmSource = compileScript ["core\fnc\log\rearmSource.sqf"];
+ btc_log_fnc_inventoryCopy = compileScript ["core\fnc\log\inventoryCopy.sqf"];
+ btc_log_fnc_inventoryPaste = compileScript ["core\fnc\log\inventoryPaste.sqf"];
+ btc_log_fnc_inventoryRestore = compileScript ["core\fnc\log\inventoryRestore.sqf"];
+
+ //REP
+ btc_rep_fnc_treatment = compileScript ["core\fnc\rep\treatment.sqf"];
+
+ //RESPAWN
+ btc_respawn_fnc_screen = compileScript ["core\fnc\respawn\screen.sqf"];
+ btc_respawn_fnc_force = compileScript ["core\fnc\respawn\force.sqf"];
+ btc_respawn_fnc_intro = compileScript ["core\fnc\respawn\intro.sqf"];
+
+ //SPECT
+ btc_spect_fnc_updateDevice = compileScript ["core\fnc\spect\updateDevice.sqf"];
+ btc_spect_fnc_frequencies = compileScript ["core\fnc\spect\frequencies.sqf"];
+ btc_spect_fnc_disableDevice = compileScript ["core\fnc\spect\disableDevice.sqf"];
+
+ //ARSENAL
+ btc_arsenal_fnc_data = compileScript ["core\fnc\arsenal\data.sqf"];
+ btc_arsenal_fnc_garage = compileScript ["core\fnc\arsenal\garage.sqf"];
+ btc_arsenal_fnc_loadout = compileScript ["core\fnc\arsenal\loadout.sqf"];
+ btc_arsenal_fnc_trait = compileScript ["core\fnc\arsenal\trait.sqf"];
+ btc_arsenal_fnc_ammoUsage = compileScript ["core\fnc\arsenal\ammoUsage.sqf"];
+ btc_arsenal_fnc_weaponsFilter = compileScript ["core\fnc\arsenal\weaponsfilter.sqf"];
+
+ //TASK
+ btc_task_fnc_setDescription = compileScript ["core\fnc\task\setDescription.sqf"];
+ btc_task_fnc_abort = compileScript ["core\fnc\task\abort.sqf"];
+
+ //TOW
+ btc_tow_fnc_ropeCreate = compileScript ["core\fnc\tow\ropeCreate.sqf"];
+ btc_tow_fnc_hitch_points = compileScript ["core\fnc\tow\hitch_points.sqf"];
+ btc_tow_fnc_unhook = compileScript ["core\fnc\tow\unhook.sqf"];
+ btc_tow_fnc_check = compileScript ["core\fnc\tow\check.sqf"];
+
+ //SLOT
+ btc_slot_fnc_deserializeState = compileScript ["core\fnc\slot\deserializeState.sqf"];
+};
+
+/////////////////////HEADLESS\\\\\\\\\\\\\\\\\\\\\
+if (!hasInterface && !isDedicated) then {
+ btc_eh_fnc_headless = compileScript ["core\fnc\eh\headless.sqf"];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/data/add_group.sqf b/hearts_and_minds.kunduz_valley/core/fnc/data/add_group.sqf
new file mode 100644
index 0000000..e7398d2
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/data/add_group.sqf
@@ -0,0 +1,73 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_data_fnc_add_group
+
+Description:
+ If player is around: initiate patrol around the destination,
+ Ifnot: save in database and delete units by calling btc_data_fnc_get_group.
+
+Parameters:
+ _group - Group of units. [Group]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_data_fnc_add_group;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]]
+];
+
+if (btc_debug_log) then {
+ [format ["%1", _group], __FILE__, [false]] call btc_debug_fnc_message;
+};
+_group setVariable ["no_cache", nil];
+[_group] call CBA_fnc_clearWaypoints;
+
+private _city = [leader _group, values btc_city_all, false] call btc_fnc_find_closecity;
+_city setVariable ["occupied", true];
+
+if (_city getVariable ["marker", ""] != "") then {
+ private _marker = _city getVariable ["marker", ""];
+ _marker setMarkerColor "ColorRed";
+ _marker setMarkerAlpha 0.3;
+};
+
+private _wp = if (vehicle leader _group isEqualTo leader _group) then {
+ selectRandom ["HOUSE", "PATROL", "SENTRY"];
+} else {
+ if ((vehicle leader _group) isKindOf "Air") then {
+ "PATROL";
+ } else {
+ selectRandom ["PATROL", "SENTRY"];
+ };
+};
+
+[_group, _city, 200, _wp] call btc_mil_fnc_addWP;
+
+if (_city getVariable ["active", false]) then {
+ _group setVariable ["btc_city", _city];
+} else {
+ private _data_units = _city getVariable ["data_units", []];
+ private _data_group = _group call btc_data_fnc_get_group;
+
+ _data_units pushBack _data_group;
+ _city setVariable ["data_units", _data_units];
+ if (btc_debug_log) then {
+ [format ["PUSHBACK = %1", _data_group], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
+
+if (btc_final_phase) then {
+ btc_city_remaining pushBack _city;
+};
+if (btc_debug_log) then {
+ [format ["END = %1", []], __FILE__, [false]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/data/get_group.sqf b/hearts_and_minds.kunduz_valley/core/fnc/data/get_group.sqf
new file mode 100644
index 0000000..d95da43
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/data/get_group.sqf
@@ -0,0 +1,84 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_data_fnc_get_group
+
+Description:
+ Get groups parameters (position, waypoints, behaviour ...), save them and delete.
+
+Parameters:
+ _group - Group of units. [Group]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_data_fnc_get_group;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]]
+];
+
+private _units = (units _group) select {alive _x};
+if (_units isEqualTo []) exitWith {nil};
+private _leader = leader _group;
+private _vehicle = vehicle _leader;
+
+private _type_db = 0;
+private _array_pos = [];
+private _array_type = [];
+private _side = side _group;
+private _array_dam = [];
+private _array_in_veh = [];
+private _array_veh = [];
+private _index_wp = currentWaypoint _group;
+private _array_wp = (waypoints _group) apply {[
+ waypointPosition _x,
+ waypointType _x,
+ waypointSpeed _x,
+ waypointFormation _x,
+ waypointCombatMode _x,
+ waypointBehaviour _x,
+ waypointTimeout _x,
+ waypointCompletionRadius _x
+]};
+
+{
+ private _pos = getPosATL _x;
+ if (surfaceIsWater _pos) then {
+ _array_pos pushBack getPos _x;
+ } else {
+ _array_pos pushBack _pos;
+ };
+
+ _array_type pushBack typeOf _x;
+ _array_dam pushBack getDammage _x;
+} forEach _units;
+
+if (_group getVariable ["btc_inHouse", ""] isNotEqualTo "") then {
+ _type_db = 3;
+ _array_veh = _group getVariable ["btc_inHouse", ""];
+};
+if (_group getVariable ["getWeapons", false]) then {_type_db = 4;};
+if (_group getVariable ["suicider", false]) then {_type_db = 5;};
+if (_group getVariable ["btc_data_inhouse", []] isNotEqualTo []) then {
+ _type_db = 6;
+ _array_veh = _group getVariable ["btc_data_inhouse", []];
+};
+if (_group getVariable ["btc_ied_drone", false]) then {_type_db = 7;};
+if (
+ _vehicle != _leader &&
+ {_type_db isNotEqualTo 7}
+) then {
+ _type_db = 1;
+ _array_veh = [typeOf _vehicle, getPosATL _vehicle, getDir _vehicle, fuel _vehicle, vectorUp _vehicle];
+};
+
+[_vehicle, _group] call CBA_fnc_deleteEntity;
+
+[_type_db, _array_pos, _array_type, _side, _array_dam, [], [_index_wp, _array_wp], _array_veh]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/data/spawn_group.sqf b/hearts_and_minds.kunduz_valley/core/fnc/data/spawn_group.sqf
new file mode 100644
index 0000000..9279eef
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/data/spawn_group.sqf
@@ -0,0 +1,115 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_data_fnc_spawn_group
+
+Description:
+ Create group previously saved by btc_data_fnc_get_group.
+
+Parameters:
+ _data_unit - All data listed above. [Array]
+ _type - Type of group (3: in house group, 4: civilian with weapon, 5: suicider ...). [Number]
+ _array_pos - Position on units. [Array]
+ _array_type - Type of units. [Array]
+ _side - Side of the group. [Side]
+ _array_dam - Damage of units. [Array]
+ _behaviour - Behaviour of units. [Array]
+ _array_wp - Waypoints of group. [Array]
+ _array_veh - Vehicle occupied by the group. [Array, String]
+ _city - City. [Object]
+ _spawningRadius - Spawning radius. [Number]
+
+Returns:
+ _delay - Delay due to vehicle spawn. [Number]
+
+Examples:
+ (begin example)
+ _result = [] call btc_data_fnc_spawn_group;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_data_unit", [], [[]]],
+ ["_city", objNull, [objNull]],
+ ["_spawningRadius", 100, [0]]
+];
+_data_unit params [
+ ["_type", 1, [0]],
+ ["_array_pos", [], [[]]],
+ ["_array_type", [], [[]]],
+ ["_side", east, [east]],
+ ["_array_dam", [], [[]]],
+ ["_behaviour", [], [[]]],
+ ["_array_wp", [], [[]]],
+ ["_array_veh", [], [[], ""]]
+];
+
+private _delay = 0;
+if (_type isEqualTo 5) exitWith {
+ [[_city, _spawningRadius, _array_pos select 0, _array_type select 0], btc_ied_fnc_suicider_create] call btc_delay_fnc_exec;
+ _delay + btc_delay_unit
+};
+if (_type isEqualTo 7) exitWith {
+ [[_city, _spawningRadius, _array_pos select 0], btc_ied_fnc_drone_create] call btc_delay_fnc_exec;
+ _delay + btc_delay_unit
+};
+
+private _group = createGroup _side;
+_group setVariable ["btc_city", _city];
+if (_type isEqualTo 1) then {
+ _array_veh params ["_typeOf", "_posATL", "_dir", "_fuel", ["_vectorUp", []]];
+ _delay = [_group, _typeOf, _array_type, _posATL, _dir, _fuel, _vectorUp] call btc_delay_fnc_createVehicle;
+} else {
+ for "_i" from 0 to (count _array_pos - 1) do {
+ [_group, _array_type select _i, _array_pos select _i, "CAN_COLLIDE"] call btc_delay_fnc_createUnit;
+ //_u setDamage (_array_dam select _i);
+ };
+};
+
+[{
+ params ["_data_unit", "_group"];
+ _data_unit params [
+ ["_type", 1, [0]],
+ ["_array_pos", [], [[]]],
+ ["_array_type", [], [[]]],
+ ["_side", east, [east]],
+ ["_array_dam", [], [[]]],
+ ["_behaviour", [], [[]]],
+ ["_array_wp", [], [[]]],
+ ["_array_veh", [], [[], ""]]
+ ];
+
+ if !(_type in [3, 6]) then {
+ [_group] call CBA_fnc_clearWaypoints;
+ {
+ _x params [
+ "_position",
+ "_type",
+ "_speed",
+ "_formation",
+ "_combat",
+ "_behaviour",
+ ["_timeout", [0, 0, 0], [[]], 3],
+ ["_compRadius", 20, [0]]
+ ];
+ [_group, _position, -1, _type, _behaviour, _combat, _speed, _formation, "", _timeout, _compRadius] call CBA_fnc_addWaypoint;
+ } forEach (_array_wp select 1);
+ if (_array_wp select 1 isNotEqualTo []) then {
+ _group setCurrentWaypoint [_group, _array_wp select 0];
+ };
+ };
+ if (_type isEqualTo 3) then {
+ [_group, nearestObject [_array_pos select 0, _array_veh]] call btc_fnc_house_addWP;
+ _group setVariable ["btc_inHouse", _array_veh];
+ };
+ if (_type isEqualTo 4) then {[[0, 0, 0], 0, units _group] call btc_civ_fnc_get_weapons;};
+ if (_type isEqualTo 6) then {
+ [_group, _array_veh select 0] call btc_civ_fnc_addWP;
+ _group setVariable ["btc_data_inhouse", _array_veh];
+ };
+}, [_data_unit, _group], _delay] call btc_delay_fnc_waitAndExecute;
+
+_delay
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestart.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestart.sqf
new file mode 100644
index 0000000..39dd256
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestart.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_autoRestart
+
+Description:
+ Save or not and restart/shutdown server.
+
+Parameters:
+ _p_autoRestartType - 0: "Off", 1: "Restart", 2: "Shutdown", 3: "Save and restart", 4: "Save and shutdown". [Number]
+ _serverCommandPassword - Password defined in server.cfg. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [4] call btc_db_fnc_autoRestart;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_p_autoRestartType", btc_p_db_autoRestartType, [0]],
+ ["_serverCommandPassword", btc_db_serverCommandPassword, ""]
+];
+
+private _serverCommand = if (_p_autoRestartType in [1, 3]) then {
+ "#restartserver"
+} else {
+ "#shutdown"
+};
+
+if (_p_autoRestartType > 2) then {
+ [] call btc_db_fnc_save;
+};
+
+if !(_serverCommandPassword serverCommand _serverCommand) then {
+ ["Invalid password", __FILE__, [true, true, true]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestartLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestartLoop.sqf
new file mode 100644
index 0000000..3b3b53e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/autoRestartLoop.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_autoRestartLoop
+
+Description:
+ Start loop until restart.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_db_fnc_autoRestartLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (btc_p_db_autoRestartTime > 0) then {
+ [{
+ [19, btc_db_warningTimeAutoRestart] remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+ [btc_db_fnc_autoRestart, [], btc_db_warningTimeAutoRestart * 60] call CBA_fnc_waitAndExecute;
+ }, [], btc_p_db_autoRestartTime * 60 * 60 - btc_db_warningTimeAutoRestart * 60] call CBA_fnc_waitAndExecute;
+};
+
+btc_p_db_autoRestartHour = btc_p_db_autoRestartHour - [-1];
+if (btc_p_db_autoRestartHour isNotEqualTo []) then {
+ [{
+ [{systemTime select 3 in btc_p_db_autoRestartHour}, btc_db_fnc_autoRestart] call CBA_fnc_waitUntilAndExecute;
+ }, [], 1 * (60 - (systemTime select 4)) * 60] call CBA_fnc_waitAndExecute;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/delete.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/delete.sqf
new file mode 100644
index 0000000..e337c31
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/delete.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_delete
+
+Description:
+ Delete database.
+
+Parameters:
+ _showHint - Show the hint telling the database has been deleted. [Boolean]
+ _name - Name of the current database. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_db_fnc_delete;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_showHint", true, [true]],
+ ["_name", worldName, [""]]
+];
+
+profileNamespace setVariable [format ["btc_hm_%1_version", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_date", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_cities", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_ho", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_ho_sel", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_cache", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_rep", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_fobs", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_vehs", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_objs", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_tags", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_respawnTickets", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_deadBodyPlayers", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_slotsSerialized", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_markers", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_explosives", _name], nil];
+profileNamespace setVariable [format ["btc_hm_%1_db", _name], nil];
+
+saveProfileNamespace;
+
+if (_showHint) then {
+ [10] remoteExecCall ["btc_fnc_show_hint", 0];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/load.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/load.sqf
new file mode 100644
index 0000000..0671ba7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/load.sqf
@@ -0,0 +1,292 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_load
+
+Description:
+ Load database from profileNamespace depends one worldname
+
+Parameters:
+ _name - Name of the saved game. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["Altis"] call btc_db_fnc_load;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_name", worldName, [""]]
+];
+
+setDate +(profileNamespace getVariable [format ["btc_hm_%1_date", _name], date]);
+
+//CITIES
+private _cities_status = +(profileNamespace getVariable [format ["btc_hm_%1_cities", _name], []]);
+
+{
+ _x params ["_id", "_initialized", "_spawn_more", "_occupied", "_data_units", "_has_ho", "_ho_units_spawned", "_ieds", "_has_suicider",
+ ["_data_animals", [], [[]]],
+ ["_data_tags", [], [[]]],
+ ["_civKilled", [], [[]]],
+ ["_graves", [], [[]]]
+ ];
+
+ private _city = btc_city_all get _id;
+
+ _city setVariable ["initialized", _initialized];
+ _city setVariable ["spawn_more", _spawn_more];
+ _city setVariable ["occupied", _occupied];
+ _city setVariable ["data_units", _data_units];
+ _city setVariable ["has_ho", _has_ho];
+ _city setVariable ["ho_units_spawned", _ho_units_spawned];
+ _city setVariable ["ieds", _ieds];
+ _city setVariable ["has_suicider", _has_suicider];
+ _city setVariable ["data_animals", _data_animals];
+ _city setVariable ["data_tags", _data_tags];
+ _city setVariable ["btc_rep_civKilled", _civKilled];
+ _city setVariable ["btc_rep_graves", _graves];
+
+ if (btc_debug) then {
+ private _marker = _city getVariable ["marker", ""];
+ if (_city getVariable ["occupied", false]) then {
+ _marker setMarkerColor "colorRed";
+ } else {
+ _marker setMarkerColor "colorGreen";
+ };
+ };
+ if (btc_debug_log) then {
+ [format [
+ "ID: %1 - _initialized %2 _spawn_more %3 _occupied %4 count _data_units %5 _has_ho %6",
+ _id, _initialized, _spawn_more,
+ _occupied, count _data_units, _has_ho
+ ], __FILE__, [false]] call btc_debug_fnc_message;
+ [format [
+ "ID: %1 - _ho_units_spawned %2 count _ieds %3 _has_suicider %4 count _data_animals %5 count _data_tags %6 count _civKilled %7",
+ _id, _ho_units_spawned, count _ieds, _has_suicider,
+ count _data_animals, count _data_tags, count _civKilled
+ ], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} forEach _cities_status;
+
+//HIDEOUT
+private _array_ho = +(profileNamespace getVariable [format ["btc_hm_%1_ho", _name], []]);
+
+{
+ _x call btc_hideout_fnc_create;
+} forEach _array_ho;
+
+private _ho = profileNamespace getVariable [format ["btc_hm_%1_ho_sel", _name], 0];
+private _select_ho = (btc_hideouts apply {_x getVariable "id"}) find _ho;
+if (_select_ho isEqualTo - 1) then {
+ btc_hq = objNull;
+} else {
+ btc_hq = btc_hideouts select _select_ho;
+};
+
+if (btc_hideouts isEqualTo []) then {[] spawn btc_fnc_final_phase;};
+
+//CACHE
+private _array_cache = +(profileNamespace getVariable [format ["btc_hm_%1_cache", _name], []]);
+_array_cache params ["_cache_pos", "_cache_n", "_cache_info", "_cache_markers", "_cache_pictures",
+ ["_isChem", false, [true]],
+ ["_cache_unitsSpawned", false, [true]]
+];
+
+btc_cache_pos = _cache_pos;
+btc_cache_n = _cache_n;
+btc_cache_info = _cache_info;
+
+[_cache_pos, btc_p_chem_cache_probability > 0, [1, 0] select _isChem] call btc_cache_fnc_create;
+btc_cache_obj setVariable ["btc_cache_unitsSpawned", _cache_unitsSpawned];
+
+btc_cache_markers = [];
+{
+ _x params ["_pos", "_marker_name"];
+
+ [_pos, 0, _marker_name] call btc_info_fnc_cacheMarker;
+} forEach _cache_markers;
+
+btc_cache_pictures = _cache_pictures;
+{
+ (btc_cache_pictures select 2) pushBack ([
+ _x,
+ btc_cache_n,
+ btc_cache_pictures select 1 select _forEachindex
+ ] remoteExecCall ["btc_info_fnc_cachePicture", [0, -2] select isDedicated, true]);
+} forEach (btc_cache_pictures select 0);
+
+//FOB
+private _fobs = +(profileNamespace getVariable [format ["btc_hm_%1_fobs", _name], []]);
+
+{
+ _x params ["_fob_name", "_pos", ["_direction", 0, [0]]];
+
+ [_pos, _direction, _fob_name] call btc_fob_fnc_create_s;
+} forEach _fobs;
+
+//REP
+btc_global_reputation = profileNamespace getVariable [format ["btc_hm_%1_rep", _name], 0];
+
+//Objects
+{deleteVehicle _x} forEach (getMissionLayerEntities "btc_vehicles" select 0);
+if !(isNil "btc_vehicles") then {
+ {deleteVehicle _x} forEach btc_vehicles;
+ btc_vehicles = [];
+};
+
+private _objs = +(profileNamespace getVariable [format ["btc_hm_%1_objs", _name], []]);
+[{ // Can't use ace_cargo for objects created during first frame.
+ {
+ [_x] call btc_db_fnc_loadObjectStatus;
+ } forEach _this;
+}, _objs] call CBA_fnc_execNextFrame;
+
+//VEHICLES
+private _vehs = +(profileNamespace getVariable [format ["btc_hm_%1_vehs", _name], []]);
+[{ // Can't be executed just after because we can't delete and spawn vehicle during the same frame.
+ private _loadVehicle = {
+ params [
+ "_veh_type",
+ "_veh_pos",
+ "_veh_dir",
+ "_veh_fuel",
+ "_veh_AllHitPointsDamage",
+ "_veh_cargo",
+ "_veh_inventory",
+ "_customization",
+ ["_isMedicalVehicle", false, [false]],
+ ["_isRepairVehicle", false, [false]],
+ ["_fuelSource", [], [[]]],
+ ["_pylons", [], [[]]],
+ ["_isContaminated", false, [false]],
+ ["_supplyVehicle", [], [[]]],
+ ["_objectTexture", [], [[]]],
+ ["_EDENinventory", [], [[]]],
+ ["_vectorPos", [], [[]]],
+ ["_ViV", [], [[]]],
+ ["_flagTexture", "", [""]],
+ ["_turretMagazines", [], [[]]],
+ ["_tagTexture", "", [""]]
+ ];
+
+ if (btc_debug_log) then {
+ [format ["_veh = %1", _x], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ private _veh = [_veh_type, _veh_pos, _veh_dir, _customization, _isMedicalVehicle, _isRepairVehicle, _fuelSource, _pylons, _isContaminated, _supplyVehicle, _objectTexture, _EDENinventory, _veh_AllHitPointsDamage, _flagTexture, _tagTexture] call btc_log_fnc_createVehicle;
+ _veh setVectorDirAndUp _vectorPos;
+ _veh setFuel _veh_fuel;
+
+ [_veh, _turretMagazines] call btc_db_fnc_setTurretMagazines;
+
+ [_veh, _veh_cargo, _veh_inventory] call btc_db_fnc_loadCargo;
+
+ if !(alive _veh) then {
+ [_veh, objNull, objNull, nil, false] call btc_veh_fnc_killed;
+ };
+ if (_ViV isNotEqualTo []) then {
+ {
+ private _vehToLoad = _x call _loadVehicle;
+ if !([_vehToLoad, _veh] call btc_tow_fnc_ViV) then {
+ _vehToLoad setVehiclePosition [_veh, [], 100, "NONE"];
+ private _marker = _vehToLoad getVariable ["marker", ""];
+ if (_marker isNotEqualTo "") then {
+ _marker setMarkerPos _vehToLoad;
+ };
+ };
+ } forEach _ViV;
+ };
+
+ _veh
+ };
+ {
+ _x call _loadVehicle;
+ } forEach _this;
+}, _vehs] call CBA_fnc_execNextFrame;
+
+//Player Tags
+private _tags_properties = +(profileNamespace getVariable [format ["btc_hm_%1_tags", _name], []]);
+private _id = ["ace_tagCreated", {
+ params ["_tag", "_texture", "_object"];
+ btc_tags_player pushBack [_tag, _texture, _object];
+}] call CBA_fnc_addEventHandler;
+{
+ _x params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_typeObject", "_tagModel"];
+ private _object = objNull;
+ if (_typeObject isNotEqualTo "") then {
+ _object = nearestObject [ASLToATL _tagPosASL, _typeObject];
+ };
+ [_tagPosASL, _vectorDirAndUp, _texture, _object, objNull, "",_tagModel] call ace_tagging_fnc_createTag;
+} forEach _tags_properties;
+["ace_tagCreated", _id] call CBA_fnc_removeEventHandler;
+
+//Player respawn tickets
+if (btc_p_respawn_ticketsAtStart >= 0) then {
+ btc_respawn_tickets = +(profileNamespace getVariable [format ["btc_hm_%1_respawnTickets", _name], btc_respawn_tickets]);
+
+ private _deadBodyPlayers = +(profileNamespace getVariable [format ["btc_hm_%1_deadBodyPlayers", _name], []]);
+ btc_body_deadPlayers = [_deadBodyPlayers] call btc_body_fnc_create;
+};
+
+//Player slots
+private _slots_serialized = +(profileNamespace getVariable [format ["btc_hm_%1_slotsSerialized", _name], createHashMap]);
+[{
+ {
+ if (_y isEqualTo []) then {continue};
+ private _objtClass = _y select 6;
+ if (_objtClass isEqualTo "") then {
+ _objtClass = objNull;
+ } else {
+ _objtClass = nearestObject [ASLToATL (_y select 0), _objtClass];
+ };
+ _y set [6, _objtClass];
+ } forEach _this;
+}, _slots_serialized] call CBA_fnc_execNextFrame; // Need to wait for vehicle creation
+btc_slots_serialized = _slots_serialized;
+
+//Explosives
+private _explosives = +(profileNamespace getVariable [format ["btc_hm_%1_explosives", _name], []]);
+btc_explosives = _explosives apply {
+ _x params ["_explosiveType", "_dir", "_pitch", "_pos", "_side"];
+ private _explosive = createVehicle [_explosiveType, _pos, [], 0, "CAN_COLLIDE"];
+ _explosive setPosATL _pos;
+ [_explosive, _dir, _pitch] call ACE_Explosives_fnc_setPosition;
+ _explosive setVariable ["btc_side", _side];
+ if (_side isEqualTo btc_player_side) then {
+ _explosive setShotParents [btc_explosives_objectSide, objNull];
+ };
+ [
+ _explosive,
+ _dir,
+ _pitch
+ ];
+};
+
+//Player Markers
+private _markers_properties = +(profileNamespace getVariable [format ["btc_hm_%1_markers", _name], []]);
+{
+ _x params ["_markerText", "_markerPos", "_markerColor", "_markerType", "_markerSize", "_markerAlpha", "_markerBrush", "_markerDir", "_markerShape",
+ ["_markerPolyline", [], [[]]],
+ ["_markerChannel", 0, [0]]
+ ];
+
+ private _marker = createMarker [format ["_USER_DEFINED #0/%1/%2 btc_hm", _forEachindex, _markerChannel], _markerPos, _markerChannel];
+ _marker setMarkerText _markerText;
+ _marker setMarkerColor _markerColor;
+ _marker setMarkerType _markerType;
+ _marker setMarkerSize _markerSize;
+ _marker setMarkerAlpha _markerAlpha;
+ _marker setMarkerBrush _markerBrush;
+ _marker setMarkerDir _markerDir;
+
+ _marker setMarkerShape _markerShape;
+ if (_markerPolyline isNotEqualTo []) then {
+ _marker setMarkerPolyline _markerPolyline;
+ };
+} forEach _markers_properties;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/loadObjectStatus.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/loadObjectStatus.sqf
new file mode 100644
index 0000000..d60f849
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/loadObjectStatus.sqf
@@ -0,0 +1,85 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_loadObjectStatus
+
+Description:
+ Load object status like ACE cargo, inventory and position.
+
+Parameters:
+ _object_data - Object to create with position, direction, cargo, inventory ... [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_db_fnc_loadObjectStatus;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object_data", [], [[]]]
+];
+_object_data params [
+ "_type",
+ "_pos",
+ "_dir",
+ "",
+ "_cargo",
+ "_inventory",
+ "_vectorPos",
+ ["_isContaminated", false, [false]],
+ ["_dogtagDataTaken", [], [[]]],
+ ["_flagTexture", "", [""]],
+ ["_turretMagazines", [], [[]]],
+ ["_customName", "", [""]],
+ ["_tagTexture", "", [""]],
+ ["_properties", [], [[]]],
+ ["_playerKiller", "", [""]]
+];
+
+private _obj = createVehicle [_type, ASLToATL _pos, [], 0, "CAN_COLLIDE"];
+
+_obj setDir _dir;
+_obj setPosASL _pos;
+_obj setVectorDirAndUp _vectorPos;
+
+if (_isContaminated) then {
+ if ((btc_chem_contaminated pushBackUnique _obj) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+};
+if (unitIsUAV _obj) then {
+ createVehicleCrew _obj;
+};
+if (_flagTexture isNotEqualTo "") then {
+ _obj forceFlagTexture _flagTexture;
+};
+
+if (_turretMagazines isNotEqualTo []) then {
+ [_obj, _turretMagazines] call btc_db_fnc_setTurretMagazines;
+};
+
+[_obj, _dogtagDataTaken] call btc_body_fnc_dogtagSet;
+
+if (_customName isNotEqualTo "") then {
+ _obj setVariable ["ace_cargo_customName", _customName, true];
+};
+
+if (_tagTexture isNotEqualTo "") then {
+ [objNull, [], _tagTexture, _obj, objNull, "", "", true] call ace_tagging_fnc_createTag;
+};
+
+if (_properties isNotEqualTo []) then {
+ ([_obj] + _properties) call btc_veh_fnc_propertiesSet;
+};
+
+if (_playerKiller isNotEqualTo "") then {
+ _obj setVariable ["btc_rep_playerKiller", _playerKiller];
+};
+
+[_obj] call btc_log_fnc_init;
+[_obj, _cargo, _inventory] call btc_db_fnc_loadCargo;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/load_old.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/load_old.sqf
new file mode 100644
index 0000000..3e0c1e7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/load_old.sqf
@@ -0,0 +1,271 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_load_old
+
+Description:
+ Load older database version thanks to profileNamespace getVariable [format ["btc_hm_%1_version", worldName], 1.13].
+
+Parameters:
+ _name - Name of the saved game. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["Altis"] call compileScript ["core\fnc\db\load_old.sqf"];
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_name", worldName, [""]]
+];
+
+setDate +(profileNamespace getVariable [format ["btc_hm_%1_date", _name], date]);
+
+//CITIES
+private _cities_status = +(profileNamespace getVariable [format ["btc_hm_%1_cities", _name], []]);
+
+{
+ _x params ["_id", "_initialized", "_spawn_more", "_occupied", "_data_units", "_has_ho", "_ho_units_spawned", "_ieds", "_has_suicider",
+ ["_data_animals", [], [[]]],
+ ["_data_tags", [], [[]]],
+ ["_civKilled", [], [[]]]
+ ];
+
+ private _city = btc_city_all get _id;
+
+ _city setVariable ["initialized", _initialized];
+ _city setVariable ["spawn_more", _spawn_more];
+ _city setVariable ["occupied", _occupied];
+ _city setVariable ["data_units", _data_units];
+ _city setVariable ["has_ho", _has_ho];
+ _city setVariable ["ho_units_spawned", _ho_units_spawned];
+ _city setVariable ["ieds", _ieds];
+ _city setVariable ["has_suicider", _has_suicider];
+ _city setVariable ["data_animals", _data_animals];
+ _city setVariable ["data_tags", _data_tags];
+ _city setVariable ["btc_rep_civKilled", _civKilled];
+
+ if (btc_debug) then {
+ private _marker = _city getVariable ["marker", ""];
+ if (_city getVariable ["occupied", false]) then {
+ _marker setMarkerColor "colorRed";
+ } else {
+ _marker setMarkerColor "colorGreen";
+ };
+ };
+ if (btc_debug_log) then {
+ [format [
+ "ID: %1 - _initialized %2 _spawn_more %3 _occupied %4 count _data_units %5 _has_ho %6",
+ _id, _initialized, _spawn_more,
+ _occupied, count _data_units, _has_ho
+ ], __FILE__, [false]] call btc_debug_fnc_message;
+ [format [
+ "ID: %1 - _ho_units_spawned %2 count _ieds %3 _has_suicider %4 count _data_animals %5 count _data_tags %6 count _civKilled %7",
+ _id, _ho_units_spawned, count _ieds, _has_suicider,
+ count _data_animals, count _data_tags, count _civKilled
+ ], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} forEach _cities_status;
+
+//HIDEOUT
+private _array_ho = +(profileNamespace getVariable [format ["btc_hm_%1_ho", _name], []]);
+
+{
+ _x call btc_hideout_fnc_create;
+} forEach _array_ho;
+
+private _ho = profileNamespace getVariable [format ["btc_hm_%1_ho_sel", _name], 0];
+private _select_ho = (btc_hideouts apply {_x getVariable "id"}) find _ho;
+if (_select_ho isEqualTo - 1) then {
+ btc_hq = objNull;
+} else {
+ btc_hq = btc_hideouts select _select_ho;
+};
+
+if (btc_hideouts isEqualTo []) then {[] spawn btc_fnc_final_phase;};
+
+//CACHE
+private _array_cache = +(profileNamespace getVariable [format ["btc_hm_%1_cache", _name], []]);
+_array_cache params ["_cache_pos", "_cache_n", "_cache_info", "_cache_markers", "_cache_pictures",
+ ["_isChem", false, [true]],
+ ["_cache_unitsSpawned", false, [true]]
+];
+
+btc_cache_pos = _cache_pos;
+btc_cache_n = _cache_n;
+btc_cache_info = _cache_info;
+
+[_cache_pos, btc_p_chem_cache_probability > 0, [1, 0] select _isChem] call btc_cache_fnc_create;
+btc_cache_obj setVariable ["btc_cache_unitsSpawned", _cache_unitsSpawned];
+
+btc_cache_markers = [];
+{
+ _x params ["_pos", "_marker_name"];
+
+ [_pos, 0, _marker_name] call btc_info_fnc_cacheMarker;
+} forEach _cache_markers;
+
+btc_cache_pictures = _cache_pictures;
+{
+ (btc_cache_pictures select 2) pushBack ([
+ _x,
+ btc_cache_n,
+ btc_cache_pictures select 1 select _forEachindex
+ ] remoteExecCall ["btc_info_fnc_cachePicture", [0, -2] select isDedicated, true]);
+} forEach (btc_cache_pictures select 0);
+
+//FOB
+private _fobs = +(profileNamespace getVariable [format ["btc_hm_%1_fobs", _name], []]);
+
+{
+ _x params ["_fob_name", "_pos", ["_direction", 0, [0]]];
+
+ [_pos, _direction, _fob_name] call btc_fob_fnc_create_s;
+} forEach _fobs;
+
+//REP
+btc_global_reputation = profileNamespace getVariable [format ["btc_hm_%1_rep", _name], 0];
+
+//Objects
+{deleteVehicle _x} forEach (getMissionLayerEntities "btc_vehicles" select 0);
+if !(isNil "btc_vehicles") then {
+ {deleteVehicle _x} forEach btc_vehicles;
+ btc_vehicles = [];
+};
+
+private _objs = +(profileNamespace getVariable [format ["btc_hm_%1_objs", _name], []]);
+[{ // Can't use ace_cargo for objects created during first frame.
+ {
+ [_x] call btc_db_fnc_loadObjectStatus;
+ } forEach _this;
+}, _objs] call CBA_fnc_execNextFrame;
+
+//VEHICLES
+private _vehs = +(profileNamespace getVariable [format ["btc_hm_%1_vehs", _name], []]);
+[{ // Can't be executed just after because we can't delete and spawn vehicle during the same frame.
+ private _loadVehicle = {
+ params [
+ "_veh_type",
+ "_veh_pos",
+ "_veh_dir",
+ "_veh_fuel",
+ "_veh_AllHitPointsDamage",
+ "_veh_cargo",
+ "_veh_inventory",
+ "_customization",
+ ["_isMedicalVehicle", false, [false]],
+ ["_isRepairVehicle", false, [false]],
+ ["_fuelSource", [], [[]]],
+ ["_pylons", [], [[]]],
+ ["_isContaminated", false, [false]],
+ ["_supplyVehicle", [], [[]]],
+ ["_EDENinventory", [], [[]]],
+ ["_vectorPos", [], [[]]],
+ ["_ViV", [], [[]]],
+ ["_flagTexture", "", [""]],
+ ["_turretMagazines", [], [[]]],
+ ["_tagTexture", "", [""]]
+ ];
+
+ if (btc_debug_log) then {
+ [format ["_veh = %1", _x], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ private _veh = [_veh_type, _veh_pos, _veh_dir, _customization, _isMedicalVehicle, _isRepairVehicle, _fuelSource, _pylons, _isContaminated, _supplyVehicle, nil, _EDENinventory, _veh_AllHitPointsDamage, _flagTexture, _tagTexture] call btc_log_fnc_createVehicle;
+ _veh setVectorDirAndUp _vectorPos;
+ _veh setFuel _veh_fuel;
+
+ [_veh, _turretMagazines] call btc_db_fnc_setTurretMagazines;
+
+ [_veh, _veh_cargo, _veh_inventory] call btc_db_fnc_loadCargo;
+
+ if !(alive _veh) then {
+ [_veh, objNull, objNull, nil, false] call btc_veh_fnc_killed;
+ };
+ if (_ViV isNotEqualTo []) then {
+ {
+ private _vehToLoad = _x call _loadVehicle;
+ if !([_vehToLoad, _veh] call btc_tow_fnc_ViV) then {
+ _vehToLoad setVehiclePosition [_veh, [], 100, "NONE"];
+ private _marker = _vehToLoad getVariable ["marker", ""];
+ if (_marker isNotEqualTo "") then {
+ _marker setMarkerPos _vehToLoad;
+ };
+ };
+ } forEach _ViV;
+ };
+
+ _veh
+ };
+ {
+ _x call _loadVehicle;
+ } forEach _this;
+}, _vehs] call CBA_fnc_execNextFrame;
+
+//Player Tags
+private _tags_properties = +(profileNamespace getVariable [format ["btc_hm_%1_tags", _name], []]);
+private _id = ["ace_tagCreated", {
+ params ["_tag", "_texture", "_object"];
+ btc_tags_player pushBack [_tag, _texture, _object];
+}] call CBA_fnc_addEventHandler;
+{
+ _x params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_typeObject", "_tagModel"];
+ private _object = objNull;
+ if (_typeObject isNotEqualTo "") then {
+ _object = nearestObject [ASLToATL _tagPosASL, _typeObject];
+ };
+ [_tagPosASL, _vectorDirAndUp, _texture, _object, objNull, "",_tagModel] call ace_tagging_fnc_createTag;
+} forEach _tags_properties;
+["ace_tagCreated", _id] call CBA_fnc_removeEventHandler;
+
+//Player respawn tickets
+if (btc_p_respawn_ticketsAtStart >= 0) then {
+ btc_respawn_tickets = +(profileNamespace getVariable [format ["btc_hm_%1_respawnTickets", _name], btc_respawn_tickets]);
+
+ private _deadBodyPlayers = +(profileNamespace getVariable [format ["btc_hm_%1_deadBodyPlayers", _name], []]);
+ btc_body_deadPlayers = [_deadBodyPlayers] call btc_body_fnc_create;
+};
+
+//Player slots
+private _slots_serialized = +(profileNamespace getVariable [format ["btc_hm_%1_slotsSerialized", _name], createHashMap]);
+[{
+ {
+ if (_y isEqualTo []) then {continue};
+ private _objtClass = _y select 6;
+ if (_objtClass isEqualTo "") then {
+ _objtClass = objNull;
+ } else {
+ _objtClass = nearestObject [ASLToATL (_y select 0), _objtClass];
+ };
+ _y set [6, _objtClass];
+ } forEach _this;
+}, _slots_serialized] call CBA_fnc_execNextFrame; // Need to wait for vehicle creation
+btc_slots_serialized = _slots_serialized;
+
+//Player Markers
+private _markers_properties = +(profileNamespace getVariable [format ["btc_hm_%1_markers", _name], []]);
+{
+ _x params ["_markerText", "_markerPos", "_markerColor", "_markerType", "_markerSize", "_markerAlpha", "_markerBrush", "_markerDir", "_markerShape",
+ ["_markerPolyline", [], [[]]],
+ ["_markerChannel", 0, [0]]
+ ];
+
+ private _marker = createMarker [format ["_USER_DEFINED #0/%1/%2", _forEachindex, _markerChannel], _markerPos, _markerChannel];
+ _marker setMarkerText _markerText;
+ _marker setMarkerColor _markerColor;
+ _marker setMarkerType _markerType;
+ _marker setMarkerSize _markerSize;
+ _marker setMarkerAlpha _markerAlpha;
+ _marker setMarkerBrush _markerBrush;
+ _marker setMarkerDir _markerDir;
+
+ _marker setMarkerShape _markerShape;
+ if (_markerPolyline isNotEqualTo []) then {
+ _marker setMarkerPolyline _markerPolyline;
+ };
+} forEach _markers_properties;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/loadcargo.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/loadcargo.sqf
new file mode 100644
index 0000000..e88a850
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/loadcargo.sqf
@@ -0,0 +1,78 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_loadCargo
+
+Description:
+ Load ACE cargo and inventory of a vehicle/container.
+
+Parameters:
+ _obj - Vehicle or container. [Object]
+ _cargo - Object to load in ACE cargo. [Array]
+ _inventory - Weapon and item to load in inventory. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_db_fnc_loadCargo;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_obj", "_cargo", "_inventory"];
+
+ //handle cargo
+ {
+ _x params ["_type", "", "_inventory",
+ ["_isContaminated", false, [false]],
+ ["_dogtagDataTaken", [], [[]]],
+ ["_turretMagazines", [], [[]]],
+ ["_customName", "", [""]],
+ ["_properties", [], [[]]],
+ ["_playerKiller", "", [""]]
+ ];
+
+ private _l = createVehicle [_type, getPosATL _obj, [], 0, "CAN_COLLIDE"];
+ [_l] call btc_log_fnc_init;
+ private _isloaded = [_l, _obj, false] call ace_cargo_fnc_loadItem;
+ if (btc_debug_log) then {
+ [format ["Object loaded: %1 in veh/container %2 IsLoaded: %3", _l, _obj, _isloaded], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ [_l, _inventory] call btc_log_fnc_inventorySet;
+
+ if (_isContaminated) then {
+ btc_chem_contaminated pushBack _l;
+ publicVariable "btc_chem_contaminated";
+ };
+
+ [_l, _dogtagDataTaken] call btc_body_fnc_dogtagSet;
+
+ if (_turretMagazines isNotEqualTo []) then {
+ [_l, _turretMagazines] call btc_db_fnc_setTurretMagazines;
+ };
+
+ if (_customName isNotEqualTo "") then {
+ _l setVariable ["ace_cargo_customName", _customName, true];
+ };
+
+ if (unitIsUAV _l) then {
+ createVehicleCrew _l;
+ };
+
+ if (_properties isNotEqualTo []) then {
+ ([_l] + _properties) call btc_veh_fnc_propertiesSet;
+ };
+
+ if (_playerKiller isNotEqualTo "") then {
+ _l setVariable ["btc_rep_playerKiller", _playerKiller];
+ };
+ } forEach _cargo;
+
+ //set inventory content for weapons, magazines and items
+ [_obj, _inventory] call btc_log_fnc_inventorySet;
+}, _this] call CBA_fnc_execNextFrame;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/save.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/save.sqf
new file mode 100644
index 0000000..e493a70
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/save.sqf
@@ -0,0 +1,287 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_save
+
+Description:
+ Save the current game into profileNamespace.
+
+Parameters:
+ _name - Name of the game saved. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_db_fnc_save;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_name", worldName, [""]]
+];
+
+if (btc_debug) then {
+ ["...1", __FILE__, [btc_debug, false, true]] call btc_debug_fnc_message;
+};
+
+[8] remoteExecCall ["btc_fnc_show_hint", 0];
+
+[false] call btc_db_fnc_delete;
+
+//Version
+profileNamespace setVariable [format ["btc_hm_%1_version", _name], btc_version select 1];
+
+//World Date
+profileNamespace setVariable [format ["btc_hm_%1_date", _name], date];
+
+//City status
+private _cities_status = [];
+{
+ private _city_status = [];
+ _city_status pushBack _x;
+
+ _city_status pushBack (_y getVariable "initialized");
+
+ _city_status pushBack (_y getVariable "spawn_more");
+ _city_status pushBack (_y getVariable "occupied");
+
+ _city_status pushBack (_y getVariable "data_units");
+
+ _city_status pushBack (_y getVariable ["has_ho", false]);
+ _city_status pushBack (_y getVariable ["ho_units_spawned", false]);
+ _city_status pushBack (_y getVariable ["ieds", []]);
+ _city_status pushBack (_y getVariable ["has_suicider", false]);
+ _city_status pushBack (_y getVariable ["data_animals", []]);
+ _city_status pushBack (_y getVariable ["data_tags", []]);
+ _city_status pushBack (_y getVariable ["btc_rep_civKilled", []]);
+ _city_status pushBack (_y getVariable ["btc_rep_graves", []]);
+
+ _cities_status pushBack _city_status;
+ if (btc_debug_log) then {
+ [format ["ID %1 - IsOccupied %2", _y getVariable "id", _y getVariable "occupied"], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} forEach btc_city_all;
+profileNamespace setVariable [format ["btc_hm_%1_cities", _name], +_cities_status];
+
+//HIDEOUT
+private _array_ho = [];
+{
+ private _data = [];
+ (getPos _x) params ["_xx", "_yy"];
+ _data pushBack [_xx, _yy, 0];
+ _data pushBack (_x getVariable ["id", 0]);
+ _data pushBack (_x getVariable ["rinf_time", 0]);
+ _data pushBack (_x getVariable ["cap_time", 0]);
+ _data pushBack ((_x getVariable ["assigned_to", objNull]) getVariable "id");
+
+ private _ho_markers = [];
+ {
+ private _marker = [];
+ _marker pushBack (getMarkerPos _x);
+ _marker pushBack (markerText _x);
+ _ho_markers pushBack _marker;
+ } forEach (_x getVariable ["markers", []]);
+ _data pushBack _ho_markers;
+ if (btc_debug_log) then {
+ [format ["HO %1 DATA %2", _x, _data], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ _array_ho pushBack _data;
+} forEach btc_hideouts;
+profileNamespace setVariable [format ["btc_hm_%1_ho", _name], +_array_ho];
+
+profileNamespace setVariable [format ["btc_hm_%1_ho_sel", _name], btc_hq getVariable ["id", 0]];
+
+if (btc_debug) then {
+ ["...2", __FILE__, [btc_debug, false, true]] call btc_debug_fnc_message;
+};
+
+//CACHE
+private _array_cache = [];
+_array_cache pushBack (getPosATL btc_cache_obj);
+_array_cache pushBack btc_cache_n;
+_array_cache pushBack btc_cache_info;
+private _cache_markers = [];
+{
+ private _data = [];
+ _data pushBack (getMarkerPos _x);
+ _data pushBack (markerText _x);
+ _cache_markers pushBack _data;
+} forEach btc_cache_markers;
+_array_cache pushBack _cache_markers;
+_array_cache pushBack [btc_cache_pictures select 0, btc_cache_pictures select 1, []];
+_array_cache pushBack (btc_cache_obj in btc_chem_contaminated);
+_array_cache pushBack (btc_cache_obj getVariable ["btc_cache_unitsSpawned", false]);
+profileNamespace setVariable [format ["btc_hm_%1_cache", _name], +_array_cache];
+
+//REPUTATION
+profileNamespace setVariable [format ["btc_hm_%1_rep", _name], btc_global_reputation];
+
+//FOBS
+private _fobs = [];
+{
+ if !(isNull ((btc_fobs select 2) select _forEachIndex)) then {
+ private _pos = getMarkerPos [_x, true];
+ private _direction = getDir ((btc_fobs select 1) select _forEachIndex);
+ _fobs pushBack [markerText _x, _pos, _direction];
+ };
+} forEach (btc_fobs select 0);
+profileNamespace setVariable [format ["btc_hm_%1_fobs", _name], +_fobs];
+
+//Vehicles status
+private _array_veh = [];
+private _vehicles = btc_vehicles - [objNull];
+private _vehiclesNotInCargo = _vehicles select {
+ isNull isVehicleCargo _x &&
+ {isNull isVehicleCargo attachedTo _x}
+};
+private _vehiclesInCargo = _vehicles - _vehiclesNotInCargo;
+{
+ (_x call btc_db_fnc_saveObjectStatus) params [
+ "_type", "_pos", "_dir", "", "_cargo",
+ "_inventory", "_vectorPos", "_isContaminated", "",
+ ["_flagTexture", "", [""]],
+ ["_turretMagazines", [], [[]]],
+ ["_notuse", "", [""]],
+ ["_tagTexture", "", [""]],
+ ["_properties", [], [[]]],
+ ["_playerKiller", "", [""]]
+ ];
+
+ private _data = [];
+ _data pushBack _type;
+ _data pushBack _pos;
+ _data pushBack _dir;
+ _data pushBack (fuel _x);
+ _data pushBack (getAllHitPointsDamage _x);
+ _data pushBack _cargo;
+ _data pushBack _inventory;
+ _data append ([_x] call btc_veh_fnc_propertiesGet);
+ _data pushBack (_x getVariable ["btc_EDENinventory", []]);
+ _data pushBack _vectorPos;
+ _data pushBack []; // ViV
+ _data pushBack _flagTexture;
+ _data pushBack _turretMagazines;
+ _data pushBack _tagTexture;
+ _data pushBack _properties;
+ _data pushBack _playerKiller;
+
+ private _fakeViV = isVehicleCargo attachedTo _x;
+ if (
+ isNull _fakeViV &&
+ {isNull isVehicleCargo _x}
+ ) then {
+ _array_veh pushBack _data;
+ } else {
+ private _vehicleCargo = if (isNull _fakeViV) then {
+ isVehicleCargo _x
+ } else {
+ _fakeViV
+ };
+ private _index = _vehiclesNotInCargo find _vehicleCargo;
+ ((_array_veh select _index) select 17) pushBack _data;
+ };
+
+ if (btc_debug_log) then {
+ [format ["VEH %1 DATA %2", _x, _data], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} forEach (_vehiclesNotInCargo + _vehiclesInCargo);
+profileNamespace setVariable [format ["btc_hm_%1_vehs", _name], +_array_veh];
+
+//Objects status
+private _array_obj = [];
+{
+ if !(!alive _x || isNull _x) then {
+ private _data = [_x] call btc_db_fnc_saveObjectStatus;
+ _array_obj pushBack _data;
+ };
+} forEach (btc_log_obj_created select {
+ !(isObjectHidden _x) &&
+ isNull objectParent _x &&
+ isNull isVehicleCargo _x
+});
+profileNamespace setVariable [format ["btc_hm_%1_objs", _name], +_array_obj];
+
+//Player Tags
+private _tags = btc_tags_player select {alive (_x select 0)};
+private _tags_properties = _tags apply {
+ private _tag = _x select 0;
+ [
+ getPosASL _tag,
+ [vectorDir _tag, vectorUp _tag],
+ _x select 1,
+ typeOf (_x select 2),
+ typeOf _tag
+ ]
+};
+profileNamespace setVariable [format ["btc_hm_%1_tags", _name], +_tags_properties];
+
+//Player respawn tickets
+if (btc_p_respawn_ticketsAtStart >= 0) then {
+ profileNamespace setVariable [format ["btc_hm_%1_respawnTickets", _name], +btc_respawn_tickets];
+
+ private _deadBodyPlayers = [btc_body_deadPlayers] call btc_body_fnc_get;
+ profileNamespace setVariable [format ["btc_hm_%1_deadBodyPlayers", _name], +_deadBodyPlayers];
+};
+
+//Player slots
+{
+ if (alive _x) then {
+ _x call btc_slot_fnc_serializeState;
+ };
+} forEach (allPlayers - entities "HeadlessClient_F");
+private _slots_serialized = +btc_slots_serialized;
+{
+ if (btc_debug_log) then {
+ [format ["btc_slots_serialized %1 %2", _x, _y], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ if (_y isEqualTo []) then {continue};
+ private _vehicle = _y select 6;
+ if !(isNull _vehicle) then {
+ _y set [0, getPosASL _vehicle];
+ };
+ _y set [6, typeOf _vehicle];
+} forEach _slots_serialized;
+profileNamespace setVariable [format ["btc_hm_%1_slotsSerialized", _name], +_slots_serialized];
+
+//Player Markers
+private _player_markers = allMapMarkers select {"_USER_DEFINED" in _x};
+private _markers_properties = _player_markers apply {
+ [markerText _x, markerPos _x, markerColor _x, markerType _x, markerSize _x, markerAlpha _x, markerBrush _x, markerDir _x, markerShape _x, markerPolyline _x, markerChannel _x]
+};
+profileNamespace setVariable [format ["btc_hm_%1_markers", _name], +_markers_properties];
+
+//Explosives
+private _explosives = [];
+{
+ _x params ["_explosive", "_dir", "_pitch"];
+ if (isNull _explosive) then {continue};
+ _explosives pushBack [
+ typeOf _explosive,
+ _dir,
+ _pitch,
+ getPosATL _explosive,
+ _explosive getVariable ["btc_side", sideEmpty]
+ ]
+} forEach btc_explosives;
+{
+ _explosives pushBack [
+ typeOf _x,
+ getDir _x,
+ 0,
+ getPosATL _x,
+ _x getVariable ["btc_side", side group ((getShotParents _x) select 0)]
+ ]
+} forEach (allMines select {_x isKindOf "APERSMineDispenser_Mine_Ammo"});
+profileNamespace setVariable [format ["btc_hm_%1_explosives", _name], +_explosives];
+
+//End
+profileNamespace setVariable [format ["btc_hm_%1_db", _name], true];
+saveProfileNamespace;
+if (btc_debug) then {
+ ["...3", __FILE__, [btc_debug, false, true]] call btc_debug_fnc_message;
+};
+[9] remoteExecCall ["btc_fnc_show_hint", 0];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/saveObjectStatus.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/saveObjectStatus.sqf
new file mode 100644
index 0000000..91a7af5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/saveObjectStatus.sqf
@@ -0,0 +1,62 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_saveObjectStatus
+
+Description:
+ Save all data from an object like position, ACE cargo, inventory ...
+
+Parameters:
+ _object - Object to get data. [Object]
+
+Returns:
+ _data - Data array (type, position, direction ...). [Array]
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_db_fnc_saveObjectStatus;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]]
+];
+
+private _data = [];
+_data pushBack (typeOf _object);
+_data pushBack (getPosASL _object);
+_data pushBack (getDir _object);
+_data pushBack "";
+private _cargo = (_object getVariable ["ace_cargo_loaded", []]) apply {
+ if (_x isEqualType "") then {
+ [_x, nil, [[], [], []]]
+ } else {
+ [
+ typeOf _x,
+ nil,
+ _x call btc_log_fnc_inventoryGet,
+ _x in btc_chem_contaminated,
+ _x call btc_body_fnc_dogtagGet,
+ magazinesAllTurrets _x,
+ _x getVariable ["ace_cargo_customName", ""],
+ [_x] call btc_veh_fnc_propertiesGet,
+ _x getVariable ["btc_rep_playerKiller", ""]
+ ]
+ };
+};
+_data pushBack _cargo;
+_data pushBack (_object call btc_log_fnc_inventoryGet);
+_data pushBack [vectorDir _object, vectorUp _object];
+_data pushBack (_object in btc_chem_contaminated);
+_data pushBack (_object call btc_body_fnc_dogtagGet);
+_data pushBack (getForcedFlagTexture _object);
+_data pushBack (magazinesAllTurrets _object);
+_data pushBack (_object getVariable ["ace_cargo_customName", ""]);
+_data pushBack (_object getVariable ["btc_tag_vehicle", ""]);
+_data pushBack ([_object] call btc_veh_fnc_propertiesGet);
+_data pushBack (_object getVariable ["btc_rep_playerKiller", ""]);
+
+_data
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/db/setTurretMagazines.sqf b/hearts_and_minds.kunduz_valley/core/fnc/db/setTurretMagazines.sqf
new file mode 100644
index 0000000..7746efe
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/db/setTurretMagazines.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_db_fnc_setTurretMagazines
+
+Description:
+ Set turret magazines.
+
+Parameters:
+ _vehicle - Vehicle to add magazines. [Object]
+ _turretMagazines - Turret magazines. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [magazinesAllTurrets cursorObject] call btc_db_fnc_setTurretMagazines;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]],
+ ["_turretMagazines", [], [[]]]
+];
+
+if (_turretMagazines isEqualTo []) exitWith {};
+
+{
+ _x params ["_magazineClass", "_turretPath"];
+ _vehicle removeMagazineTurret [_magazineClass, _turretPath];
+ false
+} forEach (magazinesAllTurrets _vehicle);
+{
+ _x params ["_magazineClass", "_turretPath", "_ammoCount"];
+ _vehicle addMagazineTurret [_magazineClass, _turretPath, _ammoCount];
+} forEach _turretMagazines;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/deaf/earringing.sqf b/hearts_and_minds.kunduz_valley/core/fnc/deaf/earringing.sqf
new file mode 100644
index 0000000..bcdd614
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/deaf/earringing.sqf
@@ -0,0 +1,28 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_deaf_fnc_earringing
+
+Description:
+ Create earringing to all player in a radius of 100m.
+
+Parameters:
+ _pos - Sound position source. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos (allPlayers select 0)] call btc_deaf_fnc_earringing;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+
+private _players_close = allPlayers inAreaArray [_pos, 100, 100];
+[20] remoteExecCall ["ace_hearing_fnc_earRinging", _players_close];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/defines.hpp b/hearts_and_minds.kunduz_valley/core/fnc/debug/defines.hpp
new file mode 100644
index 0000000..827e859
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/defines.hpp
@@ -0,0 +1,133 @@
+// Generated by: "Default" call BIS_fnc_exportGUIBaseClasses;
+
+// Control types
+#define CT_STATIC 0
+#define CT_PROGRESS 8
+#define CT_CONTROLS_GROUP 15
+
+
+// Static styles
+#define ST_LEFT 0x00
+#define ST_CENTER 0x02
+
+#define ST_MULTI 0x10
+
+// progress bar
+#define ST_VERTICAL 0x01
+#define ST_HORIZONTAL 0
+
+// Default text sizes
+#define GUI_GRID_WAbs ((safezoneW / safezoneH) min 1.2)
+#define GUI_GRID_HAbs (GUI_GRID_WAbs / 1.2)
+#define GUI_GRID_W (GUI_GRID_WAbs / 40)
+#define GUI_GRID_H (GUI_GRID_HAbs / 25)
+
+// Default text sizes
+#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1)
+
+class ScrollBar {
+ color[] = {1,1,1,0.6};
+ colorActive[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.3};
+ width = 0;
+ height = 0;
+ autoScrollEnabled = 0;
+ autoScrollSpeed = -1;
+ autoScrollDelay = 5;
+ autoScrollRewind = 0;
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ shadow = 0;
+ scrollSpeed = 0.06;
+};
+class IGUIBack {
+ type = CT_STATIC;
+ idc = -1;
+ style = ST_CENTER;
+ shadow = 2;
+ colorText[] = {0,1,0,1};
+ font = "puristaMedium";
+ sizeEx = 0.02;
+ colorBackground[] = { 0,0,0, 0.8 };
+ text = "";
+};
+class RscText {
+ deletable = 0;
+ fade = 0;
+ access = 0;
+ type = CT_STATIC;
+ idc = -1;
+ colorBackground[] = {0,0,0,0};
+ colorText[] = {1,1,1,1};
+ text = "";
+ fixedWidth = 0;
+ x = 0;
+ y = 0;
+ h = 0.037;
+ w = 0.3;
+ style = ST_LEFT;
+ shadow = 1;
+ colorShadow[] = {0,0,0,0.5};
+ font = "RobotoCondensed";
+ SizeEx = GUI_TEXT_SIZE_MEDIUM;
+ linespacing = 1;
+ tooltipColorText[] = {1,1,1,1};
+ tooltipColorBox[] = {1,1,1,1};
+ tooltipColorShade[] = {0,0,0,0.65};
+};
+class RscControlsGroup {
+ deletable = 0;
+ fade = 0;
+ class VScrollbar: ScrollBar {
+ color[] = {1,1,1,1};
+ width = 0.021;
+ autoScrollEnabled = 1;
+ };
+ class HScrollbar: ScrollBar {
+ color[] = {1,1,1,1};
+ height = 0.028;
+ };
+ class Controls {
+ };
+ type = CT_CONTROLS_GROUP;
+ idc = -1;
+ x = 0;
+ y = 0;
+ w = 1;
+ h = 1;
+ shadow = 0;
+ style = ST_MULTI;
+};
+class RscControlsGroupNoScrollbars: RscControlsGroup {
+ class VScrollbar: VScrollbar {
+ width = 0;
+ };
+ class HScrollbar: HScrollbar {
+ height = 0;
+ };
+};
+class RscProgress {
+ deletable = 0;
+ fade = 0;
+ access = 0;
+ type = CT_PROGRESS;
+ style = ST_HORIZONTAL;
+ colorFrame[] = {0,0,0,0};
+ colorBar[] = {
+ "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.13])",
+ "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.54])",
+ "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.21])",
+ "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])"
+ };
+ x = 0.344;
+ y = 0.619;
+ w = 0.313726;
+ h = 0.0261438;
+ shadow = 2;
+ texture = "#(argb,8,8,3)color(1,1,1,1)";
+};
+class RscVProgress: RscProgress {
+ style = ST_VERTICAL;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/dlg.hpp b/hearts_and_minds.kunduz_valley/core/fnc/debug/dlg.hpp
new file mode 100644
index 0000000..9a25a3f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/dlg.hpp
@@ -0,0 +1,53 @@
+class TER_fpscounter
+{
+ idd = 73001;
+ duration = 1e+1000;
+ onLoad = "_this call btc_debug_fnc_graph;";
+ class controls
+ {
+ class IGUIBack_2200: IGUIBack
+ {
+ idc = 2200;
+ x = 0.5525 * safezoneW + safezoneX;
+ y = 0.71 * safezoneH + safezoneY;
+ w = 0.433125 * safezoneW;
+ h = 0.266 * safezoneH;
+ };
+ class GRP_frames: RscControlsGroupNoScrollbars
+ {
+ idc = 9901;
+ x = 0.5525 * safezoneW + safezoneX;
+ y = 0.71 * safezoneH + safezoneY;
+ w = 0.433125 * safezoneW;
+ h = 0.266 * safezoneH;
+ };
+ class TXT_fps: RscText
+ {
+ idc = 1000;
+ text = "FPS SERVER: 60";
+ colorText[] = {1,0.64,0,1};
+ x = 0.5525 * safezoneW + safezoneX;
+ y = 0.71 * safezoneH + safezoneY;
+ w = 0.08 * safezoneW;
+ h = 0.028 * safezoneH;
+ };
+ class RscText_1001: RscText
+ {
+ idc = 1001;
+ text = "Time";
+ x = 0.933125 * safezoneW + safezoneX;
+ y = 0.948 * safezoneH + safezoneY;
+ w = 0.0459375 * safezoneW;
+ h = 0.028 * safezoneH;
+ };
+ class TXT_units: RscText
+ {
+ idc = 1002;
+ text = "DELAY:0s UNITS:0 NOT-ON-SERVER:0 | GROUPS:0 | Patrol:0 Traffic:0";
+ x = (0.5525 + 0.085) * safezoneW + safezoneX;
+ y = 0.71 * safezoneH + safezoneY;
+ w = (0.0590625 + 0.4) * safezoneW;
+ h = 0.028 * safezoneH;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/fps.sqf b/hearts_and_minds.kunduz_valley/core/fnc/debug/fps.sqf
new file mode 100644
index 0000000..c174a0e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/fps.sqf
@@ -0,0 +1,59 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_debug_fnc_fps
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _args - [Array]
+ _id - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_debug_fnc_fps;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_args", [], [[]]],
+ ["_id", 0, [0]]
+];
+_args params ["_display", "_maxFps", "_maxWidth", "_width", "_barArray", "_GRPframes", "_TXTfps"];
+
+if (isNull _display || !btc_debug_graph) exitWith {
+ [_id] call CBA_fnc_removePerFrameHandler;
+ _display closeDisplay 1;
+};
+
+[11, objNull, "btc_debug_frames"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+private _frames = btc_debug_frames;
+_TXTfps ctrlSetText format ["SERVER FPS: %1", _frames];
+
+private _newBar = _display ctrlCreate ["RscVProgress", -1, _GRPframes];
+private _arraysize = count _barArray -1;
+{
+ _x ctrlSetPosition [_maxWidth - ((_arraysize - _forEachIndex + 2) * _width), 0];
+ _x ctrlCommit 0;
+} forEach _barArray;
+_barArray pushBack _newBar;
+_newBar ctrlSetPosition [
+ _maxWidth-_width,
+ 0,
+ _width,
+ 0.252 * safezoneH
+];
+
+private _firstCtrl = _barArray select 0;
+_newBar ctrlCommit 0;
+_newBar progressSetPosition (_frames/_maxFps);
+if ((ctrlPosition _firstCtrl) select 0 < 0) then {
+ ctrlDelete _firstCtrl;
+ _barArray deleteAt 0;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/graph.sqf b/hearts_and_minds.kunduz_valley/core/fnc/debug/graph.sqf
new file mode 100644
index 0000000..1dc0e05
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/graph.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_debug_fnc_graph
+
+Description:
+ https://forums.bohemia.net/forums/topic/204157-display-graph-in-dialog/
+
+Parameters:
+ _display - [Display]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_debug_fnc_graph;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+disableSerialization;
+
+params [
+ ["_display", displayNull, [displayNull]]
+];
+
+private _GRPframes = _display displayCtrl 9901;
+private _TXTfps = _display displayCtrl 1000;
+private _TXTunits = _display displayCtrl 1002;
+private _barArray = [];
+private _maxFps = 60;
+private _maxWidth = ctrlPosition _GRPframes select 2;
+private _width = _maxWidth/300;
+
+[btc_debug_fnc_fps, [0.5, 0.1] select (isServer), [_display, _maxFps, _maxWidth, _width, _barArray, _GRPframes, _TXTfps]] call CBA_fnc_addPerFrameHandler;
+
+[btc_debug_fnc_units, 1, [_display, _TXTunits]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/marker.sqf b/hearts_and_minds.kunduz_valley/core/fnc/debug/marker.sqf
new file mode 100644
index 0000000..50ab285
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/marker.sqf
@@ -0,0 +1,87 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_debug_fnc_marker
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _display - [Control]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_debug_fnc_marker;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_display", controlNull, [controlNull]]
+];
+
+private _units = btc_units_owners apply {_x select 0};
+private _owners = btc_units_owners apply {_x select 1};
+
+private _cfgVehicles = configFile >> "CfgVehicles";
+{
+ private _typeof = typeOf _x;
+
+ private _alpha = 1;
+ if ((_owners select _forEachindex) isNotEqualTo 2) then {
+ _alpha = 0.3;
+ };
+
+ private _color = [];
+ switch (side _x) do {
+ case (west) : {_color = [0, 0, 1, _alpha]};
+ case (east) : {_color = [1, 0, 0, _alpha]};
+ case (independent) : {_color = [0, 1, 0, _alpha]};
+ default {_color = [1, 1, 1, _alpha]};
+ };
+
+ private _text = "";
+ if (leader group _x isEqualTo _x) then {
+ _text = format ["%1 (%2)", _typeof, group _x getVariable ["btc_patrol_id", ""]];
+ } else {
+ if ((_x isKindOf "car") OR (_x isKindOf "tank") OR (_x isKindOf "ship") OR (_x isKindOf "air")) then {
+ _text = "";
+ _color = [1, 0, 0.5, _alpha];
+ } else {
+ _text = format ["%1", _typeof];
+ };
+ };
+
+ _display drawIcon [
+ getText (_cfgVehicles >> _typeof >> "Icon"),
+ _color,
+ visiblePosition _x,
+ 20,
+ 20,
+ direction _x,
+ _text,
+ 0,
+ 0.05
+ ];
+} forEach _units;
+
+{
+ private _agent = agent _x;
+ if !(isNull _agent) then {
+ _display drawIcon [
+ getText (configOf _agent >> "Icon"),
+ [0.5, 0.5, 0.5, [1, 0.3] select (local _agent)],
+ visiblePosition _agent,
+ 20,
+ 20,
+ direction _agent,
+ "",
+ 0,
+ 0.05
+ ];
+ };
+} forEach agents;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/message.sqf b/hearts_and_minds.kunduz_valley/core/fnc/debug/message.sqf
new file mode 100644
index 0000000..b59c6f6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/message.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_debug_fnc_message
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _message - [String]
+ _folder - [String]
+ _type - [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_debug_fnc_message;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_message", "BTC Message debug", [""]],
+ ["_folder", __FILE__, [""]],
+ ["_type", [], [[]]]
+];
+
+private _startPosition = _folder find "fnc";
+if (_startPosition isEqualTo -1) then {
+ _startPosition = (_folder find worldName) + count worldName;
+};
+
+[_message, _folder select [_startPosition, (_folder find ".sqf") - _startPosition], _type] call CBA_fnc_debug;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/debug/units.sqf b/hearts_and_minds.kunduz_valley/core/fnc/debug/units.sqf
new file mode 100644
index 0000000..126d9d0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/debug/units.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_debug_fnc_units
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _args - [Array]
+ _id - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_debug_fnc_units;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_args", [], [[]]],
+ ["_id", 0, [0]]
+];
+_args params ["_display", "_TXTunits"];
+
+if (isNull _display || !btc_debug_graph) exitWith {
+ [_id] call CBA_fnc_removePerFrameHandler;
+ _display closeDisplay 1;
+};
+
+[10, objNull, "btc_units_owners"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+["btc_patrol_active", objNull, "btc_patrol_active"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+["btc_civ_veh_active", objNull, "btc_civ_veh_active"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+["btc_delay_time", objNull, "btc_delay_timeDebug"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+private _count_units = {(_x select 0) isKindOf "man"} count btc_units_owners;
+private _count_units_own = {((_x select 1) isEqualTo 2) && ((_x select 0) isKindOf "man")} count btc_units_owners;
+
+_TXTunits ctrlSetText format ["DELAY:%1s UNITS:%2 NOT-ON-SERVER:%3 | GROUPS:%4 | Patrol:%5 Traffic:%6", [btc_delay_timeDebug, 0] select (btc_delay_timeDebug < 0.001), _count_units, _count_units - _count_units_own, count allGroups, count btc_patrol_active, count btc_civ_veh_active];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/delay/createAgent.sqf b/hearts_and_minds.kunduz_valley/core/fnc/delay/createAgent.sqf
new file mode 100644
index 0000000..0bde78c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/delay/createAgent.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_delay_fnc_createAgent
+
+Description:
+ Create agent when all previous agents have been created. btc_delay_time define the time (in second) when the agent will be created.
+
+Parameters:
+ _agentType - Type of agents to create. [Array]
+ _pos - Position of creation. [Array]
+ _special - Agent placement special. [String]
+ _city - City where the animal is created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["Sheep_random_F", getPosATL player] call btc_delay_fnc_createAgent;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+btc_delay_time = btc_delay_time + btc_delay_agent;
+
+[{
+ btc_delay_time = btc_delay_time - btc_delay_agent;
+
+ params [
+ ["_agentType", "", [""]],
+ ["_pos", [0, 0, 0], [[]]],
+ ["_special", "CAN_COLLIDE", [""]],
+ ["_city", objNull, [objNull]]
+ ];
+
+ private _agent = createAgent [_agentType, _pos, [], 0, _special];
+ _agent setVariable ["btc_city", _city];
+ _agent setDir random 360; // https://feedback.bistudio.com/T155634
+}, _this, btc_delay_createUnit - 0.01] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/delay/createUnit.sqf b/hearts_and_minds.kunduz_valley/core/fnc/delay/createUnit.sqf
new file mode 100644
index 0000000..939685b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/delay/createUnit.sqf
@@ -0,0 +1,49 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_delay_fnc_createUnit
+
+Description:
+ Create unit when all previous units have been created. btc_delay_time define the time (in second) when the unit will be created.
+
+Parameters:
+ _group - Group to add unit. [Group]
+ _unit_type - Type of units to create. [Array]
+ _pos - Position of creation. [Array]
+ _special - Unit placement special. [String]
+ _vehicle - Vehicle where unit can be load in. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [createGroup (side player), typeOf player, getPosATL player] call btc_delay_fnc_createUnit;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+btc_delay_time = btc_delay_time + btc_delay_unit;
+
+[{
+ btc_delay_time = btc_delay_time - btc_delay_unit;
+
+ params [
+ ["_group", grpNull, [grpNull]],
+ ["_unit_type", "", [""]],
+ ["_pos", [0, 0, 0], [[], createHashMap]],
+ ["_special", "CARGO", [""]],
+ ["_vehicle", objNull, [objNull]]
+ ];
+
+ if !(_pos isEqualType []) then {
+ _pos = _pos get "_pos";
+ };
+ private _unit = _group createUnit [_unit_type, _pos, [], 0, _special];
+ [_unit] joinSilent _group;
+
+ if (!isNull _vehicle) then {
+ _unit moveInAny _vehicle;
+ };
+}, _this, btc_delay_time - 0.01] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/delay/createVehicle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/delay/createVehicle.sqf
new file mode 100644
index 0000000..013be57
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/delay/createVehicle.sqf
@@ -0,0 +1,90 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_delay_fnc_createVehicle
+
+Description:
+ Create vehicle and crew when all previous units have been created. btc_delay_time define the time (in second) when the vehicle and crew will be created.
+
+Parameters:
+ _group - Group to store crews. [Group]
+ _vehicle_type - Vehicle type. [String]
+ _units_type - Array of unit type will be use to fill the vehicle. [Array]
+ _position - Position of creation. [Array]
+ _direction - Direction of spawn. [Number]
+ _fuel - Fuel level. [Array]
+ _surfaceNormal - Surface normal. [Array]
+
+Returns:
+ _delay_vehicle - Delay for unit creation. [Number]
+
+Examples:
+ (begin example)
+ [createGroup (side player), "O_G_Van_01_transport_F", (btc_type_units + btc_type_units) select [0, ["O_G_Van_01_transport_F",true] call BIS_fnc_crewCount], player getPos [10, direction player]] call btc_delay_fnc_createVehicle;
+ [createGroup (side player), "B_Heli_Transport_01_camo_F", (btc_type_units + btc_type_units) select [0, ["B_Heli_Transport_01_camo_F",true] call BIS_fnc_crewCount], player getPos [10, direction player]] call btc_delay_fnc_createVehicle;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+btc_delay_time = btc_delay_time + btc_delay_vehicle;
+
+[{
+ btc_delay_time = btc_delay_time - btc_delay_vehicle;
+
+ params [
+ ["_group", grpNull, [grpNull]],
+ ["_vehicle_type", "", [""]],
+ ["_units_type", [], [[]]],
+ ["_position", [0, 0, 0], [[]]],
+ ["_direction", 0, [0]],
+ ["_fuel", 1, [0]],
+ ["_surfaceNormal", [], [[]]]
+ ];
+
+ private _isAir = _vehicle_type isKindOf "Air";
+ private _veh = createVehicle [_vehicle_type, _position, [], 0, ["CAN_COLLIDE", "FLY"] select _isAir];
+ if !(_isAir) then {
+ _veh setDir _direction;
+ if (_surfaceNormal isEqualTo []) then {
+ _surfaceNormal = surfaceNormal position _veh;
+ };
+ _veh setVectorUp _surfaceNormal;
+ };
+ _veh setFuel _fuel;
+ [_veh, "", []] call BIS_fnc_initvehicle;
+
+ ["driver", "commander", "gunner", "turret", "cargo"] apply {count (fullCrew [_veh, _x, true]);} params ["_driverCount", "_commanderCount", "_gunnerCount", "_turretCount", "_cargoCount"];
+ private _crews = _driverCount + _commanderCount + _gunnerCount;
+ private _numberOfUnits = count _units_type;
+ for "_i" from 0 to ((_crews min _numberOfUnits) - 1) do {
+ private _unit = _group createUnit [_units_type select _i, _position, [], 0, "CAN_COLLIDE"];
+
+ if (_veh emptyPositions "driver" > 0) then {
+ _unit moveinDriver _veh;
+ _unit assignAsDriver _veh;
+ } else {
+ if (_veh emptyPositions "gunner" > 0) then {
+ _unit moveinGunner _veh;
+ _unit assignAsGunner _veh;
+ } else {
+ if (_veh emptyPositions "commander" > 0) then {
+ _unit moveinCommander _veh;
+ _unit assignAsCommander _veh;
+ };
+ };
+ };
+ };
+ _group selectLeader (driver _veh);
+ (units _group) joinSilent _group;
+
+ private _crews_and_turret = _crews + _turretCount + _cargoCount;
+ for "_i" from _crews to ((_crews_and_turret min _numberOfUnits) - 1) do {
+ [_group, _units_type select _i, _position, "CAN_COLLIDE", _veh] call btc_delay_fnc_createUnit;
+ };
+
+ ["btc_delay_vehicleInit", [_veh, _group]] call CBA_fnc_localEvent;
+}, _this, btc_delay_time - 0.01] call CBA_fnc_waitAndExecute;
+
+count (_this select 2) * btc_delay_unit
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/delay/exec.sqf b/hearts_and_minds.kunduz_valley/core/fnc/delay/exec.sqf
new file mode 100644
index 0000000..6c4238a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/delay/exec.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_delay_fnc_exec
+
+Description:
+ Execute a function when all previous units have been created.
+
+Parameters:
+ _parameters - Parameters to the function. [Array]
+ _code - Code to execute. [Code]
+
+Returns:
+
+Examples:
+ (begin example)
+ [[btc_city_all get 0, 100], btc_ied_fnc_drone_create] call btc_delay_fnc_exec;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+btc_delay_time = btc_delay_time + btc_delay_exec;
+
+[{
+ btc_delay_time = btc_delay_time - btc_delay_exec;
+
+ params [
+ "_parameters",
+ ["_code", {}, [{}]]
+ ];
+
+ _parameters call _code;
+}, _this, btc_delay_time - 0.01] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/delay/waitAndExecute.sqf b/hearts_and_minds.kunduz_valley/core/fnc/delay/waitAndExecute.sqf
new file mode 100644
index 0000000..c838826
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/delay/waitAndExecute.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_delay_fnc_waitAndExecute
+
+Description:
+ Wait and execute a function with a _delay. Usefull when used after btc_delay_fnc_createVehicle that return a delay.
+
+Parameters:
+ _code - Code to execute. [Code]
+ _parameters - Parameters to the function. [Array]
+ _delay - Delay of execution. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [{systemChat _this}, "hello", 0] call btc_delay_fnc_waitAndExecute;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{
+ params [
+ ["_code", {}, [{}]],
+ ["_parameters", [], [[]]],
+ ["_delay", 0, [0]]
+ ];
+
+ if (_delay isEqualTo 0) exitWith {_parameters call _code};
+
+ [_code, _parameters, btc_delay_time + _delay] call CBA_fnc_waitAndExecute;
+}, _this, btc_delay_time] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/door/break.sqf b/hearts_and_minds.kunduz_valley/core/fnc/door/break.sqf
new file mode 100644
index 0000000..5d2b3d6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/door/break.sqf
@@ -0,0 +1,31 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_door_fnc_break
+
+Description:
+ Break locked door action.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_door_fnc_break;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+([2] call ace_interaction_fnc_getDoor) params ["_house", "_door"];
+if (_door isEqualTo "") exitWith {
+ (localize "STR_BTC_HAM_O_DOOR_NO") call CBA_fnc_notify;
+};
+
+[btc_door_breaking_time, [_house, _door, player, 0.2], {
+ params ["_args"];
+ playSound3D ["\z\ace\addons\logistics_wirecutter\sound\wirecut.ogg", player];
+ _args call btc_door_fnc_broke;
+}, {}, localize "STR_BTC_HAM_O_DOOR_BREAKING", {true}, ["isNotInside"]] call ace_common_fnc_progressBar;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/door/broke.sqf b/hearts_and_minds.kunduz_valley/core/fnc/door/broke.sqf
new file mode 100644
index 0000000..7402c81
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/door/broke.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_door_fnc_broke
+
+Description:
+ Unlock door.
+
+Parameters:
+ _house - House. [Object]
+ _door - Door name. [String]
+ _instigator - Who broke the door. [Object]
+ _phase - Range 0 (start point of the animation) to 1 (end point of the animation). [Number]
+ _speed - Boolean or Number: When true animation is instant. Since Arma 3 v1.66 Number > 0 is treated as config speed value multiplier.
+
+Returns:
+
+Examples:
+ (begin example)
+ ([2] call ace_interaction_fnc_getDoor) call btc_door_fnc_broke;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_house", objNull, [objNull]],
+ ["_door", "", [""]],
+ ["_player", player, [objNull]],
+ ["_phase", 1, [0]],
+ ["_speed", false, [0, true]]
+];
+if (_door isEqualTo "") exitWith {};
+
+_house setVariable [format ["bis_disabled_%1", _door], 0, true];
+[btc_rep_malus_breakDoor, _player] remoteExecCall ["btc_rep_fnc_change", 2];
+
+private _getDoorAnimations = [_house, _door] call ace_interaction_fnc_getDoorAnimations;
+_getDoorAnimations params ["_animations"];
+if (_animations isEqualTo []) exitWith {};
+
+// Add handle on carrier
+if (typeOf _house == "Land_Carrier_01_island_01_F") then {
+ private _handle = format ["door_handle_%1_rot_1", (_animations select 0) select [5, 1]];
+ _animations pushBack _handle;
+};
+// do incremental door opening
+{
+ _house animate [_x, _phase, _speed];
+} forEach _animations;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/door/get.sqf b/hearts_and_minds.kunduz_valley/core/fnc/door/get.sqf
new file mode 100644
index 0000000..7846440
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/door/get.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_door_fnc_get
+
+Description:
+ Get door in front of an object.
+
+Parameters:
+ _distance - Distance to check intersect. [Number]
+ _object - From which ojects. [Object]
+ _offset - Off set for explosive. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [2] call btc_door_fnc_get;
+ (end)
+
+Author:
+ commy2
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_distance",
+ ["_object", cameraOn, [objNull]],
+ ["_offset", 0, [0]]
+];
+
+private _position0 = _object modelToWorld [0, 0, _offset];
+private _position1 = _object modelToWorld [0, _distance, _offset];
+
+private _intersections = lineIntersectsSurfaces [AGLToASL _position0, AGLToASL _position1, _object, objNull, true, 1, "GEOM"];
+
+if (_intersections isEqualTo []) exitWith {[objNull, ""]};
+
+private _house = _intersections select 0 select 2;
+
+// shithouse is bugged
+if (typeOf _house == "") exitWith {[objNull, ""]};
+
+_intersections = [_house, "GEOM"] intersect [_position0, _position1];
+
+private _door = toLower (_intersections select 0 select 0);
+
+if (isNil "_door") exitWith {[_house, ""]};
+
+//Check if door is glass because then we need to find the proper location of the door so we can use it
+if ((_door find "glass") != -1) then {
+ _door = [_distance, _house, _door] call ace_interaction_fnc_getGlassDoor;
+};
+
+if (isNil "_door") exitWith {[_house, ""]};
+
+[_house, _door]
\ No newline at end of file
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/door/lock.sqf b/hearts_and_minds.kunduz_valley/core/fnc/door/lock.sqf
new file mode 100644
index 0000000..efc1c05
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/door/lock.sqf
@@ -0,0 +1,62 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_door_fnc_lock
+
+Description:
+ Lock door in a city.
+
+Parameters:
+ _city - City. [Array]
+ _rep - Reputation level. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player] call btc_door_fnc_lock;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_rep", btc_global_reputation, [0]]
+];
+
+private _houses = +(_city getVariable ["btc_city_housesEntrerable", []]);
+private _ratio = switch (true) do {
+ case (_rep < btc_rep_level_low): {1};
+ case (_rep >= btc_rep_level_low && _rep < btc_rep_level_normal): {1/2};
+ case (_rep >= btc_rep_level_normal && _rep < btc_rep_level_high): {1/3};
+ case (_rep >= btc_rep_level_high): {0};
+};
+private _n = (count _houses) * _ratio;
+private _i = 1;
+
+while {
+ _i <= _n &&
+ {_houses isNotEqualTo []}
+} do {
+ private _house = _houses deleteAt 0;
+ private _numberOfDoors = getNumber (configOf _house >> "numberOfDoors");
+
+ if (_numberOfDoors isNotEqualTo 0) then {
+ if (isNil {_house getVariable "bis_disabled_Door_1"}) then {
+ for "_door" from 1 to _numberOfDoors do {
+ _house setVariable [format ["bis_disabled_Door_%1", _door], 1, true];
+ };
+ };
+ _i = _i + 1;
+ };
+};
+
+{
+ if (_x getVariable ["bis_disabled_Door_1", 0] isEqualTo 1) then {
+ for "_door" from 1 to getNumber (configOf _x >> "numberOfDoors") do {
+ _x setVariable [format ["bis_disabled_Door_%1", _door], nil, true];
+ };
+ };
+} forEach _houses;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/CuratorObjectPlaced.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/CuratorObjectPlaced.sqf
new file mode 100644
index 0000000..ae074d6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/CuratorObjectPlaced.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_CuratorObjectPlaced
+
+Description:
+ Initialise object placed by curator.
+
+Parameters:
+ _curator - Curator. [Object]
+ _object_placed - Object/Unit placed. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_eh_fnc_CuratorObjectPlaced;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_curator", objNull, [objNull]],
+ ["_object_placed", objNull, [objNull]]
+];
+
+if !((_object_placed isKindOf "allVehicles") || (_object_placed isKindOf "Module_F")) then {
+ [_object_placed] remoteExecCall ["btc_log_fnc_init", 2];
+
+ if (btc_debug_log) then {
+ [format ["OBJECT %1", _object_placed], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ if (btc_debug) then {
+ [str _object_placed, __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/headless.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/headless.sqf
new file mode 100644
index 0000000..4288f77
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/headless.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_headless
+
+Description:
+ Add local events handler to headless client.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_eh_fnc_headless;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+["Animal", "InitPost", {
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+}, true, [], true] call CBA_fnc_addClassEventHandler;
+{
+ [_x, "InitPost", {
+ [_this select 0, "Suppressed", btc_rep_fnc_suppressed] call CBA_fnc_addBISEventHandler;
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+ }, false, [], true] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_units;
+{
+ [_x, "InitPost", {
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+ }, false, [], true] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_veh;
+["ace_disarming_dropItems", btc_rep_fnc_foodRemoved] call CBA_fnc_addEventHandler;
+["ace_repair_setWheelHitPointDamage", {
+ _this remoteExecCall ["btc_rep_fnc_wheelChange", 2];
+}] call CBA_fnc_addEventHandler;
+
+{
+ [_x, "InitPost", {
+ [_this select 0, "HandleDamage", btc_patrol_fnc_disabled] call CBA_fnc_addBISEventHandler;
+ }, false, [], true] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_veh;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/player.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/player.sqf
new file mode 100644
index 0000000..a67f69c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/player.sqf
@@ -0,0 +1,143 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_player
+
+Description:
+ Add event handler to player.
+
+Parameters:
+ _player - Player to add event. [Object]
+
+Returns:
+ _eventHandleID - ID of the WeaponAssembled event handle. [Number]
+
+Examples:
+ (begin example)
+ _eventHandleID = [player] call btc_eh_fnc_player;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]]
+];
+
+[_player, "Respawn", {
+ params ["_unit", "_corpse"];
+ _corpse connectTerminalToUAV objNull;
+ if !(ace_map_mapIllumination) then {ace_map_mapIllumination = btc_map_mapIllumination;};
+}] call CBA_fnc_addBISEventHandler;
+["ace_killed", {
+ params ["_unit"];
+ if (_unit isNotEqualTo player) exitWith {};
+ if (ace_map_mapIllumination) then {ace_map_mapIllumination = false;};
+ if (isObjectHidden player) exitWith {};
+ if !(isServer) then { // Don't add twice the event in player host
+ ["btc_respawn_player", [_unit, player]] call CBA_fnc_localEvent;
+ };
+ ["btc_respawn_player", [_unit, player]] call CBA_fnc_serverEvent;
+}] call CBA_fnc_addEventHandler;
+{
+ _x addEventHandler ["CuratorObjectPlaced", btc_eh_fnc_CuratorObjectPlaced];
+} forEach allCurators;
+["ace_treatmentSucceded", btc_rep_fnc_treatment] call CBA_fnc_addEventHandler;
+if !(isServer) then { // Don't add twice the event in player host
+ ["ace_repair_setWheelHitPointDamage", {
+ _this remoteExecCall ["btc_rep_fnc_wheelChange", 2];
+ }] call CBA_fnc_addEventHandler;
+};
+_player addEventHandler ["WeaponAssembled", btc_civ_fnc_add_leaflets];
+[_player, "WeaponAssembled", {[_thisType, _this] call btc_fob_fnc_rallypointAssemble;}] call CBA_fnc_addBISEventHandler;
+[_player, "WeaponDisassembled", {[_thisType, _this] call btc_fob_fnc_rallypointAssemble;}] call CBA_fnc_addBISEventHandler;
+_player addEventHandler ["GetInMan", btc_ied_fnc_deleteLoop];
+_player addEventHandler ["GetInMan", {_this remoteExecCall ["btc_slot_fnc_serializeState", 2]}];
+_player addEventHandler ["GetOutMan", {
+ if (btc_ied_deleteOn > -1) then {
+ [btc_ied_deleteOn] call CBA_fnc_removePerFrameHandler;
+ btc_ied_deleteOn = -1;
+ };
+ _this remoteExecCall ["btc_slot_fnc_serializeState", 2];
+}];
+_player addEventHandler ["WeaponAssembled", {
+ params ["_player", "_static"];
+
+ if !(_static isKindOf "StaticWeapon") exitWith {_this};
+ [_static] remoteExecCall ["btc_log_fnc_init", 2];
+}];
+["ace_csw_deployWeaponSucceeded", {
+ _this remoteExecCall ["btc_log_fnc_init", 2];
+}] call CBA_fnc_addEventHandler;
+
+if (btc_p_chem_sides || (btc_p_chem_cache_probability > 0)) then {
+ // Add biopsy
+ [missionNamespace, "probingEnded", btc_chem_fnc_biopsy] call BIS_fnc_addScriptedEventHandler;
+
+ // Disable BI shower
+ ["DeconShower_01_F", "init", {(_this select 0) setVariable ['bin_deconshower_disableAction', true];}, true, [], true] call CBA_fnc_addClassEventHandler;
+ ["DeconShower_02_F", "init", {(_this select 0) setVariable ['bin_deconshower_disableAction', true];}, true, [], true] call CBA_fnc_addClassEventHandler;
+
+ [] call btc_chem_fnc_ehDetector;
+};
+
+if (btc_p_spect) then {
+ ["weapon", btc_spect_fnc_updateDevice] call CBA_fnc_addPlayerEventHandler;
+ ["vehicle", {
+ params ["_unit", "_newVehicle"];
+ [] call btc_spect_fnc_disableDevice;
+ [_unit, currentWeapon _unit] call btc_spect_fnc_updateDevice;
+ }] call CBA_fnc_addPlayerEventHandler;
+};
+
+if (btc_p_respawn_arsenal) then {
+ [_player, "Respawn", {
+ params ["_unit", "_corpse"];
+ if (isObjectHidden _corpse) exitWith {};
+ [btc_gear_object, _unit] call ace_arsenal_fnc_openBox;
+ }] call CBA_fnc_addBISEventHandler;
+};
+
+if (btc_p_respawn_location >= 4) then {
+ ["ace_killed", {
+ params ["_unit"];
+ if (_unit isNotEqualTo player) exitWith {};
+ private _group = group player;
+ [_group, leader _group] call BIS_fnc_addRespawnPosition;
+ }] call CBA_fnc_addEventHandler;
+};
+
+["btc_inGameUISetEventHandler", {
+ params ["_target", "", "", "", "_text"];
+ [_target, _text, ["siren_Start", "siren_stop"], "btc_int_sirenStart"] call btc_int_fnc_checkSirenBeacons;
+}] call CBA_fnc_addEventHandler;
+["btc_inGameUISetEventHandler", {
+ params ["_target", "", "", "", "_text"];
+ [_target, _text, ["beacons_start", "beacons_stop"], "btc_int_beaconsStart"] call btc_int_fnc_checkSirenBeacons;
+}] call CBA_fnc_addEventHandler;
+inGameUISetEventHandler ["Action", '["btc_inGameUISetEventHandler", _this] call CBA_fnc_localEvent; false'];
+
+[{!isNull (findDisplay 46)}, {
+ (findDisplay 46) displayAddEventHandler ["MouseButtonDown", btc_int_fnc_horn];
+}] call CBA_fnc_waitUntilAndExecute;
+
+if (btc_p_respawn_ticketsAtStart >= 0) then {
+ ["btc_respawn_player", {
+ [
+ [player, btc_player_side] select btc_p_respawn_ticketsShare,
+ btc_p_respawn_ticketsLost
+ ] call BIS_fnc_respawnTickets; // Need to be handle locally
+ _this remoteExecCall ["btc_respawn_fnc_player", 2];
+ }] call CBA_fnc_addEventHandler;
+};
+
+["ace_marker_flags_placed", {
+ params ["_unit", "_flag"];
+ _flag remoteExecCall ["btc_log_fnc_init", 2];
+}] call CBA_fnc_addEventHandler;
+
+["ace_flags_placed", {
+ params ["_player", "_flag", "_item"];
+ _flag remoteExecCall ["btc_log_fnc_init", 2];
+}] call CBA_fnc_addEventHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/playerConnected.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/playerConnected.sqf
new file mode 100644
index 0000000..5ef45fc
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/playerConnected.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_playerConnected
+
+Description:
+ Fire the event playerConnected.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_eh_fnc_playerConnected;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"];
+
+if (_name isEqualTo "__SERVER__") exitWith {};
+
+if (btc_debug_log) then {
+ [format ["_this %1", _this], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+[{
+ !isNull ((_this select 1) call BIS_fnc_getUnitByUID)
+}, {
+ ["btc_playerConnected", [(_this select 1) call BIS_fnc_getUnitByUID, _this]] call CBA_fnc_localEvent;
+}, _this, 20 * 60] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/server.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/server.sqf
new file mode 100644
index 0000000..315f0ad
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/server.sqf
@@ -0,0 +1,174 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_server
+
+Description:
+ Add event handler to server.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_eh_fnc_server;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+addMissionEventHandler ["BuildingChanged", btc_rep_fnc_buildingchanged];
+["ace_explosives_defuse", btc_rep_fnc_explosives_defuse] call CBA_fnc_addEventHandler;
+["ace_killed", btc_rep_fnc_killed] call CBA_fnc_addEventHandler;
+["Animal", "InitPost", {
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+}] call CBA_fnc_addClassEventHandler;
+["Animal", "killed", {
+ params ["_unit", "_killer", "_instigator"];
+ [_unit, "", _killer, _instigator] call btc_rep_fnc_killed;
+}] call CBA_fnc_addClassEventHandler;
+{
+ [_x, "InitPost", {
+ [_this select 0, "Suppressed", btc_rep_fnc_suppressed] call CBA_fnc_addBISEventHandler;
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+ }, false] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_units;
+{
+ [_x, "InitPost", {
+ [_this select 0, "HandleDamage", btc_rep_fnc_hd] call CBA_fnc_addBISEventHandler;
+ }, false] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_veh;
+["ace_killed", btc_mil_fnc_unit_killed] call CBA_fnc_addEventHandler;
+["ace_repair_setWheelHitPointDamage", btc_rep_fnc_wheelChange] call CBA_fnc_addEventHandler;
+["ace_disarming_dropItems", btc_rep_fnc_foodRemoved] call CBA_fnc_addEventHandler;
+["btc_respawn_player", {
+ params ["", "_player"];
+ [btc_rep_malus_player_respawn, _player] call btc_rep_fnc_change;
+ btc_slots_serialized set [
+ _player getVariable ["btc_slot_key", [0, 0, 0]],
+ [] // Reset serialized data if slot died
+ ];
+}] call CBA_fnc_addEventHandler;
+
+["ace_explosives_detonate", {
+ params ["_player", "_explosive", "_delay"];
+ [
+ btc_door_fnc_broke,
+ ([3, _explosive, 0.5] call btc_door_fnc_get) + [_player, 1, 2],
+ _delay
+ ] call CBA_fnc_waitAndExecute;
+}] call CBA_fnc_addEventHandler;
+
+addMissionEventHandler ["PlayerConnected", btc_eh_fnc_playerConnected];
+addMissionEventHandler ["HandleDisconnect", {
+ params ["_player"];
+ if (_player in (entities "HeadlessClient_F")) then {
+ deleteVehicle _player;
+ };
+ if (alive _player) then {
+ _player call btc_slot_fnc_serializeState;
+ };
+ false
+}];
+["ace_unconscious", btc_slot_fnc_serializeState] call CBA_fnc_addEventHandler;
+["btc_playerConnected", {
+ params ["_player", "_ids"];
+ [_player, _player call btc_slot_fnc_createKey, _ids select 4] call btc_slot_fnc_deserializeState_s;
+}] call CBA_fnc_addEventHandler;
+if (btc_p_auto_db) then {
+ addMissionEventHandler ["HandleDisconnect", {
+ params ["_player"];
+ if ((allPlayers - entities "HeadlessClient_F" - [_player]) isEqualTo []) then {
+ [] call btc_db_fnc_save;
+ };
+ }];
+};
+
+if (btc_p_chem_sides || (btc_p_chem_cache_probability > 0)) then {
+ ["ace_cargoLoaded", btc_chem_fnc_propagate] call CBA_fnc_addEventHandler;
+ ["AllVehicles", "GetIn", {[_this select 0, _this select 2] call btc_chem_fnc_propagate}] call CBA_fnc_addClassEventHandler;
+ ["DeconShower_01_F", "init", {
+ btc_chem_decontaminate pushBack (_this select 0);
+ (_this select 0) setVariable ['bin_deconshower_disableAction', true];
+ }, true, [], true] call CBA_fnc_addClassEventHandler;
+ ["DeconShower_02_F", "init", {
+ btc_chem_decontaminate pushBack (_this select 0);
+ (_this select 0) setVariable ['bin_deconshower_disableAction', true];
+ }, true, [], true] call CBA_fnc_addClassEventHandler;
+};
+
+["GroundWeaponHolder", "InitPost", {btc_groundWeaponHolder append _this}] call CBA_fnc_addClassEventHandler;
+["acex_fortify_objectPlaced", {[_this select 2] call btc_log_fnc_init}] call CBA_fnc_addEventHandler;
+if (btc_p_set_skill) then {
+ ["CAManBase", "InitPost", btc_mil_fnc_set_skill] call CBA_fnc_addClassEventHandler;
+};
+["btc_delay_vehicleInit", btc_patrol_fnc_addEH] call CBA_fnc_addEventHandler;
+["ace_killed", {
+ params ["_unit"];
+ if (side group _unit isNotEqualTo civilian) exitWith {};
+ private _vehicle = assignedVehicle _unit;
+ if (_vehicle isNotEqualTo objNull) then {
+ [[], [_vehicle]] call btc_fnc_delete;
+ };
+}] call CBA_fnc_addEventHandler;
+{
+ [_x, "InitPost", {
+ [_this select 0, "HandleDamage", btc_patrol_fnc_disabled] call CBA_fnc_addBISEventHandler;
+ }, false] call CBA_fnc_addClassEventHandler;
+} forEach btc_civ_type_veh;
+["ace_tagCreated", btc_tag_fnc_eh] call CBA_fnc_addEventHandler;
+
+if (btc_p_respawn_ticketsAtStart >= 0) then {
+ ["ace_placedInBodyBag", btc_body_fnc_setBodyBag] call CBA_fnc_addEventHandler;
+
+ if !(btc_p_respawn_ticketsShare) then {
+ ["btc_playerConnected", btc_respawn_fnc_playerConnected] call CBA_fnc_addEventHandler;
+ };
+
+ addMissionEventHandler ["HandleDisconnect", {
+ params ["_unit"];
+ if (
+ ace_respawn_removedeadbodiesdisconnected &&
+ _unit in btc_body_deadPlayers
+ ) then {
+ deleteMarker (_unit getVariable ["btc_body_deadMarker", ""]);
+ private _deadUnits = [[[_unit]] call btc_body_fnc_get] call btc_body_fnc_create;
+ _deadUnit = _deadUnits select 0;
+ btc_body_deadPlayers pushBack _deadUnit;
+ };
+ }];
+};
+
+//Cargo
+[btc_fob_mat, "InitPost", {
+ params ["_obj"];
+ [_obj, -1] call ace_cargo_fnc_setSpace;
+}, true, [], true] call CBA_fnc_addClassEventHandler;
+{
+ [_x, "InitPost", {
+ params ["_obj"];
+ [_obj, 50] call ace_cargo_fnc_setSpace;
+ }, true, [], true] call CBA_fnc_addClassEventHandler;
+} forEach ["CUP_MTVR_Base", "Truck_01_base_F"];
+
+["ace_explosives_place", {
+ params ["_explosive", "_dir", "_pitch", "_unit"];
+ _explosive setVariable ["btc_side", side group _unit];
+ btc_explosives pushBack _this;
+}] call CBA_fnc_addEventHandler;
+
+["ace_placedInBodyBag", {
+ params ["_patient", "_bodyBag", "_isGrave", "_medic"];
+ if (
+ isNil {_patient getVariable "btc_rep_playerKiller"}
+ ) exitWith {};
+
+ private _killer = _patient getVariable "btc_rep_playerKiller";
+ if (_isGrave) then {
+ [btc_rep_fnc_grave, [_bodyBag, _medic], 0.2] call CBA_fnc_waitAndExecute;
+ } else {
+ _bodyBag setVariable ["btc_rep_playerKiller", _killer];
+ };
+}] call CBA_fnc_addEventHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/trackItem.sqf b/hearts_and_minds.kunduz_valley/core/fnc/eh/trackItem.sqf
new file mode 100644
index 0000000..82391fc
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/trackItem.sqf
@@ -0,0 +1,76 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_eh_fnc_trackItem
+
+Description:
+ This function detect if an object is deleted with a specific item and fail the task.
+
+Parameters:
+ _dogTag - Item to track. [String]
+ _taskID - Task ID to fail. [String]
+ _objt - Object owning the item. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_eh_fnc_trackItem;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_dogTag", "", [""]],
+ ["_taskID", "", [""]],
+ ["_objt", player, [objNull]]
+];
+
+[_objt, "Respawn", {
+ params [
+ ["_unit", objNull, [objNull]],
+ ["_corpse", objNull, [objNull]]
+ ];
+ _thisArgs params ["_dogTag", "_taskID"];
+
+ if (_taskID call BIS_fnc_taskCompleted) exitWith {};
+
+ if (_dogTag in items _unit) then {
+ _unit removeItem _dogTag;
+ };
+
+ if (btc_debug) then {
+ [format ["_thisArgs %1, items %2", _thisArgs, items _unit], __FILE__, [btc_debug, true]] call btc_debug_fnc_message;
+ };
+}, [_dogTag, _taskID]] call CBA_fnc_addBISEventHandler;
+
+[_objt, "Deleted", {
+ params [
+ ["_unit", objNull, [objNull]]
+ ];
+ _thisArgs params ["_dogTag", "_taskID"];
+
+ if (_dogTag in items _unit && {!(_taskID call BIS_fnc_taskCompleted)}) then {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ };
+}, [_dogTag, _taskID]] call CBA_fnc_addBISEventHandler;
+
+[_objt, "Put", {
+ params ["_unit", "_container", "_item"];
+ _thisArgs params ["_dogTag", "_taskID"];
+
+ if (_dogTag isEqualTo _item) then {
+ [_container, "Killed", {
+ params [
+ ["_container", objNull, [objNull]]
+ ];
+ _thisArgs params ["_dogTag", "_taskID"];
+
+ if (!(_taskID call BIS_fnc_taskCompleted) && {(allUnits + vehicles) findif {_dogTag in itemCargo _x} isEqualTo -1}) then {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ };
+ }, [_dogTag, _taskID]] remoteExecCall ["CBA_fnc_addBISEventHandler", 0];
+ };
+}, [_dogTag, _taskID]] call CBA_fnc_addBISEventHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_InitPost_EH_Vehicle.hpp b/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_InitPost_EH_Vehicle.hpp
new file mode 100644
index 0000000..12e1ff2
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_InitPost_EH_Vehicle.hpp
@@ -0,0 +1,3 @@
+class btc_actions {
+ init = "[typeOf (_this select 0)] call btc_veh_fnc_init";
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_PreInit_EH.hpp b/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_PreInit_EH.hpp
new file mode 100644
index 0000000..3efe14a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/eh/xeh_PreInit_EH.hpp
@@ -0,0 +1,3 @@
+class btc_hearts_and_minds {
+ init = "call compileScript ['core\fnc\compile.sqf'];";
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/flag/deploy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/flag/deploy.sqf
new file mode 100644
index 0000000..1dc3a62
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/flag/deploy.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_flag_fnc_deploy
+
+Description:
+ Create actions with all flag from btc_flag_textures.
+
+Parameters:
+ _target - Is the object being interacted with. [Object]
+ _player - Is ace_player. [Object]
+ _params - Is the optional action parameters. (default [])
+
+Returns:
+ _actions - ACE action generated for redeploy. [Boolean]
+
+Examples:
+ (begin example)
+ [] call btc_flag_fnc_deploy;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_target",
+ "_player",
+ "_params"
+];
+
+private _childStatement = {
+ params ["_target", "_player", "_params"];
+ _target forceFlagTexture _params;
+};
+
+private _condition = if (btc_p_flag isEqualTo 2) then {
+ {leader player isEqualTo player};
+} else {
+ {true};
+};
+
+btc_flag_textures apply {
+ private _action = ["btc_flag" + _x, "", _x, _childStatement, _condition, {}, _x] call ace_interact_menu_fnc_createAction;
+ [_action, [], _target]
+}
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/flag/int.sqf b/hearts_and_minds.kunduz_valley/core/fnc/flag/int.sqf
new file mode 100644
index 0000000..7374787
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/flag/int.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_flag_fnc_int
+
+Description:
+ Add flag interaction for vehicle.
+
+Parameters:
+ _type - Type of vehicle. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [typeOf cursorObject] call btc_flag_fnc_int;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_type", "", [""]]
+];
+
+private _action = ["btc_flag_deployVeh", localize "STR_BTC_HAM_ACTION_VEHINIT_DEPLOYFLAG", "\A3\ui_f\data\map\markers\handdrawn\flag_CA.paa", {}, {
+ btc_p_flag > 0 &&
+ {getForcedFlagTexture _target isEqualTo ""} &&
+ {(driver vehicle player) isEqualTo player}
+}, btc_flag_fnc_deploy] call ace_interact_menu_fnc_createAction;
+[_type, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+_action = ["btc_flag_cutVeh", localize "STR_BTC_HAM_ACTION_VEHINIT_CUTFLAG", "\A3\ui_f\data\map\markers\handdrawn\flag_CA.paa", {
+ _target forceFlagTexture "";
+}, {
+ btc_p_flag > 0 &&
+ {getForcedFlagTexture _target isNotEqualTo ""} &&
+ {(driver vehicle player) isEqualTo player}
+}] call ace_interact_menu_fnc_createAction;
+[_type, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/addInteraction.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/addInteraction.sqf
new file mode 100644
index 0000000..5200526
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/addInteraction.sqf
@@ -0,0 +1,101 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_addInteraction
+
+Description:
+ Add respawn ACE interaction to vehicle or FOB.
+
+Parameters:
+ _veh - Vehicle to add in wreck system. [Object, String]
+ _isFull - Full respawn menu. [Bool]
+ _timeout - Enable timeout for interaction. [Bool]
+ _typeNum - Type of action, 0 for actions, 1 for self-actions [Number]
+ _parentPath - Parent path of the new action. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_fob_fnc_addInteraction;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull, ""]],
+ ["_isFull", true, [true]],
+ ["_timeout", false, [false]],
+ ["_typeNum", 0, [0]],
+ ["_parentPath", ["ACE_MainActions"], [[]]]
+];
+
+private _actions = [];
+private _condition = {
+ !btc_log_placing &&
+ !(player getVariable ["ace_dragging_isCarrying", false]) &&
+ alive _target
+};
+if (_timeout) then {
+ _condition = {
+ !btc_log_placing &&
+ !(player getVariable ["ace_dragging_isCarrying", false]) &&
+ alive _target &&
+ CBA_missionTime < btc_fob_timeout
+ };
+};
+
+if (_isFull) then {
+ _actions pushBack ["redeploy", localize "STR_BTC_HAM_ACTION_BIRESPAWN", "\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa", {
+ if ([] call btc_fob_fnc_redeployCheck) then {
+ [] call btc_respawn_fnc_force;
+ };
+ }, _condition];
+};
+_actions pushBack ["base", localize "STR_BTC_HAM_ACTION_REDEPLOYBASE", getText (configfile >> "CfgMarkers" >> getMarkerType "btc_base" >> "icon"), {
+ if ([] call btc_fob_fnc_redeployCheck) then {
+ [_player, btc_respawn_marker, false] call BIS_fnc_moveToRespawnPosition
+ };
+}, _condition, btc_fob_fnc_redeploy, "Base"];
+
+if (_isFull) then {
+ _actions pushBack ["rallypoints", localize "STR_BTC_HAM_ACTION_REDEPLOYRALLY",
+ "\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa", {},
+ _condition,
+ btc_fob_fnc_redeploy, ""
+ ];
+ _actions pushBack ["FOB", localize "STR_BTC_HAM_ACTION_REDEPLOYFOB",
+ "\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa", {},
+ _condition
+ ];
+};
+
+{
+ private _action = _x call ace_interact_menu_fnc_createAction;
+ if (_veh isEqualType "") then {
+ [_veh, _typeNum, _parentPath, _action] call ace_interact_menu_fnc_addActionToClass;
+ } else {
+ [_veh, _typeNum, _parentPath, _action] call ace_interact_menu_fnc_addActionToObject;
+ };
+} forEach _actions;
+
+if (_isFull) then {
+ {
+ _x params ["_cardinal", "_degrees"];
+
+ _action = ["FOB" + _cardinal, localize _cardinal,
+ "\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa", {},
+ {alive _target}, btc_fob_fnc_redeploy, _degrees
+ ] call ace_interact_menu_fnc_createAction;
+ if (_veh isEqualType "") then {
+ [_veh, _typeNum, _parentPath + ["FOB"], _action] call ace_interact_menu_fnc_addActionToClass;
+ } else {
+ [_veh, _typeNum, _parentPath + ["FOB"], _action] call ace_interact_menu_fnc_addActionToObject;
+ };
+ } forEach [
+ ["str_q_north_east", [0, 90]], ["str_q_south_east", [90, 180]],
+ ["str_q_south_west", [180, 270]], ["str_q_north_west", [270, 360]]
+ ];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/create.sqf
new file mode 100644
index 0000000..0099e6b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/create.sqf
@@ -0,0 +1,86 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_create
+
+Description:
+ Create user interface for FOB creation.
+
+Parameters:
+ _mat - Object "containing" the FOB. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_fob_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_mat", objNull, [objNull]]
+];
+
+if (((position _mat) isFlatEmpty [1, 0, 0.9, 1, 0, false, _mat]) isEqualTo []) exitWith {(localize "STR_BTC_HAM_O_FOB_CREATE_H_AREA") call CBA_fnc_notify;};
+
+if (_mat inArea [getMarkerPos "btc_base", btc_fob_minDistance, btc_fob_minDistance, 0, false]) exitWith {(localize "STR_BTC_HAM_O_FOB_CREATE_H_DBASE") call CBA_fnc_notify;};
+
+if ((nearestObjects [position _mat, ["LandVehicle", "Air"], 10]) findIf {!(_x isKindOf "ace_fastroping_helper")} != -1) exitWith {
+ (format [localize "STR_BTC_HAM_O_FOB_CREATE_H_CAREA", (nearestObjects [position _mat, ["LandVehicle", "Air"], 10]) apply {typeOf _x}]) call CBA_fnc_notify
+};
+
+closeDialog 0;
+
+btc_fob_dlg = false;
+
+createDialog "btc_fob_create";
+
+waitUntil {dialog};
+
+while {!btc_fob_dlg} do {
+ if !(dialog) then {
+ (localize "STR_BTC_HAM_O_FOB_CREATE_H_ESC") call CBA_fnc_notify;
+ createDialog "btc_fob_create";
+ };
+ sleep 0.1;
+};
+
+if (ctrlText 777 == "") exitWith {
+ closeDialog 0;
+ (localize "STR_BTC_HAM_O_FOB_CREATE_H_NAME") call CBA_fnc_notify;
+ _mat spawn btc_fob_fnc_create;
+};
+
+private _name = ctrlText 777;
+
+private _FOB_name = "FOB " + _name;
+private _name_to_check = toUpper _FOB_name;
+private _array_markers = allMapMarkers apply {toUpper _x};
+
+if (_name_to_check in _array_markers) exitWith {
+ closeDialog 0;
+ (localize "STR_BTC_HAM_O_FOB_CREATE_H_NAMENOTA") call CBA_fnc_notify;
+ _mat spawn btc_fob_fnc_create;
+};
+
+(localize "STR_BTC_HAM_O_FOB_CREATE_H_WIP") call CBA_fnc_notify;
+
+closeDialog 0;
+
+[{
+ params ["_mat", "_name"];
+
+ if (isNull _mat) exitWith {};
+
+ private _pos = getPosATL _mat;
+ private _direction = getDir _mat;
+ private _FOB_name = "FOB " + _name;
+
+ deleteVehicle _mat;
+
+ [_pos, _direction, _FOB_name] remoteExecCall ["btc_fob_fnc_create_s", 2];
+ [7, _FOB_name] remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+}, [_mat, _name], 5] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/create_s.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/create_s.sqf
new file mode 100644
index 0000000..32d123f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/create_s.sqf
@@ -0,0 +1,57 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_create_s
+
+Description:
+ Create the FOB.
+
+Parameters:
+ _pos - Position of the FOB. [Array]
+ _direction - Direction of the FOB between 0 to 360 degree. [Number]
+ _FOB_name - Name of the FOB. [String]
+ _fob_structure - FOB structure. [Array]
+ _fob_flag - Flag type. [Array]
+ _fobs - Array of FOB. [Array]
+
+Returns:
+ _array - Return marker, structure and flag object. [Array]
+
+Examples:
+ (begin example)
+ [getPos player, random 360, "My FOB"] call btc_fob_fnc_create_s;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [], [[]]],
+ ["_direction", 0, [0]],
+ ["_FOB_name", "FOB ", [""]],
+ ["_fob_structure", btc_fob_structure, [[]]],
+ ["_fob_flag", btc_fob_flag, [[]]],
+ ["_fobs", btc_fobs, [[]]]
+];
+
+private _flag = createVehicle [_fob_flag, _pos, [], 0, "CAN_COLLIDE"];
+private _structure = createVehicle [_fob_structure, _pos, [], 0, "CAN_COLLIDE"];
+
+_structure setDir _direction;
+
+private _marker = createMarker [_FOB_name, _pos];
+_marker setMarkerSize [1, 1];
+_marker setMarkerType "b_hq";
+_marker setMarkerText _FOB_name;
+_marker setMarkerColor "ColorBlue";
+_marker setMarkerShape "ICON";
+
+(_fobs select 0) pushBack _marker;
+(_fobs select 1) pushBack _structure;
+(_fobs select 2) pushBack _flag;
+[_flag, "Deleted", {[_thisArgs select 0, _thisArgs select 1] call BIS_fnc_removeRespawnPosition}, [btc_player_side, _flag, _FOB_name] call BIS_fnc_addRespawnPosition] call CBA_fnc_addBISEventHandler;
+
+_structure addEventHandler ["Killed", btc_fob_fnc_killed];
+
+[_marker, _structure, _flag]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/dismantle_s.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/dismantle_s.sqf
new file mode 100644
index 0000000..a506645
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/dismantle_s.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_dismantle_s
+
+Description:
+ Dismantle server side the FOB.
+
+Parameters:
+ _flag - Flag of the FOB. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorTarget] call btc_fob_fnc_dismantle_s;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_flag", objNull, [objNull]]
+];
+
+[18] remoteExecCall ["btc_fnc_show_hint", (allPlayers - entities "HeadlessClient_F") inAreaArray [getPosASL _flag, 10, 10]];
+
+[{
+ params ["_flag"];
+
+ private _pos = getPosASL _flag;
+ private _element = (btc_fobs select 2) find _flag;
+
+ [(btc_fobs select 1) select _element, objNull, objNull, true, true] call btc_fob_fnc_killed;
+
+ [btc_fob_mat, _pos, surfaceNormal _pos] call btc_log_fnc_create_s;
+}, [_flag], 10] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/dlg.hpp b/hearts_and_minds.kunduz_valley/core/fnc/fob/dlg.hpp
new file mode 100644
index 0000000..581c4bb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/dlg.hpp
@@ -0,0 +1,46 @@
+class btc_fob_create {
+ idd = -1;
+ movingEnable = 1;
+ onLoad = "uiNamespace setVariable [""btc_fob_create"", _this select 0];";
+ objects[] = {};
+ class controlsBackground {
+
+ };
+ class controls {
+ class btc_fob_dlg_background : btc_dlg_RscText {
+ idc = -1;
+ x = 0.35 * safezoneW + safezoneX;
+ y = 0.4 * safezoneH + safezoneY;
+ w = 0.3 * safezoneW;
+ h = 0.125 * safezoneH;
+ colorBackground[] = {0, 0, 0, 0.65};
+ text = "";
+ };
+ class btc_fob_dlg_text : btc_dlg_RscText {
+ idc = -1;
+ colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R', 0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G', 0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B', 0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A', 0.7])"};
+ x = 0.35 * safezoneW + safezoneX;
+ y = 0.4 * safezoneH + safezoneY;
+ w = 0.3 * safezoneW;
+ h = 0.025 * safezoneH;
+ colorText[] = {1, 1, 1, 1};
+ text = $STR_BTC_HAM_O_FOB_DLG_T_NAMEFOB; //Name the FOB:
+ };
+ class btc_fob_dlg_name : btc_dlg_RscEdit {
+ idc = 777;
+ text = "";
+ x = 0.35025 * safezoneW + safezoneX;
+ y = 0.45 * safezoneH + safezoneY;
+ w = 0.3 * safezoneW;
+ h = 0.025 * safezoneH;
+ };
+ class btc_fob_dlg_apply : btc_dlg_button {
+ text = $STR_ui_debug_but_apply; //Apply
+ action = "btc_fob_dlg = true;";
+ x = 0.45 * safezoneW + safezoneX;
+ y = 0.5 * safezoneH + safezoneY;
+ w = 0.1 * safezoneW;
+ default = true;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/killed.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/killed.sqf
new file mode 100644
index 0000000..abfbf6b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/killed.sqf
@@ -0,0 +1,52 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_killed
+
+Description:
+ Delete FOB from the btc_fobs array and remove the flag.
+
+Parameters:
+ _struc - Object the event handler is assigned to. [Object]
+ _killer - Object that killed the unit. Contains the unit itself in case of collisions. [Object]
+ _instigator - Person who pulled the trigger. [Object]
+ _delete - Delete the FOB/Rallypoint. [Boolean]
+ _useEffects - Same as useEffects in setDamage alt syntax. [Boolean]
+ _fobs - Array containing FOB data. [Array]
+
+Returns:
+ _this - Arguments passed. [Array]
+
+Examples:
+ (begin example)
+ _result = [btc_fobs select 1 select 0] call btc_fob_fnc_killed;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_struc", objNull, [objNull]],
+ ["_killer", objNull, [objNull]],
+ ["_instigator", objNull, [objNull]],
+ ["_useEffects", true, [true]],
+ ["_delete", false, [true]],
+ ["_fobs", btc_fobs, [[]]]
+];
+
+private _fob_index = (_fobs select 1) find _struc;
+
+if (btc_debug || btc_debug_log) then {
+ [format ["named %1", (_fobs select 0) select _fob_index], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+};
+
+deleteMarker ((_fobs select 0) deleteAt _fob_index);
+private _fob = (_fobs select 1) deleteAt _fob_index;
+deleteVehicle ((_fobs select 2) deleteAt _fob_index);
+
+if (_delete) then {
+ deleteVehicle _fob;
+};
+
+_this
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointAssemble.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointAssemble.sqf
new file mode 100644
index 0000000..73763aa
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointAssemble.sqf
@@ -0,0 +1,58 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_rallypointAssemble
+
+Description:
+ Handle assembling and disassembling of BI rallypoint.
+
+Parameters:
+ _nameEH - Name of the event. [String]
+ _args - Arguments passed by the event. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["WeaponAssembled", [player, cursorObject]] call btc_fob_fnc_rallypointAssemble;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_nameEH", "", [""]],
+ ["_args", [], [[]]]
+];
+
+switch (_nameEH) do {
+ case "WeaponAssembled": {
+ _args params [
+ ["_player", objNull, [objNull]],
+ ["_rallyPoint", objNull, [objNull]]
+ ];
+
+ if !(_rallyPoint isKindOf "Camping_base_F") exitWith {_this};
+ _rallyPoint remoteExecCall ["btc_fob_fnc_rallypointTimer", 2];
+ [
+ [format [localize "STR_BTC_HAM_O_FOB_SELFDESTRUCTION", btc_p_rallypointTimer]],
+ ["
"]
+ ] call CBA_fnc_notify;
+ };
+ case "WeaponDisassembled": {
+ _args params [
+ ["_player", objNull, [objNull]],
+ ["_bag", objNull, [objNull]]
+ ];
+
+ if !("_Respawn_" in typeOf _bag) exitWith {_this};
+
+ private _markers = ([btc_player_side, false] call BIS_fnc_getRespawnMarkers) - [btc_respawn_marker];
+ _markers = _markers apply {[_player distance markerPos _x, _x]};
+ _markers sort true;
+ deleteMarker (_markers select 0 select 1);
+ };
+ default {
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointTimer.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointTimer.sqf
new file mode 100644
index 0000000..4fa3418
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/rallypointTimer.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_rallypointTimer
+
+Description:
+ Create a timer and when timer is up, trigger self destruction.
+
+Parameters:
+ _rallypoint - Rallypoint. [Object]
+ _delay - Delay before the rallypoint self-destruction. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_fob_fnc_rallypointTimer;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_rallypoint", objNull, [objNull]],
+ ["_delay", btc_fob_rallypointTimer, [0]]
+];
+
+private _time = serverTime;
+_rallypoint setVariable ["btc_fob_assembleTime", _time];
+
+[{
+ params [
+ ["_rallypoint", objNull, [objNull]],
+ ["_time", 0, [0]]
+ ];
+
+ if (
+ isNull _rallypoint ||
+ _time != _rallypoint getVariable ["btc_fob_assembleTime", -1]
+ ) exitWith {};
+ if (objectParent _rallypoint isEqualTo objNull) then {
+ deleteVehicle _rallypoint;
+ };
+}, [_rallypoint, _time], _delay] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/redeploy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/redeploy.sqf
new file mode 100644
index 0000000..7cdd23b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/redeploy.sqf
@@ -0,0 +1,72 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_redeploy
+
+Description:
+ Create child statement to redeploy.
+
+Parameters:
+ _target - Is the object being interacted with. [Object]
+ _player - Is ace_player. [Object]
+ _params - Is the optional action parameters. (default [])
+
+Returns:
+ _actions - ACE action generated for redeploy. [Boolean]
+
+Examples:
+ (begin example)
+ [] call btc_fob_fnc_redeploy;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_target",
+ "_player",
+ "_params"
+];
+
+private _actions = [];
+private _childStatement = {
+ params ["_target", "_player", "_params"];
+
+ if ([] call btc_fob_fnc_redeployCheck) then {[_player, _params, false] call BIS_fnc_moveToRespawnPosition};
+};
+
+if (_params isEqualTo "") then { // Redeploy on marker like rallypoints
+ {
+ private _action = [markerText _x, markerText _x, "\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa", _childStatement, {true}, {}, _x] call ace_interact_menu_fnc_createAction;
+ _actions pushBack [_action, [], _target];
+ } forEach (([btc_player_side, false] call BIS_fnc_getRespawnMarkers) - [btc_respawn_marker]);
+} else { // Redeploy on object like FOB/Vehicles
+ private _getRespawnPositions = _player call BIS_fnc_getRespawnPositions;
+ private _positions = if (_params isEqualTo "Base") then {
+ _getRespawnPositions inAreaArray [getMarkerPos "btc_base", btc_fob_minDistance, btc_fob_minDistance]
+ } else {
+ private _center = [worldSize / 2, worldsize / 2, 0];
+ _params params ["_min", "_max"];
+ _getRespawnPositions select {
+ if (
+ alive _x && {!(_x inArea [getMarkerPos "btc_base", btc_fob_minDistance, btc_fob_minDistance, 0, false])}
+ ) then {
+ private _dir = _center getDir _x;
+ _min <= _dir &&
+ {_dir < _max}
+ } else {
+ false
+ };
+ };
+ };
+
+ {
+ private ["_identity", "_name", "_pic", "_showName", "_respawnPositions", "_respawnPositionNames", "_respawnPositionNameShow", "_pos"];
+ (_x call BIS_fnc_showRespawnMenuPositionName) params ["_FOBName", "_icon"];
+ private _action = [_FOBName, _FOBName, _icon, _childStatement, {true}, {}, _x] call ace_interact_menu_fnc_createAction;
+ _actions pushBack [_action, [], _target];
+ } forEach _positions;
+};
+
+_actions
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/fob/redeployCheck.sqf b/hearts_and_minds.kunduz_valley/core/fnc/fob/redeployCheck.sqf
new file mode 100644
index 0000000..418e931
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/fob/redeployCheck.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_fob_fnc_redeployCheck
+
+Description:
+ Check if player can redeploy.
+
+Parameters:
+
+Returns:
+ _canRedeploy - Can redeploy. [Boolean]
+
+Examples:
+ (begin example)
+ [] call btc_fob_fnc_redeployCheck;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if !(player call ace_medical_status_fnc_isInStableCondition) exitWith {
+ [[localize "STR_BTC_HAM_O_FOB_CANTREDEPLOY"], [localize "STR_BTC_HAM_O_FOB_REDEPLOYNOTSTABLE"]] call CBA_fnc_notify;
+ false
+};
+
+if (
+ ["leftarm", "rightarm", "leftleg", "rightleg"] findIf {
+ [player, player, _x] call ace_medical_treatment_fnc_canSplint
+ } > -1
+) exitWith {
+ [[localize "STR_BTC_HAM_O_FOB_CANTREDEPLOY"], [localize "STR_BTC_HAM_O_FOB_REDEPLOYSPLINT"]] call CBA_fnc_notify;
+ false
+};
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/hideout/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/hideout/create.sqf
new file mode 100644
index 0000000..8798224
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/hideout/create.sqf
@@ -0,0 +1,130 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_hideout_fnc_create
+
+Description:
+ Create hideout randomnly or with defined position.
+
+Parameters:
+ _pos - Position of the hideout. [Array]
+ _id_hideout - Id of the hideout. [Number]
+ _rinf_time - Not used. [Number]
+ _cap_time - Time for next capture of city around. [Number]
+ _id - Id of the city where the hideout is. [Number]
+ _markers_saved - Markers found by players. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_hideout_fnc_create;
+ (end)
+ (begin example)
+ selectMin (btc_hideouts apply {
+ private _ho = _x;
+ selectMin ((btc_hideouts - [_ho]) apply {_x distance _ho})
+ })
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [], [[]]],
+ ["_id_hideout", count btc_hideouts, [0]],
+ ["_rinf_time", time, [0]],
+ ["_cap_time", time - btc_hideout_cap_time, [0]],
+ ["_id", 0, [0]],
+ ["_markers_saved", [], [[]]]
+];
+
+private _city = objNull;
+if (_pos isEqualTo []) then {
+ if (btc_hideout_cityID isEqualTo []) then {
+ private _useful = values btc_city_all select {
+ !(_x getVariable ["active", false]) &&
+ {_x distance (getMarkerPos btc_respawn_marker) > btc_hideout_safezone} &&
+ {!(_x getVariable ["has_ho", false])} &&
+ {_x getVariable ["type", ""] in ["NameLocal", "Hill", "NameVillage", "Airport"]}
+ };
+ private _inHoRange = values btc_city_all select {
+ private _city = _x;
+ (selectMin (btc_hideouts apply {_x distance _city})) < btc_hideout_minRange
+ };
+ private _usefulRange = _useful - _inHoRange;
+ if (_usefulRange isEqualTo []) then {
+ _city = selectRandom _useful;
+ } else {
+ _city = selectRandom _usefulRange;
+ };
+ } else {
+ _city = btc_city_all get (btc_hideout_cityID deleteAt 0);
+ };
+
+ private _cachingRadius = _city getVariable ["cachingRadius", 0];
+ private _random_pos = [getPos _city, _cachingRadius/2] call btc_fnc_randomize_pos;
+ _pos = [_random_pos, 0, 100, 2, false] call btc_fnc_findsafepos;
+
+ _id = _city getVariable ["id", 0];
+ _city setVariable ["occupied", true];
+ _city setVariable ["has_ho", true];
+ _city setVariable ["ho_units_spawned", false];
+} else {
+ _city = btc_city_all get _id;
+};
+
+_city setVariable ["city_realPos", getPos _city];
+_city setPos _pos;
+if (btc_debug) then {deleteMarker format ["loc_%1", _id];};
+
+[_city, btc_hideouts_radius] call btc_city_fnc_setPlayerTrigger;
+[{
+ (_this select 0) findEmptyPositionReady (_this select 1)
+}, {}, [_pos, [0, _city getVariable ["cachingRadius", 100]]], 5 * 60] call CBA_fnc_waitUntilAndExecute;
+
+private _hideout = [_pos] call btc_hideout_fnc_create_composition;
+clearWeaponCargoGlobal _hideout;
+clearItemCargoGlobal _hideout;
+clearMagazineCargoGlobal _hideout;
+clearBackpackCargoGlobal _hideout;
+
+_hideout setVariable ["id", _id_hideout];
+_hideout setVariable ["rinf_time", _rinf_time];
+_hideout setVariable ["cap_time", _cap_time];
+_hideout setVariable ["assigned_to", _city];
+
+_hideout addEventHandler ["HandleDamage", btc_hideout_fnc_hd];
+_hideout setVariable ["ace_cookoff_enable", false, true];
+
+private _markers = [];
+{
+ _x params ["_pos", "_marker_name"];
+
+ private _marker = createMarker [format ["%1", _pos], _pos];
+ _marker setMarkerType "hd_warning";
+ _marker setMarkerText _marker_name;
+ _marker setMarkerSize [0.5, 0.5];
+ _marker setMarkerColor "ColorRed";
+ _markers pushBack _marker;
+} forEach _markers_saved;
+
+_hideout setVariable ["markers", _markers];
+
+if (btc_debug) then {
+ private _marker = createMarker [format ["btc_hideout_%1", _pos], _pos];
+ _marker setMarkerType "mil_unknown";
+ _marker setMarkerText format ["Hideout %1", _id_hideout];
+ _marker setMarkerSize [0.8, 0.8];
+ _marker setMarkerColor "ColorRed";
+};
+
+if (btc_debug_log) then {
+ [format ["_this = %1 ; POS %2 ID %3", _this, _pos, count btc_hideouts], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+btc_hideouts pushBack _hideout;
+publicVariable "btc_hideouts";
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/hideout/create_composition.sqf b/hearts_and_minds.kunduz_valley/core/fnc/hideout/create_composition.sqf
new file mode 100644
index 0000000..bf4df0a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/hideout/create_composition.sqf
@@ -0,0 +1,60 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_hideout_fnc_create_composition
+
+Description:
+ Create a random hideout composition.
+
+Parameters:
+ _pos - Position. [Array]
+
+Returns:
+ _result - The flag. [Object]
+
+Examples:
+ (begin example)
+ _result = [getPos (allPlayers#0)] call btc_hideout_fnc_create_composition;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+
+private _type_bigbox = selectRandom ["Box_FIA_Ammo_F", "C_supplyCrate_F", "Box_East_AmmoVeh_F"];
+private _power = selectRandom btc_type_power;
+
+private _composition_hideout = [
+ [selectRandom btc_type_campfire,0,[-2.30957,-1.02979,0]],
+ [_type_bigbox,121.331,[0.675781,-1.52539,0]],
+ [selectRandom btc_type_bigbox,227.166,[2.66504,1.4126,0]],
+ [selectRandom btc_type_sleepingbag,135.477,[0.758789,-3.91309,0]],
+ [_power,77.6499,[0.418945,3.51855,0]],
+ [selectRandom btc_type_seat,171.123,[-2.08203,-3.39795,0]],
+ ["Flag_Red_F",0,[0,0,0]],
+ [selectRandom btc_type_sleepingbag,161.515,[-0.726563,-4.76953,0]],
+ [selectRandom btc_type_satelliteAntenna,304.749,[-3.71973,2.46143,0]],
+ [selectRandom btc_type_seat,279.689,[-4.52783,-0.76416,0]],
+ [selectRandom btc_type_seat,238.639,[-3.89014,-2.94873,0]],
+ [selectRandom btc_type_bigbox,346.664,[3.66455,-1.72998,0]],
+ [selectRandom btc_type_box,36.4913,[-2.65088,-4.5625,0]],
+ [selectRandom btc_type_tent,86.984,[3.19922,-4.36133,0]],
+ [selectRandom btc_type_tent,10,[-4.35303,-5.66309,0]],
+ [selectRandom btc_type_tent,300,[-8.47949,-1.64063,0]]
+];
+if (
+ random 1 > 0.2 &&
+ {!(_power isKindOf "Land_JetEngineStarter_01_F")} &&
+ {!(_power isKindOf "Land_DieselGroundPowerUnit_01_F")} &&
+ {!(_power isKindOf "Land_WaterPump_01_F")}
+) then {
+ _composition_hideout pushBack [selectRandom (btc_type_camonet - ["Land_IRMaskingCover_02_F","CamoNet_BLUFOR_F","CamoNet_OPFOR_F","CamoNet_INDP_F","CamoNet_ghex_F","CamoNet_wdl_F"]),0,[-0.84668,-2.16113,0]];
+};
+
+private _composition = [_pos, random 360, _composition_hideout] call btc_fnc_create_composition;
+
+_composition select ((_composition apply {typeOf _x}) find _type_bigbox);
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/hideout/hd.sqf b/hearts_and_minds.kunduz_valley/core/fnc/hideout/hd.sqf
new file mode 100644
index 0000000..2cdeddf
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/hideout/hd.sqf
@@ -0,0 +1,81 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_hideout_fnc_hd
+
+Description:
+ Trigger hideout explosion if all condition are met.
+
+Parameters:
+ _hideout - Object to destroy. [Object]
+ _selection - Not use. [String]
+ _damage - Amount of damage get by the object. [Number]
+ _source - Not use. [Object]
+ _ammo - Type of ammo use to make damage. [String]
+ _hitIndex - Hit part index of the hit point, -1 otherwise. [Number]
+ _instigator - Person who pulled the trigger. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_hideout_fnc_hd;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_hideout", objNull, [objNull]],
+ ["_selection", "", [""]],
+ ["_damage", 0, [0]],
+ ["_source", objNull, [objNull]],
+ ["_ammo", "", [""]],
+ ["_hitIndex", 0, [0]],
+ ["_instigator", objNull, [objNull]]
+];
+
+private _explosive = getNumber(configFile >> "cfgAmmo" >> _ammo >> "explosive") > 0;
+
+if (
+ _explosive &&
+ {!(_hideout getVariable ["btc_mil_fnc_hd_hideout_fired", false])} &&
+ {_damage > 0.6} &&
+ {isPlayer [_instigator]}
+) then {
+ _hideout setVariable ["btc_mil_fnc_hd_hideout_fired", true];
+
+ btc_hideouts deleteAt (btc_hideouts find _hideout);
+ publicVariable "btc_hideouts";
+
+ [btc_rep_bonus_hideout, _instigator] call btc_rep_fnc_change;
+
+ private _id = _hideout getVariable "id";
+ private _marker = createMarker [format ["btc_hideout_%1_destroyed", _id], getPos _hideout];
+ _marker setMarkerType "hd_destroy";
+ [_marker, "STR_BTC_HAM_O_EH_HDHIDEOUT_MRK", _id] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker];
+ _marker setMarkerSize [1, 1];
+ _marker setMarkerColor "ColorRed";
+
+ private _city = _hideout getVariable ["assigned_to", _hideout];
+ _city setVariable ["has_ho", false];
+
+ deleteVehicle (nearestObject [getPos _hideout, "Flag_Red_F"]);
+ _hideout setDamage 1;
+
+ private _array = _hideout getVariable ["markers", []];
+
+ {deleteMarker _x} forEach _array;
+
+ if (btc_hq isEqualTo _hideout) then {btc_hq = objNull};
+ if (btc_hideouts isEqualTo []) then {[] spawn btc_fnc_final_phase;};
+
+ //Notification
+ [2, count btc_hideouts] remoteExecCall ["btc_fnc_show_hint", 0];
+ if (btc_debug_log) then {
+ [format ["_this = %1 ; POS %2 ID %3", _this, getPos _hideout, _id], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} else {
+ 0
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/allahu_akbar.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/allahu_akbar.sqf
new file mode 100644
index 0000000..dc47f90
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/allahu_akbar.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_allahu_akbar
+
+Description:
+ Play song and trigger suicider bomb if suicider is alive and awake.
+
+Parameters:
+ _trigger - Trigger attached to the suicider. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [trigger] call btc_ied_fnc_allahu_akbar;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_trigger", objNull, [objNull]]
+];
+
+private _suicider = _trigger getVariable "suicider";
+
+if (alive _suicider && [_suicider] call ace_common_fnc_isAwake) then {
+ playSound3d [getMissionPath "core\sounds\allahu_akbar.ogg", _suicider, false, getPosASL _suicider, 5, random [0.9, 1, 1.2], 100];
+};
+
+[{
+ params ["_suicider"];
+
+ [_suicider, btc_player_side, 10, selectRandom [0, 1, 2], false] call ace_zeus_fnc_moduleSuicideBomber;
+}, [_suicider], 1.4] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/belt.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/belt.sqf
new file mode 100644
index 0000000..7a5cfcc
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/belt.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_belt
+
+Description:
+ Arrange three objects in upper direction.
+
+Parameters:
+ _expl1 - Object to set vector. [Object]
+ _expl2 - Object to set vector. [Object]
+ _expl3 - Object to set vector. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [object1, object2, object3] call btc_ied_fnc_belt;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_expl1", objNull, [objNull]],
+ ["_expl2", objNull, [objNull]],
+ ["_expl3", objNull, [objNull]]
+];
+
+_expl1 setVectorDirAndUp [[0.5, 0.5, 0], [-0.5, 0.5, 0]];
+_expl2 setVectorDirAndUp [[1, 0, 0], [0, 1, 0]];
+_expl3 setVectorDirAndUp [[0.5, -0.5, 0], [0.5, 0.5, 0]];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/boom.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/boom.sqf
new file mode 100644
index 0000000..128e82a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/boom.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_boom
+
+Description:
+ Create the boom and the visual effect player side.
+
+Parameters:
+ _wreck - Simple object around the ied. [Object]
+ _ied - ACE IED. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [wreck, ied] call btc_ied_fnc_boom;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_wreck", objNull, [objNull]],
+ ["_ied", objNull, [objNull]]
+];
+
+if (btc_debug_log) then {
+ [format ["%1 - POS %2", [_wreck, _ied], getPos _wreck], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+private _pos = getPos _ied;
+deleteVehicle _ied;
+btc_ied_power createVehicle _pos;
+deleteVehicle _wreck;
+
+[_pos] call btc_deaf_fnc_earringing;
+[_pos] remoteExecCall ["btc_ied_fnc_effects", [0, -2] select isDedicated];
+["btc_ied_boom", [_pos]] call CBA_fnc_localEvent;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/check.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/check.sqf
new file mode 100644
index 0000000..f8c0483
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/check.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_check
+
+Description:
+ Constantly check if player is around by calling btc_ied_fnc_checkLoop. If yes, trigger the explosion.
+
+Parameters:
+ _city - City where IED has been created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_city, _ieds] call btc_ied_fnc_check;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]]
+];
+
+private _array = _city getVariable ["ieds", []];
+if (_array isEqualTo []) exitWith {};
+
+private _ieds = _array apply {_x call btc_ied_fnc_create};
+
+if (btc_debug || btc_debug_log) then {
+ [format ["START CITY ID %1", _city getVariable "id"], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+};
+
+private _ieds_check = _ieds select {(_x select 2) isNotEqualTo objNull};
+
+[_city, _ieds, _ieds_check] call btc_ied_fnc_checkLoop;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/checkLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/checkLoop.sqf
new file mode 100644
index 0000000..b7e86b4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/checkLoop.sqf
@@ -0,0 +1,75 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_checkLoop
+
+Description:
+ Loop over IED and check if player is around. If yes, trigger the explosion.
+
+Parameters:
+ _city - City where IED has been created. [Object]
+ _ieds - All IED (even FACK IED). [Array]
+ _ieds_check - Real IED triggering the explosion. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_city, _ieds, _ieds_check] call btc_ied_fnc_checkLoop;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_city", "_ieds", "_ieds_check"];
+
+ if (_city getVariable ["active", false]) exitWith {
+ {
+ _x params ["_wreck", "_type", "_ied"];
+
+ if (!isNull _ied && {alive _ied}) then {
+ {
+ if (side _x isEqualTo btc_player_side && {
+ (
+ _x isKindOf "UGV_02_Base_F" &&
+ {speed _x > 10}
+ ) ||
+ !(_x isKindOf "UGV_02_Base_F") && {
+ driver _x != _x ||
+ speed _x > 5
+ }
+ }) then {
+ [_wreck, _ied] call btc_ied_fnc_boom;
+ if (0.5 < random 1) then {
+ [getPos _wreck] call btc_rep_fnc_call_militia;
+ };
+ };
+ } forEach (_ied nearEntities ["allVehicles", btc_ied_range]);
+ } else {
+ _ieds_check = _ieds_check - [_ied];
+ };
+ } forEach _ieds_check;
+ [_city, _ieds, _ieds_check] call btc_ied_fnc_checkLoop;
+ };
+
+ private _data = [];
+ {
+ _x params ["_wreck", "_type", "_ied"];
+
+ if (!isNull _wreck && {alive _wreck}) then {
+ _data pushBack [getPosATL _wreck, _type, getDir _wreck, _ied isNotEqualTo objNull];
+
+ deleteVehicle _ied;
+ deleteVehicle _wreck;
+ };
+ } forEach _ieds;
+
+ _city setVariable ["ieds", _data];
+
+ if (btc_debug || btc_debug_log) then {
+ [format ["END CITY ID %1", _city getVariable "id"], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+ };
+
+}, _this, 1] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/create.sqf
new file mode 100644
index 0000000..d330a81
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/create.sqf
@@ -0,0 +1,55 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_create
+
+Description:
+ Create wreck and add an IED when it is not a fake. True IED is added to the btc_ied_list to check if player is around.
+
+Parameters:
+ _pos - Position of wreck. [Array]
+ _type - Shape name of the wreck. [String]
+ _dir - Direction of the wreck. [Number]
+ _active - Does the wreck has an IED around it. [Boolean]
+ _ied_list - Globale variable which store current active IED and delete them when there are removed. [Array]
+
+Returns:
+ _wreck - Simple object of the wreck. [Object]
+ _type - Shape name of the wreck. [String]
+ _ied - The IED object created. If fake, objNull is returned. [Object]
+
+Examples:
+ (begin example)
+ [_wreck, _type, _ied] = [[0,0,0], "a3\armor_f_beta\apc_tracked_01\apc_tracked_01_rcws_f.p3d", 90, true] call btc_ied_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_type", "", [""]],
+ ["_dir", 0, [0]],
+ ["_active", false, [false]],
+ ["_ied_list", btc_ied_list, [[]]]
+];
+
+if (btc_debug_log) then {
+ [format ["%1", _this], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+private _wreck = createSimpleObject [_type, _pos];
+_wreck setPosATL [_pos select 0, _pos select 1, 0];
+_wreck setDir _dir;
+_wreck setVectorUp surfaceNormal _pos;
+
+if !(_active) exitWith {[_wreck, _type, objNull]};
+
+private _ied = createMine [selectRandom btc_type_ieds_ace, [_pos select 0, _pos select 1, btc_ied_offset], [], 2];
+_ied setVectorUp surfaceNormal _pos;
+
+_pos params ["_xx", "_yy", "_zz"];
+_ied_list pushBack [_ied, _wreck, [_xx, _yy, _zz + 0.5]];
+
+[_wreck, _type, _ied]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/deleteLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/deleteLoop.sqf
new file mode 100644
index 0000000..b808a93
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/deleteLoop.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_deleteLoop
+
+Description:
+ Remove wreck generated around IED.
+
+Parameters:
+ _unit - Not used. [Object]
+ _role - Not used. [String]
+ _vehicle - Vehice used. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [vehicle player] call btc_ied_fnc_deleteLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_role", "", [""]],
+ ["_vehicle", objNull, [objNull]]
+];
+
+if !(_vehicle isKindOf "B_APC_Tracked_01_CRV_F" || _vehicle isKindOf "rhsusf_stryker_m1132_m2_base") exitWith {};
+
+if (btc_ied_deleteOn > -1) exitWith {};
+
+(0 boundingBoxReal _vehicle) params ["_p1", "_p2"];
+private _maxWidth = abs ((_p2 select 0) - (_p1 select 0));
+private _maxLength = abs ((_p2 select 1) - (_p1 select 1));
+
+btc_ied_deleteOn = [{
+ params ["_arguments", "_idPFH"];
+ _arguments params [
+ ["_vehicle", objNull, [objNull]],
+ ["_minDistance", 0, [0]]
+ ];
+
+ private _ieds = allSimpleObjects [] - allSimpleObjects btc_type_blacklist;
+ _ieds = (_ieds inAreaArray [getPosWorld _vehicle, 50, 50]) select {
+ !("ace_drop" in ((getModelInfo _x) select 0))
+ };
+ if (_ieds isEqualTo []) exitWith {};
+
+ _ieds = _ieds apply {[_x distance _vehicle, _x]};
+ _ieds sort true;
+
+ (_ieds select 0) params ["_distance", "_ied"];
+ (0 boundingBoxReal _ied) params ["_p1", "_p2"];
+ private _maxWidth = abs ((_p2 select 0) - (_p1 select 0));
+ private _maxLength = abs ((_p2 select 1) - (_p1 select 1));
+ if (
+ _distance < (_minDistance + (_maxWidth max _maxLength) / 2) &&
+ {allMines inAreaArray [getPosWorld _ied, 2.5, 2.5] isEqualTo []} &&
+ {[getPos _vehicle, getDir _vehicle, 40, getPos _ied] call BIS_fnc_inAngleSector}
+ ) then {
+ private _pos = getPosATL _ied;
+ _ied call CBA_fnc_deleteEntity;
+ [btc_rep_bonus_IEDCleanUp, player] remoteExecCall ["btc_rep_fnc_change", 2];
+ ["btc_ied_deleted", [_pos, player]] call CBA_fnc_serverEvent;
+ };
+}, 1, [_vehicle, (_maxWidth max _maxLength) / 2]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/droneLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/droneLoop.sqf
new file mode 100644
index 0000000..21c6115
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/droneLoop.sqf
@@ -0,0 +1,58 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_droneLoop
+
+Description:
+ Search for soldier around the drone during a patrol. If soldier are in range, activate the drone.
+
+Parameters:
+ _driver_drone - Driver of the drone. [Object]
+ _rpos - Position where the drone patrol. [Array]
+ _area - Area of the patrol. [Array]
+ _trigger - Trigger of the drone when is active. [Group]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_driver_drone, _rpos, _area, _trigger] call btc_ied_fnc_droneLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_driver_drone", "_rpos", "_area", "_trigger"];
+
+ private _group = group _driver_drone;
+ if (alive _driver_drone && !isNull _driver_drone) then {
+ private _array = _driver_drone nearEntities [btc_player_type, 200];
+ _array = _array select {side group _x isEqualTo btc_player_side && {!captive _x}};
+ if (_array isEqualTo []) then {
+ if (waypoints _group isEqualTo []) then {
+ [_group, _rpos, _area, 4] call CBA_fnc_taskPatrol;
+ (vehicle _driver_drone) flyInHeight 10;
+ deleteVehicle (_trigger deleteAt 0);
+ };
+ } else {
+ if (_trigger isEqualTo []) then {
+ _trigger pushBack ([_driver_drone] call btc_ied_fnc_drone_active);
+ };
+
+ if (btc_debug) then {
+ hint format ["Distance with UAV IED : %1", (_array select 0) distance (vehicle _driver_drone)];
+ };
+ (vehicle _driver_drone) doMove (ASLtoAGL getPosASL (_array select 0));
+ };
+ _this call btc_ied_fnc_droneLoop;
+ } else {
+ deleteVehicle (_trigger deleteAt 0);
+ _group setVariable ["btc_ied_drone", false];
+
+ if (btc_debug_log) then {
+ [format ["_driver_drone = %1 POS %2 END LOOP", _driver_drone, getPos _driver_drone], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ };
+}, _this, 5] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_active.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_active.sqf
new file mode 100644
index 0000000..b12ef21
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_active.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_drone_active
+
+Description:
+ Create a trigger to allow drone to fire on player side presence.
+
+Parameters:
+ _driver_drone - Driver of the drone. [Object]
+
+Returns:
+ _trigger - Trigger to allow drone to fire on player side presence. [Object]
+
+Examples:
+ (begin example)
+ _trigger = [driver] call btc_ied_fnc_drone_active;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_driver_drone", objNull, [objNull]]
+];
+
+[group _driver_drone] call CBA_fnc_clearWaypoints;
+
+private _trigger = createTrigger ["EmptyDetector", getPos _driver_drone, false];
+_trigger setTriggerArea [10, 10, 0, false, -60];
+_trigger setTriggerActivation [str btc_player_side, "PRESENT", true];
+_trigger setTriggerStatements ["this", "[thisTrigger] call btc_ied_fnc_drone_fire;", ""];
+_trigger setVariable ["btc_ied_drone", _driver_drone];
+
+_trigger attachTo [vehicle _driver_drone, [0, 0, 0]];
+
+if (btc_debug_log) then {
+ [format ["_driver_drone = %1 POS %2 START LOOP", _driver_drone, getPos _driver_drone], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+(group _driver_drone) setBehaviour "CARELESS";
+(group _driver_drone) setSpeedMode "LIMITED";
+
+_trigger
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_create.sqf
new file mode 100644
index 0000000..d665907
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_create.sqf
@@ -0,0 +1,57 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_drone_create
+
+Description:
+ Create a drone in a city under a random area.
+
+Parameters:
+ _city - City where the drone is created. [Object]
+ _area - Area around the city where the drone is created randomly. [Number]
+ _rpos - Create the drone at this position. [Array]
+
+Returns:
+ _leader - return the leader of the group. [Object]
+
+Examples:
+ (begin example)
+ _leader = [allplayers select 0, 100] call btc_ied_fnc_drone_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_area", 300, [0]],
+ ["_rpos", [], [[]]]
+];
+
+if (btc_debug_log) then {
+ [format ["_name = %1 _area %2", _city getVariable ["name", "name"], _area], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if (_rpos isEqualTo []) then {
+ _rpos = [position _city, _area] call btc_fnc_randomize_pos;
+};
+
+private _group = createGroup [btc_enemy_side, true];
+_group setVariable ["btc_city", _city];
+_group setVariable ["acex_headless_blacklist", true];
+private _drone = createVehicle ["C_IDAP_UAV_06_antimine_F", _rpos, [], 0, "FLY"];
+[_drone, "Fuel", {
+ params ["_drone", "_hasFuel"];
+ [{_this setFuel 1;}, _drone, random 120] call CBA_fnc_waitAndExecute;
+}] call CBA_fnc_addBISEventHandler;
+createVehicleCrew _drone;
+[driver _drone] joinSilent _group;
+_group setVariable ["btc_ied_drone", true];
+
+[[_group, _rpos, _area, 4], CBA_fnc_taskPatrol] call btc_delay_fnc_exec;
+_drone flyInHeight 10;
+
+[driver _drone, _rpos, _area, []] call btc_ied_fnc_droneLoop;
+
+leader _group
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_fire.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_fire.sqf
new file mode 100644
index 0000000..c2daf48
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/drone_fire.sqf
@@ -0,0 +1,30 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_drone_fire
+
+Description:
+ Fire bomb of the drone.
+
+Parameters:
+ _trigger - Trigger. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_trigger] call btc_ied_fnc_drone_fire;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_trigger", objNull, [objNull]]
+];
+private _driver_drone = _trigger getVariable "btc_ied_drone";
+
+if (alive _driver_drone) then {
+ _driver_drone forceWeaponFire ["BombDemine_01_F", "BombDemine_01_F"];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_blurEffect.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_blurEffect.sqf
new file mode 100644
index 0000000..83ca418
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_blurEffect.sqf
@@ -0,0 +1,57 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effect_blurEffect
+
+Description:
+ Add blur effect on player camera.
+
+Parameters:
+ _pos - Position of the explosion. [Array]
+ _caller - Player. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player, player] call btc_ied_fnc_effect_blurEffect;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_caller", objNull, [objNull]]
+];
+
+if !(isPlayer _caller) exitWith {};
+if (alive _caller) then {
+ private _distance = (getPos _caller) distance _pos;
+
+ //blurry screen with cam shake
+ if (_distance < 40) then {
+ [] spawn {
+ addCamShake [1, 3, 3];
+
+ private _blur = ppEffectCreate ["DynamicBlur", 474];
+ _blur ppEffectEnable true;
+ _blur ppEffectAdjust [0];
+ _blur ppEffectCommit 0;
+
+ waitUntil {ppEffectCommitted _blur};
+
+ _blur ppEffectAdjust [10];
+ _blur ppEffectCommit 0;
+
+ _blur ppEffectAdjust [0];
+ _blur ppEffectCommit 5;
+
+ waitUntil {ppEffectCommitted _blur};
+
+ _blur ppEffectEnable false;
+ ppEffectDestroy _blur;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_color_smoke.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_color_smoke.sqf
new file mode 100644
index 0000000..d690738
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_color_smoke.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effect_color_smoke
+
+Description:
+ Add colored smoke effect.
+
+Parameters:
+ _pos - Bucket position. [Array]
+ _posASL - Smoke position. [Array]
+ _colorSel - Color of the smoke. [String]
+ _horizontal - Velocity horizontal. [Number]
+ _upwards - Velocity upwards. [Number]
+ _color - RGB color. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player, getPosASL player, "sand"] call btc_ied_fnc_effect_color_smoke;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_posASL", [0, 0, 0], [[]]],
+ ["_colorSel", "", [""]],
+ ["_horizontal", 900, [0]],
+ ["_upwards", 500, [0]],
+ ["_color", [], [[]]]
+];
+
+if (_colorSel isEqualTo "") exitWith {};
+if (_colorSel isEqualTo "sand") then {_color = [[.55, .47, .37, .75], [0.78, 0.76, 0.71, 0]];};
+if (_colorSel isEqualTo "gray") then {_color = [[.1, .1, .1, .75], [0.78, 0.76, 0.71, 0]];};
+if (_colorSel isEqualTo "brown") then {_color = [[0.55, 0.41, 0.25, 1], [0.55, 0.41, 0.25, 0]];};
+
+private _size = 1 + random 3;
+
+private _thingToFling = "Land_Bucket_F" createVehicleLocal [0, 0, 0];
+_thingToFling hideObject true;
+_thingToFling setPos _pos;
+private _smoke = "#particlesource" createVehicleLocal _posASL;
+_smoke setPosASL _posASL;
+_smoke setParticleCircle [0, [0, 0, 0]];
+_smoke setParticleRandom [0, [0, 0, -.5], [2, 2, .5], 0, 1, [0, 0, 0, 0.1], 0, 0];
+_smoke setParticleParams [["\A3\data_f\cl_fireD", 1, 0, 1], "", "Billboard", 1, 10.5, [0, 0, .7], [0, 0, 0], 0, 10, 7.85, 0.375, [_size, 2*_size], _color, [0.08], 1, 0, "", "", _thingToFling];
+_smoke setDropInterval 0.005;
+
+_thingToFling setVelocity [(random _horizontal) - _horizontal/2, (random _horizontal) - _horizontal/2, 5 + (random _upwards)];
+_thingToFling allowDamage false;
+private _sleepTime = random 0.5;
+private _currentTime = 0;
+
+while {_currentTime < _sleepTime and _size > 0} do {
+ _smoke setParticleParams [["\A3\data_f\cl_fireD", 1, 0, 1], "", "Billboard", 1, 10, [0, 0, .7], [0, 0, 0], 0, 10, 7.85, 0.375, [_size, 2*_size], _color, [0.08], 1, 0, "", "", _thingToFling];
+ private _sleep = random .05;
+ _size = _size - 6*_sleep;
+ _currentTime = _currentTime + _sleep;
+ sleep _sleep;
+};
+
+_thingToFling setPos [0, 0, 0];
+deleteVehicle _smoke;
+deleteVehicle _thingToFling;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_rocks.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_rocks.sqf
new file mode 100644
index 0000000..fc152a2
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_rocks.sqf
@@ -0,0 +1,55 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effect_rocks
+
+Description:
+ Add rocks effect, some rock fall from the sky.
+
+Parameters:
+ _pos - Position of the IED. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player] call btc_ied_fnc_effect_rocks;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+_pos params ["_x", "_y"];
+
+_posASL = [_x, _y, getTerrainHeightASL _pos];
+
+private _rockesArr = [];
+
+private _rVar = [
+ [0, [1, 1, 0], [20, 20, 15], 3, 0.25, [0, 0, 0, 0.1], 0, 0],
+ [0, [1, 1, 0], [25, 25, 15], 3, 0.25, [0, 0, 0, 0.1], 0, 0],
+ [0, [1, 1, 0], [30, 30, 15], 3, 0.25, [0, 0, 0, 0.1], 0, 0]
+];
+
+private _rubVar = [
+ [.45, .45],
+ [.27, .27],
+ [.09, .09]
+];
+
+for "_i" from 0 to ((count _rVar)-1) step 1 do {
+ private _rocks = "#particlesource" createVehicleLocal _posASL;
+ _rocks setPosASL _posASL;
+ _rocks setParticleCircle [0, [0, 0, 0]];
+ _rocks setParticleRandom (_rVar select _i);
+ _rocks setParticleParams [["\A3\data_f\ParticleEffects\Universal\Mud.p3d", 1, 0, 1], "", "SpaceObject", 1, 12.5, [0, 0, 0], [0, 0, 15], 5, 100, 7.9, 1, _rubVar select _i, [[0.1, 0.1, 0.1, 1], [0.25, 0.25, 0.25, 0.5], [0.5, 0.5, 0.5, 0]], [0.08], 1, 0, "", "", _posASL, 0, false, 0.3];
+ _rocks setDropInterval 0.01;
+ _rockesArr pushBack _rocks;
+};
+
+sleep 0.22;
+{deleteVehicle _x} forEach _rockesArr;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_shock_wave.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_shock_wave.sqf
new file mode 100644
index 0000000..2c208aa
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_shock_wave.sqf
@@ -0,0 +1,50 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effect_shock_wave
+
+Description:
+ Create a shock wave.
+
+Parameters:
+ _pos - Position of the IED. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player] call btc_ied_fnc_effect_shock_wave;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+_pos params ["_x", "_y"];
+
+_posASL = [_x, _y, getTerrainHeightASL _pos];
+
+private _color = [
+ [[0, 0, 0, 1], [.35, .35, .35, .35], [.35, .35, .35, 0]],
+ [[.78, .76, .71, 1], [.35, .35, .35, .35], [.35, .35, .35, 0]],
+ [[.55, .47, .37, 1], [.35, .35, .35, .35], [.35, .35, .35, 0]],
+ [[.1, .1, .1, 1], [.2, .2, .2, .35], [.35, .35, .35, 0]]
+];
+
+private _smokes = [];
+for "_i" from 0 to ((count _color)-1) step 1 do {
+ private _smoke = "#particlesource" createVehicleLocal _posASL;
+ _smoke setPosASL _posASL;
+ _smoke setParticleCircle [0, [0, 0, 0]];
+ _smoke setParticleRandom [0, [8, 8, 2], [300, 300, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.1], 0, 0];
+ _smoke setParticleParams [["\A3\data_f\cl_fireD", 1, 0, 1], "", "Billboard", 1, 3, [0, 0, -1], [0, 0, -8], 0, 10, 7.85, .375, [6, 8, 10], _color select _i, [.08], 1, 0, "", "", _posASL];
+ _smoke setDropInterval .0004;
+
+ _smokes pushBack _smoke;
+};
+
+sleep .07;
+{deletevehicle _x} forEach _smokes;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_smoke.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_smoke.sqf
new file mode 100644
index 0000000..a2eedb1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effect_smoke.sqf
@@ -0,0 +1,94 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effect_smoke
+
+Description:
+ Create a smoke effect.
+
+Parameters:
+ _pos - Position of the IED. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player] call btc_ied_fnc_effect_smoke;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+_pos params ["_x", "_y"];
+
+_posASL = [_x, _y, getTerrainHeightASL _pos];
+
+//creating some colored smoke (for a better visual effect)
+[_pos, _posASL] spawn {
+ params ["_pos", "_posASL"];
+
+ private _smokePlu = selectRandom [6, 8, 10];
+ for "_i" from 0 to (_smokePlu -1) do {
+ private _selection = selectRandom ["sand", "gray", "brown"];
+ [_pos, _posASL, _selection] spawn btc_ied_fnc_effect_color_smoke;
+ };
+};
+
+//creating smoke
+private _smokes = [];
+
+private _color = [
+ [[0, 0, 0, 1], [0.35, 0.35, 0.35, 0.35], [0.35, 0.35, 0.35, 0]],
+ [[.78, .76, .71, 1], [.35, .35, .35, 0.35], [0.35, 0.35, 0.35, 0]],
+ [[.55, .47, .37, 1], [.35, .35, .35, 0.35], [0.35, 0.35, 0.35, 0]],
+ [[.55, .47, .37, 1], [.35, .35, .35, 0.35], [0.35, 0.35, 0.35, 0]]
+];
+
+private _rndVar = [
+ [0, [1.5 + random 2, 1.5 + random 2, 5], [1 + random 5, 1 + random 5, 10], 0, 0.25, [0.05, 0.05, 0.05, 0.1], 0, 0],
+ [0, [1.5 + random 2, 1.5 + random 2, 5], [1 + random 5, 1 + random 5, 6], 0, 0.25, [0.05, 0.05, 0.05, 0.1], 0, 0],
+ [0, [1 + random 3, 1 + random 3, 5], [1, 1, 4], 0, 0.25, [0.05, 0.05, 0.05, 0.1], 0, 0]
+];
+
+private _modPPar = [["\A3\data_f\cl_fireD", 1, 0, 1], "", "Billboard", 1, 10, [0, 0, 0], [0, 0, 0], 0, 10, 7.85, .375, [6 + random 4, 10 + random 4, 14 + random 4], [[.35, .35, .35, 1], [.2, .2, .2, 0.9], [0.35, 0.35, 0.35, 0]], [0.08], 1, 0, "", "", _posASL];
+
+for "_i" from 0 to 6 step 1 do {
+ if (_i <= 3) then {
+ private _smoke = "#particlesource" createVehicleLocal _posASL;
+ _smoke setPosASL _posASL;
+ _smoke setParticleCircle [0, [0, 0, 0]];
+ _smoke setParticleRandom [0, [1.5 + random 2, 1.5 + random 2, 8], [1 + random 5, 1 + random 5, 15], 0, 0.25, [0.05, 0.05, 0.05, 0.1], 0, 0];
+ _smoke setParticleParams [["\A3\data_f\cl_fireD", 1, 0, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 0], 0, 10, 7.85, .375, [6 + random 4, 6 + random 4, 10 + random 4], _color select _i, [0.08], 1, 0, "", "", _posASL];
+ _smoke setDropInterval .01;
+
+ _smokes pushBack _smoke;
+ };
+
+ if (_i isEqualTo 4) then {
+ {
+ _x setParticleRandom (_rndVar select 0);
+ _x setParticleParams _modPPar;
+ _x setDropInterval .03;
+ } forEach _smokes;
+ };
+ if (_i isEqualTo 5) then {
+ {
+ _x setParticleRandom (_rndVar select 1);
+ _x setParticleParams _modPPar;
+ _x setDropInterval .05;
+ } forEach _smokes;
+ };
+ if (_i isEqualTo 6) then {
+ {
+ _x setParticleRandom (_rndVar select 2);
+ _x setParticleParams _modPPar;
+ _x setDropInterval .05;
+ } forEach _smokes;
+ };
+};
+sleep 2;
+{deleteVehicle _x} forEach _smokes;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/effects.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/effects.sqf
new file mode 100644
index 0000000..4906306
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/effects.sqf
@@ -0,0 +1,32 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_effects
+
+Description:
+ Create effects on player (smoke, rock, shock wave ...).
+
+Parameters:
+ _pos - Position of the IED. [Array]
+ _caller - Player. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_ied_fnc_effects;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_caller", player, [objNull]]
+];
+
+[_pos, _caller] spawn btc_ied_fnc_effect_blurEffect;
+[_pos] spawn btc_ied_fnc_effect_smoke;
+[_pos] spawn btc_ied_fnc_effect_rocks;
+[_pos] spawn btc_ied_fnc_effect_shock_wave;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/fired_near.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/fired_near.sqf
new file mode 100644
index 0000000..866060d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/fired_near.sqf
@@ -0,0 +1,87 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_fired_near
+
+Description:
+ This check if bullets/grenade are trow around IED created during the mission and trigger them.
+
+Parameters:
+ _ied_list - List of IED created in any city. [Array]
+
+Returns:
+ _PFH_id - Id of the CBA_fnc_addPerFrameHandler. [Number]
+
+Examples:
+ (begin example)
+ _PFH_id = [btc_ied_list] call btc_ied_fnc_fired_near;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_ied_list", btc_ied_list, [[]]]
+];
+
+private _cfgAmmo = configFile >> "cfgAmmo";
+
+[{
+ params ["_args", "_id"];
+ _args params [
+ ["_ied_list", [], [[]]],
+ ["_cfgAmmo", configNull, [configNull]],
+ ["_detected_grenade", [], [[]]]
+ ];
+
+ {
+ _x params ["_ied", "_wreck", "_pos"];
+
+ if (alive _ied && !isNull _ied) then {
+ private _list = _pos nearObjects ["Default", 2];
+ _list = _list select {
+ private _object = _x;
+ _object != _ied &&
+ {(["SmokeShell", "FlareCore", "IRStrobeBase", "GrenadeHand_stone", "Smoke_120mm_AMOS_White", "TMR_R_DG32V_F"] findIf {_object isKindOf _x} isEqualTo -1)}
+ };
+ {
+ private _bullet = _x;
+ if (["TimeBombCore", "BombCore", "Grenade"] findIf {_bullet isKindOf _x} != -1) then {
+ if !(_bullet in _detected_grenade) then {
+ _detected_grenade pushBack _bullet;
+ [{!alive (_this select 2)}, {
+ params ["_wreck", "_ied", "_bullet", "_detected_grenade"];
+
+ if (alive _ied) then {
+ [_wreck, _ied] call btc_ied_fnc_boom;
+ if (0.5 < random 1) then {
+ [getPos _wreck] call btc_rep_fnc_call_militia;
+ };
+ };
+ {
+ if (isNull _x) then {
+ _detected_grenade deleteAt _forEachIndex;
+ };
+ } forEach _detected_grenade;
+ }, [_wreck, _ied, _bullet, _detected_grenade]] call CBA_fnc_waitUntilAndExecute;
+ };
+ } else {
+ private _bullet_type = typeOf _bullet;
+ private _explosive = getNumber (_cfgAmmo >> _bullet_type >> "explosive") > 0;
+ private _caliber = getNumber (_cfgAmmo >> _bullet_type >> "caliber") > 1.6;
+ if (_explosive || _caliber) then {
+ if (alive _ied) then {
+ [_wreck, _ied] call btc_ied_fnc_boom;
+ if (0.5 < random 1) then {
+ [getPos _wreck] call btc_rep_fnc_call_militia;
+ };
+ };
+ };
+ };
+ } forEach _list;
+ } else {
+ _ied_list deleteAt _forEachIndex;
+ };
+ } forEach _ied_list;
+}, 0.01, [_ied_list, _cfgAmmo, []]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/initArea.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/initArea.sqf
new file mode 100644
index 0000000..d73f25a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/initArea.sqf
@@ -0,0 +1,82 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_initArea
+
+Description:
+ Initialize positions of IEDS.
+
+Parameters:
+ _city - City to initialise. [Object]
+ _area - Area to create IED. [Number]
+ _n - Number of IED, real and fake. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_ied_fnc_initArea;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_area", 100, [0]],
+ ["_n", 1, [0]]
+];
+
+private _pos = getPos _city;
+private _array = _city getVariable ["ieds", []];
+
+private _cities = (values btc_city_all) - [_city];
+_cities = _cities inAreaArray [_city, _area * 2, _area * 2];
+private _blackListCities = _cities select {
+ _x getVariable ["ieds", []] isNotEqualTo []
+};
+private _blackListPos = [];
+{
+ _blackListPos append ((_x getVariable "ieds") apply {_x select 0});
+} forEach _blackListCities;
+_blackListPos = _blackListPos inAreaArray [_city, _area, _area];
+
+private _blackListRoads = [];
+{
+ for "_i" from 1 to _n do {
+ private _sel_pos = [_pos, _area] call btc_fnc_randomize_pos;
+ private _dir = random 360;
+
+ private _roads = _sel_pos nearRoads 50;
+ _roads = _roads - _blackListRoads;
+ if (_roads isNotEqualTo []) then {
+ private _road = selectRandom _roads;
+ _blackListRoads pushBack _road;
+ private _arr = _road call btc_ied_fnc_randomRoadPos;
+ _sel_pos = _arr select 0;
+ _dir = _arr select 1;
+ };
+ if (
+ _roads isEqualTo [] ||
+ {_blackListPos inAreaArray [_sel_pos, 3, 3] isNotEqualTo []}
+ ) then {
+ _sel_pos = [_sel_pos, 0, 100, 1, false] call btc_fnc_findsafepos;
+ };
+
+ _array pushBack [_sel_pos, selectRandom btc_model_ieds, _dir, _x];
+
+ if (btc_debug) then {
+ private _marker = createMarker [format ["btc_ied_%1", _sel_pos], _sel_pos];
+ _marker setMarkerType "mil_warning";
+ _marker setMarkerColor (["ColorBlue", "ColorRed"] select _x);
+ _marker setMarkerText (["IED (fake)", "IED"] select _x);
+ _marker setMarkerSize [0.8, 0.8];
+ };
+ if (btc_debug_log) then {
+ [format ["_this = %1 POS %2 N %3(%4)", _this, _sel_pos, _i, _n], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ };
+} forEach [true, false];
+
+_city setVariable ["ieds", _array];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/randomRoadPos.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/randomRoadPos.sqf
new file mode 100644
index 0000000..16c1f95
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/randomRoadPos.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_randomRoadPos
+
+Description:
+ Find a position on a road based on the road width.
+ The selection of the position is random (left, right or center).
+
+Parameters:
+ _road - Road segment. [Object]
+
+Returns:
+ Array:
+ _this select 0: Position. [Array]
+ _this select 1: Directon. [Number]
+
+Examples:
+ (begin example)
+ _result = [(player nearRoads 20)#0] call btc_ied_fnc_randomRoadPos;
+ player setPos _result#0;
+ player setDir _result#1;
+ (end)
+
+Author:
+ kuemmel
+
+---------------------------------------------------------------------------- */
+params [
+ ["_road", objNull, [objNull]],
+ ["_p_ied_placement", btc_p_ied_placement, [0]]
+];
+private _roadDir = _road call btc_fnc_road_direction;
+private _roadRadius = ((0 boundingBoxReal _road) select 2) * 0.4;
+
+switch (floor random _p_ied_placement) do {
+ case 0: {
+ [_road getPos [_roadRadius, _roadDir + 90], _roadDir]
+ };
+ case 1: {
+ [_road getPos [_roadRadius, _roadDir - 90], _roadDir]
+ };
+ default {
+ [_road getPos [_roadRadius * 0.5 - random(_roadRadius * 0.4), _roadDir + (90 * selectRandom [-1, 1])], random 360]
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/suiciderLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/suiciderLoop.sqf
new file mode 100644
index 0000000..fd76646
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/suiciderLoop.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_suiciderLoop
+
+Description:
+ Search for soldier around and when found, activate the suicider.
+
+Parameters:
+ _suicider - Suicider created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_suicider] call btc_ied_fnc_suiciderLoop;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_suicider"];
+
+ if (alive _suicider && !isNull _suicider) then {
+ private _array = _suicider nearEntities [btc_player_type, 25];
+ _array = _array select {side group _x isEqualTo btc_player_side && {!captive _x}};
+ if (_array isNotEqualTo []) exitWith {
+ _suicider call btc_ied_fnc_suicider_active;
+ };
+ _this call btc_ied_fnc_suiciderLoop;
+ };
+}, _this, 5] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_active.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_active.sqf
new file mode 100644
index 0000000..8d6de7e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_active.sqf
@@ -0,0 +1,71 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_suicider_active
+
+Description:
+ Activate the suicider by adding explosive charge around his pelvis and force suicider to move in the direction of soldier.
+
+Parameters:
+ _suicider - Suicider created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_suicider] call btc_ied_fnc_suicider_active;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_suicider", objNull, [objNull]]
+];
+
+private _group = createGroup [btc_enemy_side, true];
+[_suicider] joinSilent _group;
+_group setVariable ["suicider", true];
+_group setVariable ["acex_headless_blacklist", true];
+
+[group _suicider] call CBA_fnc_clearWaypoints;
+
+private _trigger = createTrigger ["EmptyDetector", getPos _suicider, false];
+_trigger setTriggerArea [5, 5, 0, false];
+_trigger setTriggerActivation [str btc_player_side, "PRESENT", false];
+_trigger setTriggerStatements ["this", "thisTrigger call btc_ied_fnc_allahu_akbar;", ""];
+_trigger setVariable ["suicider", _suicider];
+
+_trigger attachTo [_suicider, [0, 0, 0]];
+
+private _array = getPos _suicider nearEntities [btc_player_type, 30];
+_array = _array select {side group _x isEqualTo btc_player_side && {!captive _x}};
+
+if (_array isEqualTo []) exitWith {};
+
+private _expl1 = "DemoCharge_Remote_Ammo" createVehicle (position _suicider);
+_expl1 attachTo [_suicider, [-0.1, 0.1, 0.15], "Pelvis", true];
+private _expl2 = "DemoCharge_Remote_Ammo" createVehicle (position _suicider);
+_expl2 attachTo [_suicider, [0, 0.15, 0.15], "Pelvis", true];
+private _expl3 = "DemoCharge_Remote_Ammo" createVehicle (position _suicider);
+_expl3 attachTo [_suicider, [0.1, 0.1, 0.15], "Pelvis", true];
+
+[_expl1, _expl2, _expl3] remoteExecCall ["btc_ied_fnc_belt", 0];
+
+_suicider addEventHandler ["Killed", {
+ params ["_unit", "_killer"];
+
+ if !(isPlayer _killer) then {
+ (attachedObjects _unit) call CBA_fnc_deleteEntity;
+ };
+}];
+
+(group _suicider) setBehaviour "CARELESS";
+(group _suicider) setSpeedMode "FULL";
+
+if (btc_debug_log) then {
+ [format ["_suicider = %1 POS %2 START LOOP", _suicider, getPos _suicider], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+[_suicider, _trigger] call btc_ied_fnc_suicider_activeLoop;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_activeLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_activeLoop.sqf
new file mode 100644
index 0000000..cf9b815
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_activeLoop.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_suicider_activeLoop
+
+Description:
+ Detect and force the suicider to run in the direction of the soldier nearby.
+
+Parameters:
+ _suicider - Suicider. [Object]
+ _trigger - Trigger triggring the suicider explosion. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [_suicider, _trigger] call btc_ied_fnc_suicider_activeLoop;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+[{
+ params ["_suicider", "_trigger"];
+
+ if (alive _suicider) then {
+ private _array = _suicider nearEntities [btc_player_type, 30];
+ _array = _array select {side group _x isEqualTo btc_player_side && {!captive _x}};
+ if (_array isNotEqualTo []) then {
+ _suicider doMove (position (_array select 0));
+ };
+ _this call btc_ied_fnc_suicider_activeLoop;
+ } else {
+ deleteVehicle _trigger;
+ group _suicider setVariable ["suicider", false];
+
+ if (btc_debug_log) then {
+ [format ["_suicider = %1 POS %2 END LOOP", _suicider, getPos _suicider], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+ };
+}, _this, 0.5] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_create.sqf
new file mode 100644
index 0000000..c25ac27
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/ied/suicider_create.sqf
@@ -0,0 +1,55 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_ied_fnc_suicider_create
+
+Description:
+ Create a suicider in a city under a random area.
+
+Parameters:
+ _city - City where the suicider is created. [Object]
+ _area - Area around the city the suicider is created randomly. [Number]
+ _rpos - Create the suicider at this position. [Array]
+ _type_units - Type of units. [Group]
+
+Returns:
+ _suicider - Created suicider. [Object]
+
+Examples:
+ (begin example)
+ _suicider = [allplayers select 0, 100] call btc_ied_fnc_suicider_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_area", 100, [0]],
+ ["_rpos", [], [[]]],
+ ["_type_units", "", [""]]
+];
+
+if (btc_debug_log) then {
+ [format ["_name = %1 _area %2", _city getVariable ["name", "name"], _area], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if (_rpos isEqualTo []) then {
+ _rpos = [position _city, _area] call btc_fnc_randomize_pos;
+};
+if (_type_units isEqualTo "") then {
+ _type_units = selectRandom btc_civ_type_units;
+};
+
+private _group = createGroup [civilian, true];
+_group setVariable ["btc_city", _city];
+_group setVariable ["acex_headless_blacklist", true];
+private _suicider = _group createUnit [_type_units, _rpos, [], 0, "CAN_COLLIDE"];
+
+[_group, btc_civ_fnc_addWP] call btc_delay_fnc_exec;
+_group setVariable ["suicider", true];
+
+[_suicider] call btc_ied_fnc_suiciderLoop;
+
+_suicider
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/ask.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/ask.sqf
new file mode 100644
index 0000000..5d62730
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/ask.sqf
@@ -0,0 +1,96 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_ask
+
+Description:
+ Ask information to an IA.
+
+Parameters:
+ _man - Man giving information. [Object]
+ _isInterrogate - Is interrogated. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_info_fnc_ask;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_man", objNull, [objNull]],
+ ["_isInterrogate", false, [false]]
+];
+
+if !(player getVariable ["interpreter", false]) exitWith {
+ [name _man, localize "STR_BTC_HAM_CON_INFO_ASKREP_NOINTER"] call btc_fnc_showSubtitle;
+};
+
+if !(_man call ace_medical_status_fnc_isInStableCondition) exitWith {
+ private _complain = selectRandom [
+ localize "STR_BTC_HAM_CON_INFO_ASK_WOUNDED1",
+ localize "STR_BTC_HAM_CON_INFO_ASK_WOUNDED2",
+ localize "STR_BTC_HAM_CON_INFO_ASK_WOUNDED3",
+ localize "STR_BTC_HAM_CON_INFO_ASK_WOUNDED4"
+ ];
+ [name _man, _complain] call btc_fnc_showSubtitle;
+};
+
+if (
+ _man getVariable ["btc_already_asked", false] ||
+ _man getVariable ["btc_already_interrogated", false]
+) exitWith {
+ [name _man, localize "STR_BTC_HAM_CON_INFO_ASK_ALLREADYANS"] call btc_fnc_showSubtitle;
+};
+
+if ((round random 3) >= 2 || !_isInterrogate) then {
+ _man setVariable ["btc_already_asked", true, true];
+ if (_isInterrogate) then {_man setVariable ["btc_already_interrogated", true, true];};
+};
+
+//NO < btc_rep_level_low . FAKE < btc_rep_level_normal + 100 . REAL > btc_rep_level_normal + 100
+
+btc_int_ask_data = nil;
+["btc_global_reputation"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+
+waitUntil {!(isNil "btc_int_ask_data")};
+
+private _rep = btc_int_ask_data;
+
+private _chance = (random 300) + (random _rep) + _rep/2;
+private _info_type = "";
+switch !(_isInterrogate) do {
+ case (_chance < btc_rep_level_low) : {_info_type = "NO";};
+ case (_chance >= btc_rep_level_low && _chance < btc_rep_level_normal + 100) : {_info_type = "FAKE";};
+ case (_chance >= btc_rep_level_normal + 100) : {_info_type = "REAL";};
+};
+if (_isInterrogate) then {_info_type = "REAL";};
+if (_info_type isEqualTo "NO") exitWith {
+ [name _man, localize "STR_BTC_HAM_CON_INFO_ASK_NOINFO"] call btc_fnc_showSubtitle;
+};
+
+private _final_phase = (count btc_hideouts) isEqualTo 0;
+private _info = selectRandomWeighted [
+ "TROOPS", 0.4,
+ ["HIDEOUT", "TROOPS"] select _final_phase, 0.4,
+ "CACHE", 0.2
+];
+
+_info_type = _info_type isEqualTo "REAL";
+switch (_info) do {
+ case "TROOPS" : {
+ [_man, _info_type] call btc_info_fnc_troops;
+ };
+ case "HIDEOUT" : {
+ [name _man, _info_type] call btc_info_fnc_hideout_asked;
+ };
+ case "CACHE" : {
+ [name _man, localize "STR_BTC_HAM_CON_INFO_ASK_CACHEMAP"] call btc_fnc_showSubtitle;
+ sleep 2;
+ [_info_type] remoteExecCall ["btc_info_fnc_cache", 2];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/ask_reputation.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/ask_reputation.sqf
new file mode 100644
index 0000000..4028490
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/ask_reputation.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_ask_reputation
+
+Description:
+ Ask reputation level and display it.
+
+Parameters:
+ _man - Man. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ cursorObject call btc_info_fnc_ask_reputation;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_man", objNull, [objNull]]
+];
+
+if !(player getVariable ["interpreter", false]) exitWith {
+ [name _man, localize "STR_BTC_HAM_CON_INFO_ASKREP_NOINTER"] call btc_fnc_showSubtitle;
+};
+
+btc_int_ask_data = nil;
+["btc_global_reputation"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+
+waitUntil {!(isNil "btc_int_ask_data")};
+
+private _rep = btc_int_ask_data;
+
+private _ho_left = "";
+if ((round random 1) isEqualTo 1) then {
+ _ho_left = format [localize "STR_BTC_HAM_CON_INFO_ASKREP_HIDEOUTS", count btc_hideouts];
+};
+
+private _info_type = switch (true) do {
+ case (_rep < btc_rep_level_low): {localize "STR_BTC_HAM_CON_INFO_ASKREP_VLOW"};
+ case (_rep >= btc_rep_level_low && _rep < btc_rep_level_normal): {localize "STR_BTC_HAM_CON_INFO_ASKREP_LOW"};
+ case (_rep >= btc_rep_level_normal && _rep < btc_rep_level_high): {toLower localize "str_terrain_12_5"};
+ case (_rep >= btc_rep_level_high): {localize "str_terrain_6_25"};
+};
+
+private _text = selectRandom [
+ localize "STR_BTC_HAM_CON_INFO_ASKREP_ASK1",
+ localize "STR_BTC_HAM_CON_INFO_ASKREP_ASK2",
+ localize "STR_BTC_HAM_CON_INFO_ASKREP_ASK3"
+];
+
+[name _man, format ["%1 %2. %3", _text, _info_type, _ho_left]] call btc_fnc_showSubtitle;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/cache.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/cache.sqf
new file mode 100644
index 0000000..02c91f7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/cache.sqf
@@ -0,0 +1,76 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_cache
+
+Description:
+ Create cache intel with marker or picture.
+
+Parameters:
+ _isReal - Return a real information. [Boolean]
+ _cache_obj - Cache object. [Object]
+ _cache_n - Cache number. [Number]
+ _cache_info - Last cache intel radius. [Number]
+ _info_cache_ratio - Lower cache intel radius. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ btc_cache_info = 100;
+ [true] call btc_info_fnc_cache;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (isNull btc_cache_obj) exitWith {};
+
+params [
+ ["_isReal", true, [true]],
+ ["_cache_obj", btc_cache_obj, [objNull]],
+ ["_cache_n", btc_cache_n, [0]],
+ ["_cache_info", btc_cache_info, [0]],
+ ["_info_cache_ratio", btc_info_cache_ratio, [0]]
+];
+
+if !(_isReal) then {
+ private _axis = getNumber (configfile >> "CfgWorlds" >> worldName >> "mapSize") / 2;
+ _cache_obj = [[_axis, _axis, 0], _axis] call CBA_fnc_randPos;
+};
+
+private _intelId = [1];
+if (_cache_info < _info_cache_ratio) then {
+ private _building_with_the_cache = typeOf nearestBuilding _cache_obj;
+ private _classnames = [nearestTerrainObjects [_cache_obj, [], 10, false]] call btc_fnc_typeOf;
+ _classnames = _classnames select {isText (configfile >> "CfgVehicles" >> _x >> "editorPreview")};
+ _classnames pushBackUnique _building_with_the_cache;
+ _classnames = _classnames - (btc_cache_pictures select 0);
+
+ if (_classnames isEqualTo []) exitWith {
+ [[_cache_obj, _info_cache_ratio] call CBA_fnc_randPos, _info_cache_ratio] call btc_info_fnc_cacheMarker;
+ };
+ private _classname_object = selectRandom _classnames;
+
+ (btc_cache_pictures select 0) pushBack _classname_object;
+ private _is_building_with_the_cache = _classname_object isEqualTo _building_with_the_cache;
+ (btc_cache_pictures select 1) pushBack _is_building_with_the_cache;
+
+ (btc_cache_pictures select 2) pushBack ([
+ _classname_object,
+ _cache_n,
+ _is_building_with_the_cache
+ ] remoteExecCall ["btc_info_fnc_cachePicture", [0, -2] select isDedicated, true]);
+
+ _intelId = [
+ [15, 14] select _is_building_with_the_cache,
+ _classname_object
+ ]
+} else {
+ btc_cache_info = [[_cache_obj, _cache_info] call CBA_fnc_randPos, _cache_info] call btc_info_fnc_cacheMarker;
+};
+
+_intelId remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+
+_intelId
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/cacheMarker.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/cacheMarker.sqf
new file mode 100644
index 0000000..935c8a8
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/cacheMarker.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_cacheMarker
+
+Description:
+ Create intel marker.
+
+Parameters:
+ _position - Position of the marker. [Array]
+ _radius - Radius of the indication. [Number]
+ _marker_name - Marker name. [String]
+ _info_cache_ratio - Offset intel distance. [Number]
+
+Returns:
+ _cache_info - Next intel distance. [Number]
+
+Examples:
+ (begin example)
+ [[btc_cache_pos, btc_cache_info] call CBA_fnc_randPos,
+ btc_cache_info] call btc_info_fnc_cacheMarker;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", btc_cache_pos, [[]]],
+ ["_radius", btc_cache_info, [0]],
+ ["_marker_name", "", [""]],
+ ["_info_cache_ratio", btc_info_cache_ratio, [0]]
+];
+
+private _marker = createMarker [format ["%1", _pos], _pos];
+_marker setMarkerType "hd_unknown";
+_marker setMarkerText ([_marker_name, format ["%1m", _radius]] select (_marker_name isEqualTo ""));
+_marker setMarkerSize [0.5, 0.5];
+_marker setMarkerColor "ColorRed";
+
+btc_cache_markers pushBack _marker;
+
+_radius - _info_cache_ratio
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/cachePicture.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/cachePicture.sqf
new file mode 100644
index 0000000..fb5b695
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/cachePicture.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_cachePicture
+
+Description:
+ Add picture to the diary.
+
+Parameters:
+ _classname_object - Classe name of the object to show. [String]
+ _cache_n - Number of the current cache. [Number]
+ _is_building_with_the_cache - Is the building with the cache inside. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [typeOf player, 0] call btc_info_fnc_cachePicture;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_classname_object", "", [""]],
+ ["_cache_n", -1, [-1]],
+ ["_is_building_with_the_cache", true, [true]]
+];
+
+if !(player diarySubjectExists "btc_diarylog") then {
+ player createDiarySubject ["btc_diarylog", localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_DIARYLOG", '\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa'];
+};
+
+private _string = if (_is_building_with_the_cache) then {
+ "STR_BTC_HAM_O_COMMON_SHOWHINTS_14"
+} else {
+ "STR_BTC_HAM_O_COMMON_SHOWHINTS_15"
+};
+
+player createDiaryRecord [
+ "btc_diarylog",
+ [
+ format [localize "STR_BTC_HAM_CON_INFO_PICTURE", _cache_n],
+ (localize _string) + ([_classname_object] call btc_fnc_typeOfPreview)
+ ]
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/createIntels.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/createIntels.sqf
new file mode 100644
index 0000000..53d99b6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/createIntels.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_createIntels
+
+Description:
+ Create intels in a city.
+
+Parameters:
+ _city - City to create intels. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_info_fnc_createIntels;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]]
+];
+
+private _houses = +(_city getVariable ["btc_city_housesEntrerable", []]);
+
+private _numberOfHouses = count _houses;
+_houses = _houses select [0, round (_numberOfHouses * btc_p_info_houseDensity / 100)];
+
+private _intels = _houses apply {
+ createVehicle [selectRandom btc_info_intels, ASLToATL AGLToASL selectRandom (_x buildingPos -1), [], 0, "CAN_COLLIDE"];
+};
+_city setVariable ["btc_city_intels", _intels];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/give_intel.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/give_intel.sqf
new file mode 100644
index 0000000..a53fea9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/give_intel.sqf
@@ -0,0 +1,50 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_give_intel
+
+Description:
+ Give intel to the player.
+
+Parameters:
+ _asker - Player. [Object]
+
+Returns:
+ _intelType - Return the type of intel. [Number]
+
+Examples:
+ (begin example)
+ _intelType = [player] call btc_info_fnc_give_intel;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_asker", objNull, [objNull]]
+];
+
+private _intelType = random 100;
+
+if (btc_hideouts isEqualTo []) then {_intelType = (btc_info_intel_type select 0) - 10;};
+
+switch (true) do {
+ case (_intelType < (btc_info_intel_type select 0)) : { //cache
+ [true] call btc_info_fnc_cache;
+ };
+ case (_intelType > (btc_info_intel_type select 1) && _intelType < 101) : { //both
+ [true] call btc_info_fnc_cache;
+ [] call btc_info_fnc_hideout;
+ [5] remoteExecCall ["btc_fnc_show_hint", _asker];
+ };
+ case (_intelType > (btc_info_intel_type select 0) && _intelType < (btc_info_intel_type select 1)) : { //hd
+ [] call btc_info_fnc_hideout;
+ [5] remoteExecCall ["btc_fnc_show_hint", _asker];
+ };
+ default {
+ [3] remoteExecCall ["btc_fnc_show_hint", _asker];
+ };
+};
+
+_intelType
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/has_intel.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/has_intel.sqf
new file mode 100644
index 0000000..cac1cd5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/has_intel.sqf
@@ -0,0 +1,49 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_has_intel
+
+Description:
+ Check if the body or object have intel.
+
+Parameters:
+ _body - Body or object to check. [Object]
+ _asker - Player asking for intel. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, player] remoteExecCall ["btc_info_fnc_has_intel", 2];
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_body", objNull, [objNull]],
+ ["_asker", objNull, [objNull]]
+];
+
+if (btc_debug_log) then {
+ [format ["%1", _body getVariable "intel"], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if (
+ _body isKindOf "Items_base_F" || (
+ _body getVariable ["intel", false] &&
+ !(_body getVariable ["btc_already_interrogated", false]))
+) then {
+ _body setVariable ["intel", false];
+ if (_body isKindOf "Items_base_F") then {
+ _body call CBA_fnc_deleteEntity;
+ };
+ if (isServer) then {
+ [_asker] call btc_info_fnc_give_intel;
+ } else {
+ [_asker] remoteExecCall ["btc_info_fnc_give_intel", 2];
+ };
+} else {
+ [3] remoteExecCall ["btc_fnc_show_hint", _asker];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/hideout.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/hideout.sqf
new file mode 100644
index 0000000..dcb8c94
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/hideout.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_hideout
+
+Description:
+ Add an random intel marker for the current hideout.
+
+Parameters:
+ _ho - Current hideout. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_info_fnc_hideout;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_ho", btc_hq, [objNull]]
+];
+
+if (btc_hideouts isEqualTo []) exitWith {};
+
+if (isNull _ho) then {
+ _ho = selectRandom btc_hideouts;
+ btc_hq = _ho;
+};
+
+private _pos = [getPos _ho, btc_info_hideout_radius] call CBA_fnc_randPos;
+
+private _marker = createMarker [format ["%1", _pos], _pos];
+_marker setMarkerType "hd_warning";
+_marker setMarkerText format ["%1m", btc_info_hideout_radius];
+_marker setMarkerSize [0.5, 0.5];
+_marker setMarkerColor "ColorRed";
+
+private _array = _ho getVariable ["markers", []];
+
+_array pushBack _marker;
+
+_ho setVariable ["markers", _array];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/hideout_asked.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/hideout_asked.sqf
new file mode 100644
index 0000000..bbea6ac
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/hideout_asked.sqf
@@ -0,0 +1,58 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_hideout_asked
+
+Description:
+ Send real or false information about a hideout around.
+
+Parameters:
+ _name - Name of the player. [String]
+ _is_real - If the information is true or not. [Boolean]
+ _text - Not used. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_info_fnc_hideout_asked;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_name", "Vdauphin", [""]],
+ ["_is_real", true, [true]],
+ ["_text", "", [""]]
+];
+
+if (_is_real) then {
+ private _index = btc_hideouts findIf {
+ _x inArea [getPosWorld player, 3000, 3000, 0, false]
+ };
+
+ if (_index > -1) then {
+ private _hideout = btc_hideouts select _index;
+ private _dist = (player distance _hideout) + (random 500) - (random 500);
+ private _dir = player getDir _hideout;
+ private _card = [_dir] call btc_fnc_get_cardinal;
+ _text = format [localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_TRUE", _card, round _dist];
+ } else {
+ _text = localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_FALSE";
+ };
+} else {
+ if ((random 1) > 0.5) then {
+ private _dir = selectRandom ["N", "E", "W", "S", "NW", "NE", "SE", "SW"];
+ private _dist = 300 + (random 2000);
+ _text = format [localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_TRUE", _dir, round _dist];
+ } else {
+ _text = localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_FALSE";
+ };
+};
+
+if (btc_debug) then {_text = _text + " - " + str _is_real};
+
+[_name, _text] call btc_fnc_showSubtitle;
+player createDiaryRecord ["btc_diarylog", [str(mapGridPosition player) + " - " + _name, _text]];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/path.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/path.sqf
new file mode 100644
index 0000000..d3b69b6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/path.sqf
@@ -0,0 +1,72 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_path
+
+Description:
+ Show path of a patrol to set an amboush.
+
+Parameters:
+ _unit - Unit to show path. [Object]
+ _endPos - End position of the group. [Array]
+ _taskID - Unique ID for created markers. It is easy to get them later with: allMapMarkers select {(_x select [0, count _taskID]) isEqualTo _taskID}. [String]
+
+Returns:
+ _agent - An agent to add the "PathCalculated" event handler to. [Object]
+
+Examples:
+ (begin example)
+ [group player, [0, 0, 0], "playerPath"] call btc_info_fnc_path;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_startPos", [0, 0, 0], [[]]],
+ ["_endPos", [0, 0, 0], [[]]],
+ ["_taskID", "btc_side", [""]],
+ ["_typeVehicle", "Man", [""]],
+ ["_behaviour", "safe", [""]]
+];
+
+private _parent = [configFile >> "CfgVehicles" >> _typeVehicle, true] call BIS_fnc_returnParents;
+private _type = (_parent arrayIntersect ["Man", "Car", "Tank", "Wheeled_APC", "Boat", "Plane", "Helicopter"]) select 0;
+private _agent = calculatePath [_type, _behaviour, _startPos, _endPos];
+
+[_agent, "PathCalculated", {
+ params ["_agent", "_path"];
+ _thisArgs params [
+ ["_taskID", "btc_side", [""]]
+ ];
+
+ _agent removeEventHandler ["PathCalculated", _thisId];
+ _agent setVariable ["btc_path", _path];
+
+ private _color = configName selectRandom (configProperties [configFile >> "CfgMarkerColors"]);
+ private _delta = 10;
+ for "_i" from 1 to (count _path) step 30 do {
+ private _position = _path select (_i - 1);
+ private _direction = _position getDir (_path select _i);
+
+ private _mrk = createMarker [format ["%1_%2", _taskID, _i], _position];
+ _mrk setMarkerType "hd_arrow";
+ _mrk setMarkerAlpha 0.7;
+ _mrk setMarkerColor _color;
+ _mrk setMarkerDir _direction;
+
+ if (btc_debug) then {
+ _mrk setMarkerText format ["%1°", floor _direction];
+ };
+ };
+ if (btc_debug) then {
+ {
+ private _mrk = createMarker [format ["%1_debug_%2", _taskID, _forEachIndex], _x];
+ _mrk setMarkerType "mil_dot";
+ _mrk setMarkerAlpha 0.3;
+ } forEach _path;
+ };
+}, [_taskID]] call CBA_fnc_addBISEventHandler;
+
+_agent
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/search_for_intel.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/search_for_intel.sqf
new file mode 100644
index 0000000..e7f3101
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/search_for_intel.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_search_for_intel
+
+Description:
+ Search a body for intel.
+
+Parameters:
+ _target - Body to search. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_info_fnc_search_for_intel;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_target", objNull, [objNull]]
+];
+
+private _radius = 7;
+if (_target isKindOf "Man") then {_radius = 4;};
+if (_target isKindOf "Helicopter") then {_radius = 20;};
+
+private _onFinish = {
+ params ["_args"];
+ _args params ["_target", "_player"];
+
+ [_target, _player] remoteExecCall ["btc_info_fnc_has_intel", 2];
+};
+private _condition = {
+ params ["_args"];
+ _args params ["_target", "_player", "_radius"];
+
+ (_target distance _player < _radius) && {[_player, objNull, ["isnotinside"]] call ace_common_fnc_canInteractWith}
+};
+
+[btc_int_search_intel_time, [_target, player, _radius], _onFinish, {}, localize "STR_BTC_HAM_CON_INFO_SEARCH_BAR", _condition, ["isNotInside"]] call ace_common_fnc_progressBar;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/info/troops.sqf b/hearts_and_minds.kunduz_valley/core/fnc/info/troops.sqf
new file mode 100644
index 0000000..5654b98
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/info/troops.sqf
@@ -0,0 +1,58 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_info_fnc_troops
+
+Description:
+ Show troops information.
+
+Parameters:
+ _name - IA giving the information. [Object]
+ _is_real - Is a real information. [Boolean]
+ _text - Text to show. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_info_fnc_troops;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_man", objNull, [objNull]],
+ ["_is_real", true, [true]],
+ ["_text", "", [""]]
+];
+
+if (_is_real) then {
+ private _array = player nearEntities [btc_type_units, 2500];
+ _array = _array - [_man];
+ if (_array isEqualTo []) then {
+ _text = localize "STR_BTC_HAM_CON_INFO_TROOPS_FALSE";
+ } else {
+ _array = _array apply {[player distance _x, _x]};
+ private _nearestEnemy = _array select 0 select 1;
+ private _dist = player distance ([_nearestEnemy, 100] call CBA_fnc_randPos);
+ private _dir = player getDir _nearestEnemy;
+ private _card = [_dir] call btc_fnc_get_cardinal;
+ _text = format [localize "STR_BTC_HAM_CON_INFO_TROOPS_TRUE", _card, round _dist];
+ };
+} else {
+ if ((random 1) > 0.5) then {
+ private _array = ["N", "E", "W", "S", "NW", "NE", "SE", "SW"];
+ private _dir = selectRandom _array;
+ private _dist = 500 + (random 1000);
+ _text = format [localize "STR_BTC_HAM_CON_INFO_TROOPS_TRUE", _dir, round _dist];
+ } else {
+ _text = localize "STR_BTC_HAM_CON_INFO_TROOPS_FALSE";
+ };
+};
+
+if (btc_debug) then {_text = _text + " - " + str _is_real};
+
+[name _man, _text] call btc_fnc_showSubtitle;
+player createDiaryRecord ["btc_diarylog", [str(mapGridPosition player) + " - " + name _man, _text]];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/add_actions.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/add_actions.sqf
new file mode 100644
index 0000000..1db4a28
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/add_actions.sqf
@@ -0,0 +1,251 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_add_actions
+
+Description:
+ Add actions use in game.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_add_actions;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+
+//Database
+private _action = ["Database", localize "STR_BTC_HAM_ACTION_DATA_MAIN", "\A3\ui_f\data\igui\cfg\simpleTasks\letters\D_ca.paa", {}, {(call BIS_fnc_admin) == 2 || !isMultiplayer}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+_action = ["request_save", localize "str_3den_display3den_menubar_missionsave_text", "\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa", {[] remoteExecCall ["btc_db_fnc_save", 2]}, {true}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "Database"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["request_delete", localize "STR_3DEN_Delete", "\A3\ui_f\data\igui\cfg\simpleTasks\types\exit_ca.paa", {[] remoteExecCall ["btc_db_fnc_delete", 2]}, {true}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "Database"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+//Intel
+_action = ["Search_intel", localize "STR_A3_Showcase_Marksman_BIS_tskIntel_title", "\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa", {
+ [btc_info_fnc_search_for_intel, [_target]] call CBA_fnc_execNextFrame;
+}, {!alive _target}] call ace_interact_menu_fnc_createAction;
+{[_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;} forEach (btc_type_units + btc_type_divers);
+_action = ["Interrogate_intel", localize "STR_BTC_HAM_ACTION_INTEL_INTERROGATE", "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa", {[_target,true] spawn btc_info_fnc_ask;}, {alive _target && {[_target] call ace_common_fnc_isAwake} && captive _target}] call ace_interact_menu_fnc_createAction;
+{[_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;} forEach (btc_type_units + btc_type_divers);
+_action = ["Search_intel", localize "STR_A3_Showcase_Marksman_BIS_tskIntel_title", "\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa", {
+ [btc_info_fnc_search_for_intel, [_target]] call CBA_fnc_execNextFrame;
+}, {true}] call ace_interact_menu_fnc_createAction;
+{[_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;} forEach btc_info_intels;
+
+//Log point
+{
+ _x params ["_object", "_helipad"];
+
+ //Logistic
+ _action = ["Logistic", localize "STR_BTC_HAM_ACTION_LOC_MAIN", "\A3\ui_f\data\igui\cfg\simpleTasks\letters\L_ca.paa", {}, {true}] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Require_object", localize "STR_BTC_HAM_ACTION_LOGPOINT_REQOBJ", "\A3\ui_f\data\igui\cfg\simpleTasks\letters\D_ca.paa", {
+ params ["", "", "_params"];
+ _params spawn btc_log_fnc_create
+ }, {true}, {}, [_helipad], [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Repair_wreck", localize "STR_BTC_HAM_ACTION_LOGPOINT_REPWRECK", "\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_repair_wreck
+ }, {true}, {}, [_helipad], [0, 0, 0], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Refuel", localize "STR_BTC_HAM_ACTION_LOGPOINT_REFUELSOURCE", "\A3\ui_f\data\igui\cfg\simpleTasks\types\refuel_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_refuelSource
+ }, {true}, {}, [_helipad], [0, 0, 0], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Rearm", localize "STR_BTC_HAM_ACTION_LOGPOINT_REARMSOURCE", "\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_rearmSource
+ }, {true}, {}, [_helipad], [0, 0, 0], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Require_veh", localize "STR_BTC_HAM_ACTION_LOGPOINT_REQVEH", "\A3\ui_f\data\map\vehicleicons\iconCar_ca.paa", {
+ params ["", "", "_params"];
+ _params spawn btc_arsenal_fnc_garage
+ }, {(serverCommandAvailable "#logout" || !isMultiplayer) and btc_p_garage}, {}, [_helipad], [0, 0, 0], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Require_delete", localize "STR_3DEN_Delete", "\z\ace\addons\arsenal\data\iconClearContainer.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_delete
+ }, {true}, {}, [_helipad], [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+ //Tool
+ _action = ["Tool", localize "str_3den_display3den_menubar_tools_text", "\A3\ui_f\data\igui\cfg\simpleTasks\letters\T_ca.paa", {}, {true}] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Copy_container", localize "STR_BTC_HAM_ACTION_COPYPASTE_COPY", "\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_copy
+ }, {true}, {}, [_helipad], [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Tool"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Paste_container", localize "STR_BTC_HAM_ACTION_COPYPASTE_PASTE", "\A3\ui_f\data\igui\cfg\simpleTasks\types\upload_ca.paa", {
+ params ["", "", "_params"];
+ [btc_copy_container, _params] call btc_log_fnc_paste
+ }, {!isNil "btc_copy_container"}, {}, _helipad, [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Tool"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Copy_inventory", localize "STR_BTC_HAM_ACTION_COPYPASTE_COPYI", "\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_inventoryCopy
+ }, {true}, {}, [_helipad], [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Tool"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Paste_inventory", localize "STR_BTC_HAM_ACTION_COPYPASTE_PASTEI", "\A3\ui_f\data\igui\cfg\simpleTasks\types\upload_ca.paa", {
+ params ["", "", "_params"];
+ [btc_copy_inventory, _params] call btc_log_fnc_inventoryPaste
+ }, {!isNil "btc_copy_inventory"}, {}, _helipad, [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Tool"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Restore_inventory", localize "STR_BTC_HAM_ACTION_RESTOREI", "\A3\Ui_f\data\GUI\Cfg\KeyframeAnimation\IconCurve_CA.paa", {
+ params ["", "", "_params"];
+ _params call btc_log_fnc_inventoryRestore
+ }, {true}, {}, _helipad, [0, 0, 0.4], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions", "Tool"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+ //Bodybag
+ if (btc_p_respawn_ticketsAtStart isNotEqualTo -1) then {
+ _action = ["Bodybag", localize "STR_BTC_HAM_ACTION_LOGPOINT_BODYBAG", "\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa", {
+ params ["", "", "_params"];
+ _params call btc_body_fnc_bagRecover;
+ }, {true}, {}, [_helipad], [0, 0, 0], 5] call ace_interact_menu_fnc_createAction;
+ [_object, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+ };
+} forEach [[btc_create_object, btc_create_object_point]];
+
+//Place
+_action = ["Logistic", localize "STR_BTC_HAM_ACTION_LOC_MAIN", "\A3\ui_f\data\igui\cfg\simpleTasks\letters\L_ca.paa", {}, {true}] call ace_interact_menu_fnc_createAction;
+{[_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;} forEach btc_log_def_loadable;
+_action = ["Place", localize "STR_ACE_Dragging_Carry", "\z\ace\addons\dragging\UI\icons\box_carry.paa", {_target call btc_log_fnc_place}, {!btc_log_placing && !(player getVariable ["ace_dragging_isCarrying", false])}] call ace_interact_menu_fnc_createAction;
+{[_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;} forEach btc_log_def_placeable;
+
+//Shower
+_action = ["Shower_act", getText(configfile >> "CfgVehicles" >> "DeconShower_01_F" >> "UserActions" >> "Activate" >> "displayName"), "", {player playActionNow 'PutDown'; [_target, 1.5, 9] remoteExec ["BIN_fnc_deconShowerAnim", 0]}, {alive _target AND {_target animationSourcePhase 'valve_source' isEqualTo 0}}] call ace_interact_menu_fnc_createAction;
+["DeconShower_01_F", 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+_action = ["Shower_act", getText(configfile >> "CfgVehicles" >> "DeconShower_02_F" >> "UserActions" >> "Activate" >> "displayName"), "", {player playActionNow 'PutDown'; [_target, 5.4, 4, 2, true] remoteExec ["BIN_fnc_deconShowerAnimLarge", 0]}, {alive _target AND {_target animationSourcePhase 'valve_source' isEqualTo 0}}] call ace_interact_menu_fnc_createAction;
+["DeconShower_02_F", 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+{
+ _action = ["Shower_desact", getText(configfile >> "CfgVehicles" >> "DeconShower_01_F" >> "UserActions" >> "Deactivate" >> "displayName"), "", {player playActionNow 'PutDown'; [_target] remoteExecCall ["BIN_fnc_deconShowerAnimStop", 0]}, {alive _target AND {_target animationSourcePhase 'valve_source' > 0}}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+} forEach ["DeconShower_01_F", "DeconShower_02_F"];
+
+//FOB
+_action = ["Mount_FOB", localize "STR_BTC_HAM_ACTION_FOB_MOUNT", "\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa", {_target spawn btc_fob_fnc_create}, {!btc_log_placing && !(player getVariable ["ace_dragging_isCarrying", false])}] call ace_interact_menu_fnc_createAction;
+[btc_fob_mat, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+_action = ["Dismantle_FOB", localize "STR_BTC_HAM_ACTION_FOB_DISMANTLE", "", {_target remoteExecCall ["btc_fob_fnc_dismantle_s", 2]}, {true}, {}, [], [0, 0, -2], 5] call ace_interact_menu_fnc_createAction;
+[btc_fob_flag, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+//Orders
+_action = ["Civil_Orders", localize "STR_BTC_HAM_ACTION_ORDERS_MAIN", "\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa", {}, {true}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+_action = ["Civil_Stop", localize "STR_BTC_HAM_ACTION_ORDERS_STOP", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk3_ca.paa", {[1] call btc_int_fnc_orders;}, {vehicle player isEqualTo player}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["Civil_Get_down", localize "STR_BTC_HAM_ACTION_ORDERS_GETDOWN", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk2_ca.paa", {[2] call btc_int_fnc_orders;}, {vehicle player isEqualTo player}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["Civil_Go_away", localize "STR_BTC_HAM_ACTION_ORDERS_GOAWAY", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk1_ca.paa", {[3] call btc_int_fnc_orders;}, {vehicle player isEqualTo player}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+{ //Actions attachted to AI
+ _action = ["Civil_Orders", localize "STR_BTC_HAM_ACTION_ORDERS_MAIN", "\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa", {}, {true}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Civil_taxi", localize "STR_BTC_HAM_ACTION_ORDERS_TAXI", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk4_ca.paa", {[4, _target] call btc_int_fnc_orders;}, {(alive _target) && (vehicle _target) isNotEqualTo _target}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Civil_Stop", localize "STR_BTC_HAM_ACTION_ORDERS_STOP", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk3_ca.paa", {[1, _target] call btc_int_fnc_orders;}, {alive _target}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Civil_Get_down", localize "STR_BTC_HAM_ACTION_ORDERS_GETDOWN", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk2_ca.paa", {[2, _target] call btc_int_fnc_orders;}, {alive _target}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Civil_Go_away", localize "STR_BTC_HAM_ACTION_ORDERS_GOAWAY", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk1_ca.paa", {[3, _target] call btc_int_fnc_orders;}, {alive _target}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions", "Civil_Orders"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Ask_Info", localize "STR_BTC_HAM_ACTION_ORDERS_ASKINFO", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa", {[_target,false] spawn btc_info_fnc_ask;}, {alive _target && {[_target] call ace_common_fnc_isAwake} && {side _target isEqualTo civilian}}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Ask_Reputation", localize "STR_BTC_HAM_ACTION_ORDERS_ASKREP", "\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa", {[_target] spawn btc_info_fnc_ask_reputation;}, {alive _target && {[_target] call ace_common_fnc_isAwake} && {side _target isEqualTo civilian}}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = ["Give_food", localize "STR_BTC_HAM_ACTION_GIVEFOOD", "\z\ace\addons\common\data\icon_banana_ca.paa", {[player, _target] call btc_int_fnc_foodGive}, {alive _target && {btc_rep_food in items player}}] call ace_interact_menu_fnc_createAction;
+ [_x, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+ //remove ace3 "get down" order
+ [_x, 0, ["ACE_MainActions", "ACE_GetDown"]] call ace_interact_menu_fnc_removeActionFromClass;
+ //remove ace3 "go away" order
+ [_x, 0, ["ACE_MainActions", "ACE_SendAway"]] call ace_interact_menu_fnc_removeActionFromClass;
+} forEach btc_civ_type_units;
+
+//Side missions
+_action = ["side_mission", localize "STR_BTC_HAM_DOC_SIDEMISSION_TITLE", "\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa", {}, {player getVariable ["side_mission", false]}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["side_mission_abort", localize "STR_BTC_HAM_ACTION_SIDEMISSION_ABORT", "\A3\ui_f\data\igui\cfg\simpleTasks\types\exit_ca.paa", {[player call BIS_fnc_taskCurrent] call btc_task_fnc_abort}, {player getVariable ["side_mission", false]}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "side_mission"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["side_mission_request", localize "STR_BTC_HAM_ACTION_SIDEMISSION_REQ", "\A3\ui_f\data\igui\cfg\simpleTasks\types\default_ca.paa", {[] remoteExec ["btc_side_fnc_create", 2]}, {player getVariable ["side_mission", false]}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "side_mission"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+//Debug
+if (btc_debug) then {
+ _action = ["Debug_graph", "Disable debug graph", "\a3\Ui_f\data\GUI\Rsc\RscDisplayMissionEditor\iconCamera_ca.paa", {btc_debug_graph = !btc_debug_graph}, {btc_debug_graph}] call ace_interact_menu_fnc_createAction;
+ [player, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["Debug_graph", "Enable debug graph", "\a3\Ui_f\data\GUI\Rsc\RscDisplayMissionEditor\iconCamera_ca.paa", {btc_debug_graph = true; 73001 cutRsc ["TER_fpscounter", "PLAIN"];}, {!btc_debug_graph}] call ace_interact_menu_fnc_createAction;
+ [player, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+};
+
+//Re-deploy
+[btc_gear_object] call btc_fob_fnc_addInteraction;
+if (btc_p_respawn_fromOutsideBase > 0) then {
+ [btc_fob_flag, false, btc_p_respawn_fromOutsideTimeout >= 5] call btc_fob_fnc_addInteraction;
+};
+if (btc_p_respawn_fromOutsideBase > 4) then {
+ [player, false, btc_p_respawn_fromOutsideTimeout >= 1, 1, ["ACE_SelfActions"]] call btc_fob_fnc_addInteraction;
+};
+
+//Arsenal
+//BIS
+if (btc_p_arsenal_Type < 3) then {
+ btc_gear_object addAction [localize "STR_BTC_HAM_ACTION_ARSENAL_OPEN_BIS", "['Open', [btc_p_arsenal_Restrict isNotEqualTo 1, _this select 0]] call bis_fnc_arsenal;"];
+};
+//ACE
+if (btc_p_arsenal_Type > 0) then {
+ [btc_gear_object, btc_p_arsenal_Restrict isNotEqualTo 1, false] call ace_arsenal_fnc_initBox;
+ if (btc_p_arsenal_Type in [2, 4]) then {
+ btc_gear_object addAction [localize "STR_BTC_HAM_ACTION_ARSENAL_OPEN_ACE", "[btc_gear_object, player] call ace_arsenal_fnc_openBox;"];
+ };
+};
+if (btc_p_arsenal_Restrict isNotEqualTo 0) then {[btc_gear_object, btc_p_arsenal_Type, btc_p_arsenal_Restrict, btc_custom_arsenal] call btc_arsenal_fnc_data;};
+
+//Door
+_action = ["door_break", localize "STR_BTC_HAM_ACTION_DOOR_BREAK", "\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa", {
+ [btc_door_fnc_break] call CBA_fnc_execNextFrame;
+}, {
+ (((player call ace_common_fnc_uniqueItems) arrayIntersect ace_logistics_wirecutter_possibleWirecutters) isNotEqualTo []) || {getNumber ((configOf (backpackContainer player)) >> "ace_logistics_wirecutter_hasWirecutter") == 1} ||
+ {getNumber (configFile >> "CfgWeapons" >> (vest player) >> "ace_logistics_wirecutter_hasWirecutter") == 1}
+}] call ace_interact_menu_fnc_createAction;
+[player, 1, ["ACE_SelfActions", "ACE_Equipment"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+//Flag
+if (btc_p_flag > 1) then {
+ private _action = ["btc_flag_deployPlayer", localize "STR_BTC_HAM_ACTION_VEHINIT_DEPLOYFLAG", "\A3\ui_f\data\map\markers\handdrawn\flag_CA.paa", {}, {getForcedFlagTexture _target isEqualTo ""}, btc_flag_fnc_deploy] call ace_interact_menu_fnc_createAction;
+ [player, 1, ["ACE_SelfActions", "ACE_Equipment"], _action] call ace_interact_menu_fnc_addActionToObject;
+ _action = ["btc_flag_cutPlayer", localize "STR_BTC_HAM_ACTION_VEHINIT_CUTFLAG", "\A3\ui_f\data\map\markers\handdrawn\flag_CA.paa", {
+ _target forceFlagTexture "";
+ }, {getForcedFlagTexture _target isNotEqualTo "" && !([player] call ace_flags_fnc_isCarryingFlag)}] call ace_interact_menu_fnc_createAction;
+ [player, 1, ["ACE_SelfActions", "ACE_Equipment"], _action] call ace_interact_menu_fnc_addActionToObject;
+};
+
+//Change day time and weather
+_action = ["env_menu", localize "str_a3_credits_environment", "", {}, {player getVariable ["side_mission", false] && (btc_p_change_time || btc_p_change_weather)}] call ace_interact_menu_fnc_createAction;
+[btc_gear_object, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["set_day", localize "STR_BTC_HAM_ACTION_SET_DAY", "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Watch_ca.paa", {
+ private _hour = date call BIS_fnc_sunriseSunsetTime select 0;
+ ((_hour + 1 - dayTime + 24) % 24) remoteExecCall ["skipTime", 2];
+}, {btc_p_change_time}] call ace_interact_menu_fnc_createAction;
+[btc_gear_object, 0, ["ACE_MainActions", "env_menu"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["set_night", localize "STR_BTC_HAM_ACTION_SET_NIGHT", "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Watch_ca.paa", {
+ private _hour = date call BIS_fnc_sunriseSunsetTime select 1;
+ ((_hour + 1 - dayTime + 24) % 24) remoteExecCall ["skipTime", 2];
+}, {btc_p_change_time}] call ace_interact_menu_fnc_createAction;
+
+[btc_gear_object, 0, ["ACE_MainActions", "env_menu"], _action] call ace_interact_menu_fnc_addActionToObject;
+_action = ["set_weather", localize "STR_BTC_HAM_ACTION_CHANGE_WEATHER", "a3\3den\data\attributes\slidertimeday\sun_ca.paa", {[] remoteExecCall ["btc_fnc_changeWeather", 2]}, {btc_p_change_weather}] call ace_interact_menu_fnc_createAction;
+[btc_gear_object, 0, ["ACE_MainActions","env_menu"], _action] call ace_interact_menu_fnc_addActionToObject;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/ask_var.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/ask_var.sqf
new file mode 100644
index 0000000..b51a6cd
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/ask_var.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_ask_var
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _id - [Object]
+ _target - [String]
+ _varName - []
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_ask_var;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_id", 0, [0, ""]],
+ ["_target", objNull, [objNull]],
+ ["_varName", "btc_int_ask_data", [""]]
+];
+
+private _data = switch (_id) do {
+ case 9 : {[_target] call btc_db_fnc_saveObjectStatus;};
+ case 10 : {
+ private _units = allUnits select {alive _x};
+ _units append entities [["Car", "Tank", "Ship", "Air"], []];
+ _units apply {[_x, owner _x]};
+ };
+ case 11 : {floor diag_fps;};
+ default {missionNamespace getVariable [_id, []];};
+};
+
+missionNamespace setVariable [_varName, _data, remoteExecutedOwner];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/checkSirenBeacons.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/checkSirenBeacons.sqf
new file mode 100644
index 0000000..e4a1a23
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/checkSirenBeacons.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_checkSirenBeacons
+
+Description:
+ Check if player turn ON siren or beacons.
+
+Parameters:
+ _veh - Vehicle. [Object]
+ _text - Text displayed. [String]
+ _typesConfig - Type of config to check. [Array]
+ _typeVariable - Variable name. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, configOf _veh >> "UserActions" >> siren_Start >> "displayName", ["siren_Start", "siren_stop"] , "btc_int_sirenStart"] call btc_int_fnc_checkSirenBeacons;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_veh",
+ "_text",
+ "_typesConfig",
+ "_typeVariable"
+];
+_typesConfig params ["_start", "_stop"];
+
+private _userActions = configOf _veh >> "UserActions";
+if (
+ getText (_userActions >> _start >> "displayName") isEqualTo _text
+) exitWith {
+ _veh call btc_int_fnc_ordersLoop;
+ _veh setVariable [_typeVariable, true, true];
+};
+if (
+ getText (_userActions >> _stop >> "displayName") isEqualTo _text
+) exitWith {
+ _veh setVariable [_typeVariable, false, true];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/foodGive.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/foodGive.sqf
new file mode 100644
index 0000000..fd450d4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/foodGive.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_foodGive
+
+Description:
+ Give food to a unit.
+
+Parameters:
+ _player - Player. [Object]
+ _target - Target. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player, cursorObject] call btc_int_fnc_foodGive;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", player, [objNull]],
+ ["_target", objNull, [objNull]]
+];
+
+private _hadFood = btc_rep_food in items _target;
+if (
+ [player, btc_rep_food] call CBA_fnc_removeItem &&
+ {[_target, btc_rep_food, true] call CBA_fnc_addItem}
+) then {
+ [_player, "PutDown"] call ace_common_fnc_doGesture;
+
+ private _isInterpreter = player getVariable ["interpreter", false];
+ if (_hadFood) then {
+ [name _target, localize (["STR_BTC_HAM_CON_INFO_ASKREP_NOINTER", "STR_BTC_HAM_CON_INT_ALRGIVEFOOD"] select _isInterpreter)] call btc_fnc_showSubtitle;
+ } else {
+ [name _target, localize (["STR_BTC_HAM_CON_INFO_ASKREP_NOINTER", "str_a3_rscdisplaywelcome_kart_pard_footer2"] select _isInterpreter)] call btc_fnc_showSubtitle;
+ [btc_rep_bonus_foodGive, _player] remoteExecCall ["btc_rep_fnc_change", 2];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/horn.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/horn.sqf
new file mode 100644
index 0000000..a813dcd
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/horn.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_horn
+
+Description:
+ Execute STOP order if player use horn.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_int_fnc_horn;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+private _veh = vehicle player;
+if (
+ _veh isEqualTo player ||
+ {visibleMap} ||
+ {time < btc_int_hornDelay + 1}
+) exitWith {};
+
+params ["_displayOrControl", "_button"];
+if (_button isNotEqualTo 0) exitWith {};
+
+private _weapon = (weaponState [_veh, _veh unitTurret player]) select 0;
+if !(_weapon isKindOf ["CarHorn", configFile >> "CfgWeapons"]) exitWith {};
+
+[
+ 1,
+ objNull,
+ btc_int_hornRadius,
+ _veh
+] call btc_int_fnc_orders;
+
+btc_int_hornDelay = time;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/orders.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/orders.sqf
new file mode 100644
index 0000000..9955230
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/orders.sqf
@@ -0,0 +1,96 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_orders
+
+Description:
+ Send order to a unit or multiple units.
+
+Parameters:
+ _order - Type of order [Number]
+ _unit - Unit targeted or not. [Object]
+ _radius - Radius of units search. [Number]
+ _vehicle - Who sent the order, player or vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_orders;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_order", 0, [0]],
+ ["_unit", objNull, [objNull]],
+ ["_radius", btc_int_ordersRadius, [0]],
+ ["_vehicle", player, [objNull]]
+];
+
+if (_vehicle isEqualTo player) then {
+ private _gesture = ["", "gestureFreeze", "gestureCover", "gestureGo", "gestureGo"] select _order;
+ _vehicle playActionNow _gesture;
+};
+
+private _pos = getPos _vehicle;
+private _dir = getDir _vehicle;
+private _units = (_pos nearEntities [["Car", "Civilian_F"] + btc_civ_type_units, _radius]) apply {driver _x};
+
+if (_units isEqualTo []) exitWith {true};
+
+if (isNull _unit) then {
+ [_units, _dir, _order] remoteExecCall ["btc_int_fnc_orders_give", 2];
+} else {
+ if (_order isEqualTo 4) then {
+
+ btc_int_ask_data = nil;
+ ["btc_global_reputation"] remoteExecCall ["btc_int_fnc_ask_var", 2];
+
+ [{!(isNil "btc_int_ask_data")}, {
+ params ["_unit", "_pos"];
+ private _rep = btc_int_ask_data;
+
+ if (_rep >= btc_rep_level_normal) then {
+ [name _unit, localize "STR_BTC_HAM_CON_INT_ORDERS_SHOWMAP"] call btc_fnc_showSubtitle;
+ openMap true;
+ addMissionEventHandler ["MapSingleClick",
+ {
+ params ["_units", "_pos"];
+ private _unit = _thisArgs select 0;
+ if (surfaceIsWater _pos) then {
+ [name _unit, localize "STR_BTC_HAM_CON_INT_ORDERS_ONLAND"] call btc_fnc_showSubtitle;
+ } else {
+ [[_unit], 0, 4, _pos] remoteExecCall ["btc_int_fnc_orders_give", _unit];
+ removeMissionEventHandler ["MapSingleClick", _thisEventHandler];
+ openMap false;
+ private _textMap = selectRandom [
+ localize "STR_BTC_HAM_CON_INT_ORDERS_TAXI_OK1",
+ localize "STR_BTC_HAM_CON_INT_ORDERS_TAXI_OK2",
+ localize "STR_BTC_HAM_CON_INT_ORDERS_TAXI_OK3"
+ ];
+ [name _unit, _textMap] call btc_fnc_showSubtitle;
+ };
+ },
+ [_unit]
+ ];
+ } else {
+ if !(player getVariable ["interpreter", false]) exitWith {
+ [name _unit, localize "STR_BTC_HAM_CON_INFO_ASKREP_NOINTER"] call btc_fnc_showSubtitle;
+ };
+
+ private _text = selectRandom [
+ localize "STR_BTC_HAM_CON_INT_ORDERS_NEG1",
+ localize "STR_BTC_HAM_CON_INT_ORDERS_NEG2",
+ localize "STR_BTC_HAM_CON_INT_ORDERS_NEG3",
+ localize "STR_BTC_HAM_CON_INT_ORDERS_NEG4"
+ ];
+ [name _unit, _text] call btc_fnc_showSubtitle;
+ };
+ }, [_unit, _pos]] call CBA_fnc_waitUntilAndExecute;
+ } else {
+ [[_unit], _dir, _order] remoteExecCall ["btc_int_fnc_orders_give", _unit];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/ordersLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/ordersLoop.sqf
new file mode 100644
index 0000000..00b727f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/ordersLoop.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_ordersLoop
+
+Description:
+ Execute in loop STOP order.
+
+Parameters:
+ _veh - Vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ cursorObject call btc_int_fnc_ordersLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_veh"
+];
+
+if (
+ _veh getVariable ["btc_int_sirenStart", false] ||
+ _veh getVariable ["btc_int_beaconsStart", false]
+) exitWith {};
+
+[{
+ params ["_arguments", "_idPFH"];
+ _arguments params ["_veh"];
+
+ private _sirenStart = _veh getVariable ["btc_int_sirenStart", false];
+ private _beaconsStart = _veh getVariable ["btc_int_beaconsStart", false];
+ if (
+ !_sirenStart &&
+ !_beaconsStart
+ ) exitWith {
+ [_idPFH] call CBA_fnc_removePerFrameHandler;
+ };
+
+ [
+ 1,
+ objNull,
+ ([0, btc_int_sirenRadius] select _sirenStart) + ([0, btc_int_beaconRadius] select _beaconsStart),
+ _veh
+ ] call btc_int_fnc_orders;
+}, 0.5, _veh] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/orders_behaviour.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/orders_behaviour.sqf
new file mode 100644
index 0000000..04d095c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/orders_behaviour.sqf
@@ -0,0 +1,89 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_orders_behaviour
+
+Description:
+ Change the behaviour of a unit accordingly to the type of order.
+
+Parameters:
+ _unit - Unit targeted. [Object]
+ _order - Type of order. [Number]
+ _wp_pos - Position the unit must go. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, 0] remoteExec ["btc_int_fnc_orders_behaviour", cursorObject];
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_order", 0, [0]],
+ ["_wp_pos", [0, 0, 0], [[]]]
+];
+
+private _group = group _unit;
+
+if (_order isEqualTo (_unit getVariable ["order", 0])) exitWith {};
+
+_unit setVariable ["order", _order];
+
+if (_unit isEqualTo vehicle _unit) then {
+ [_group] call CBA_fnc_clearWaypoints;
+};
+
+switch (_order) do {
+ case 1 : {
+ doStop _unit;
+ _unit disableAI "PATH";
+ };
+ case 2 : {
+ doStop _unit;
+ _unit disableAI "PATH";
+ if (vehicle _unit != _unit) exitWith {};
+ [_unit, "", 2] call ace_common_fnc_doAnimation;
+ _unit setUnitPos "DOWN";
+ };
+ case 3 : {
+ _unit enableAI "PATH";
+ _unit setUnitPos "UP";
+ _unit doMove _wp_pos;
+ };
+ case 4 : {
+ _unit enableAI "PATH";
+ _unit doMove _wp_pos;
+ };
+};
+
+if (_order isEqualTo 4) then {
+ waitUntil {sleep 3; (isNull _unit || !alive _unit || (_unit inArea [_wp_pos, 10, 10, 0, false]))};
+} else {
+ waitUntil {sleep 3; (
+ isNull _unit ||
+ {!alive _unit} ||
+ {allPlayers inAreaArray [getPosWorld _unit, 50, 50] isEqualTo []}
+ )};
+};
+
+if (isNull _unit || !alive _unit) exitWith {};
+
+if (_order isEqualTo 4) then {
+ doStop _unit;
+ _unit disableAI "PATH";
+ sleep (30 + random 10);
+};
+
+_unit setVariable ["order", nil];
+_unit setUnitPos "AUTO";
+_unit enableAI "PATH";
+_unit doMove getPos _unit;
+
+if (_unit isEqualTo vehicle _unit) then {
+ [_group] call btc_civ_fnc_addWP;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/orders_give.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/orders_give.sqf
new file mode 100644
index 0000000..78a599f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/orders_give.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_orders_give
+
+Description:
+ Send order to units
+
+Parameters:
+ _units - Units. [Array]
+ _dir - Direction of the order. [Number]
+ _order - Type of order. [Number]
+ _wp_pos - Position to reach (taxi). [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_orders_give;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_units", [], [[]]],
+ ["_dir", 0, [0]],
+ ["_order", 0, [0]],
+ ["_wp_pos", [], [[]]]
+];
+
+_units = _units select {!(group _x getVariable ["suicider", false]) && ((side _x) isEqualTo civilian)};
+
+{
+ private _wp_pos_i = if ((_order isEqualTo 3) && (_wp_pos isEqualTo [])) then {
+ [getPos _x, 200, _dir, 40] call CBA_fnc_randPos
+ } else {
+ _wp_pos
+ };
+ [_x, _order, _wp_pos_i] remoteExec ["btc_int_fnc_orders_behaviour", _x];
+} forEach _units;
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/shortcuts.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/shortcuts.sqf
new file mode 100644
index 0000000..5171da9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/shortcuts.sqf
@@ -0,0 +1,70 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_shortcuts
+
+Description:
+ Create CBA keybinds to orders.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_shortcuts;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+#include "\a3\editor_f\Data\Scripts\dikCodes.h"
+#define BTC_PLAY_FBSOUND true //set false if you do not want a "key-pressed-feedback" (sound)
+#define BTC_FBSOUND "ClickSoft" //really quiet sound
+
+private _menuString = "Hearts and Minds " + localize "STR_BTC_HAM_ACTION_ORDERS_MAIN";
+//Order Stop
+[
+ _menuString,
+ "btc_HaM_Action_civStop",
+ [localize "STR_BTC_HAM_ACTION_ORDERS_STOP", localize "STR_BTC_HAM_O_SHORTC_STOP_NOTE"],
+ { //"Civil Order: Stop", "Order a civilian to stop"
+ if (isNull objectParent player) then {
+ [1] call btc_int_fnc_orders;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
+
+//Order Get down
+[
+ _menuString,
+ "btc_HaM_Action_civGetDown",
+ [localize "STR_BTC_HAM_ACTION_ORDERS_GETDOWN", localize "STR_BTC_HAM_O_SHORTC_GETDOWN_NOTE"],
+ { //"Civil Order: Get down", "Order a civilian to get down"
+ if (isNull objectParent player) then {
+ [2] call btc_int_fnc_orders;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
+
+//Order Go away
+[
+ _menuString,
+ "btc_HaM_Action_civGoAway",
+ [localize "STR_BTC_HAM_ACTION_ORDERS_GOAWAY", localize "STR_BTC_HAM_O_SHORTC_GOAWAY_NOTE"],
+ { //"Civil Order: Go Away", "Order a civilian to go away"
+ if (isNull objectParent player) then {
+ [3] call btc_int_fnc_orders;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/int/terminal.sqf b/hearts_and_minds.kunduz_valley/core/fnc/int/terminal.sqf
new file mode 100644
index 0000000..fba524a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/int/terminal.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_int_fnc_terminal
+
+Description:
+ Create interaction to terminal. Only used to side mission hack.
+
+Parameters:
+ _terminal - Terminal to interact. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_int_fnc_terminal;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_terminal", objNull, [objNull]],
+ ["_terminal_taskID", "", [""]]
+];
+
+private _action = ["Open", localize "STR_BTC_HAM_SIDE_HACK_ACEACTION", "\A3\ui_f\data\igui\cfg\simpleTasks\types\intel_ca.paa", {
+ //Start Hacking
+ params ["_terminal"];
+
+ [_terminal, 3] call BIS_fnc_dataTerminalAnimate;
+ [_terminal getVariable ["btc_terminal_taskID", ""], "SUCCEEDED"] call BIS_fnc_taskSetState;
+}, {!(((_this select 0) getVariable ["btc_terminal_taskID", ""]) call BIS_fnc_taskCompleted)}] call ace_interact_menu_fnc_createAction;
+[_terminal, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToObject;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/check.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/check.sqf
new file mode 100644
index 0000000..ecbd895
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/check.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_check
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _chopper - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_check;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_chopper", vehicle player, [objNull]]
+];
+
+if (
+ !(_chopper isKindOf "Helicopter" || (_chopper isKindOf "Ship")) ||
+ !isNull (_chopper getVariable ["cargo", objNull]) ||
+ !btc_ropes_deployed
+) exitWith {false};
+
+private _array = [_chopper] call btc_lift_fnc_getLiftable;
+if (_array isEqualTo []) exitWith {false};
+
+private _cargo_array = nearestObjects [_chopper, _array, 30];
+_cargo_array = _cargo_array - [_chopper];
+_cargo_array = _cargo_array select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+
+if (_cargo_array isEqualTo []) exitWith {false};
+private _cargo = _cargo_array select 0;
+
+private _can_lift = (_array findIf {_cargo isKindOf _x} != -1) && speed _cargo < 5;
+
+if !(_can_lift) exitWith {false};
+
+private _cargo_pos = getPosATL _cargo;
+(_chopper worldToModel _cargo_pos) params ["_cargo_x", "_cargo_y"];
+private _cargo_z = ((getPosATL _chopper) select 2) - (_cargo_pos select 2);
+
+private _can_lift = ((abs _cargo_z) < btc_lift_max_h) && ((abs _cargo_z) > btc_lift_min_h) && ((abs _cargo_x) < btc_lift_radius) && ((abs _cargo_y) < btc_lift_radius);
+
+_can_lift
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/deployRopes.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/deployRopes.sqf
new file mode 100644
index 0000000..3ba86bc
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/deployRopes.sqf
@@ -0,0 +1,52 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_deployRopes
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _heli - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_deployRopes;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_heli", vehicle player, [objNull]]
+];
+
+btc_ropes_deployed = true;
+btc_lifted = false;
+btc_lift_hud = false;
+
+_heli setVariable ["cargo", nil];
+
+ropeCreate [_heli, "slingload0", 10, []];
+
+btc_lift_action_hud = player addAction [
+ "" + (localize "STR_BTC_HAM_LOG_LDR_ACTIONHUD") + "", // Hud On\Off
+ btc_lift_fnc_hud, [], -8, false, false, "", "btc_ropes_deployed"
+];
+btc_lift_action = player addAction [
+ "" + (localize "STR_BTC_HAM_LOG_HOOK") + "", // Hook
+ {[] call btc_lift_fnc_hook}, [], 9, true, false, "", "[] call btc_lift_fnc_check"
+];
+
+waitUntil {sleep 5; (vehicle player isEqualTo player)};
+
+btc_ropes_deployed = false;
+player removeAction btc_lift_action;
+player removeAction btc_lift_action_hud;
+
+if (ropes _heli isNotEqualTo []) then {
+ {ropeDestroy _x;} forEach ropes _heli;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/destroyRopes.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/destroyRopes.sqf
new file mode 100644
index 0000000..6e87746
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/destroyRopes.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_destroyRopes
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _heli - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_destroyRopes;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_heli", vehicle player, [objNull]]
+];
+
+btc_ropes_deployed = false;
+btc_lift_hud = false;
+btc_lifted = false;
+
+player removeAction btc_lift_action;
+player removeAction btc_lift_action_hud;
+
+if (ropes _heli isNotEqualTo []) then {
+ {
+ ropeDestroy _x;
+ } forEach ropes _heli;
+};
+
+_heli setVariable ["cargo", nil];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/hook.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/hook.sqf
new file mode 100644
index 0000000..92b1b68
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/hook.sqf
@@ -0,0 +1,95 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_hook
+
+Description:
+ Hook a cargo in a diameter of 30m.
+
+Parameters:
+ _chopper - Chopper lifting. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] spawn btc_lift_fnc_hook;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_chopper", vehicle player, [objNull]]
+];
+
+private _array = [_chopper] call btc_lift_fnc_getLiftable;
+private _cargo_array = nearestObjects [_chopper, _array, 30];
+_cargo_array = _cargo_array - [_chopper];
+_cargo_array = _cargo_array select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+if (_cargo_array isEqualTo []) exitWith {};
+private _cargo = _cargo_array select 0;
+
+{ropeDestroy _x;} forEach ropes _chopper;
+
+private _bbr = getArray (configOf _cargo >> "slingLoadCargoMemoryPoints");
+private _ropes_check = [];
+if (_bbr isNotEqualTo []) then {
+ {
+ _ropes_check pushBack (ropeCreate [_chopper, "slingload0", _cargo, _x, 11]);
+ } forEach _bbr;
+};
+
+private _rope_length = 10;
+if ((_bbr isEqualTo []) OR (_ropes_check select {!isNull _x} isEqualTo [])) then {
+
+ _bbr = boundingBoxReal _cargo;
+ if (abs((_bbr select 0) select 0) > 5) then {
+ _rope_length = 10 + abs((_bbr select 0) select 0);
+ };
+ ([_cargo] call btc_log_fnc_get_corner_points) params [
+ "_rearCorner",
+ "_rearCorner2",
+ "_frontCorner",
+ "_frontCorner2"
+ ];
+
+ private _support = _cargo;
+ private _bbr_z = 0;
+ if (!alive _cargo) then {
+ _support = [btc_lift_fnc_hookFake, [_cargo, _chopper]] call CBA_fnc_directCall;
+ _bbr_z = _support distance _cargo;
+ sleep 0.3;
+ };
+
+ ropeCreate [_chopper, "slingload0", _support, [_rearCorner select 0, _rearCorner select 1, _bbr_z], _rope_length];
+ ropeCreate [_chopper, "slingload0", _support, [_rearCorner2 select 0, _rearCorner2 select 1, _bbr_z], _rope_length];
+ ropeCreate [_chopper, "slingload0", _support, [_frontCorner select 0, _frontCorner select 1, _bbr_z], _rope_length];
+ ropeCreate [_chopper, "slingload0", _support, [_frontCorner2 select 0, _frontCorner2 select 1, _bbr_z], _rope_length];
+};
+
+if (btc_debug) then {
+ [format ["boundingBoxReal : %1 rope length : %2", _bbr, _rope_length], __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+};
+
+private _max_cargo = getNumber (configOf _chopper >> "slingLoadMaxCargoMass");
+private _mass = getMass _cargo;
+
+[_cargo, clientOwner] remoteExecCall ["setOwner", 2];
+btc_lifted = true;
+sleep 1;
+if ((_mass + 400) > _max_cargo) then {
+ private _new_mass = _max_cargo - 1000;
+ if (_new_mass < 0) then {_new_mass = 50;};
+ [_cargo, _new_mass] remoteExecCall ["setMass", _cargo];
+};
+
+_chopper setVariable ["cargo", _cargo];
+
+waitUntil {sleep 5; (!alive player || !alive _cargo || !btc_lifted || vehicle player isEqualTo player)};
+
+[_cargo, _mass] remoteExecCall ["setMass", _cargo];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/hookFake.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/hookFake.sqf
new file mode 100644
index 0000000..a55a154
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/hookFake.sqf
@@ -0,0 +1,52 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_hookFake
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _cargo - [Object]
+ _chopper - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_hookFake;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cargo", objNull, [objNull]],
+ ["_chopper", objNull, [objNull]]
+];
+
+private _simulation = createVehicle ["Land_Pod_Heli_Transport_04_box_F", getPosATL _cargo, [], 0, "CAN_COLLIDE"];
+(getPosATL _cargo) params ["_x", "_y", "_z"];
+_simulation setPosATL [_x, _y, [_z, 0] select (_z < -0.05)];
+_simulation setDir getDir _cargo;
+_simulation setVectorUp vectorUp _cargo;
+
+_cargo attachTo [_simulation, [0, 0, 0.2 + abs(((_cargo modelToWorld [0, 0, 0]) select 2) - ((_simulation modelToWorld [0, 0, 0]) select 2))]];
+
+_chopper addEventHandler ["RopeBreak", {
+ params ["_object1", "_rope", "_object2"];
+
+ _object1 removeEventHandler ["RopeBreak", _thisEventHandler];
+ btc_lifted = false;
+ deleteVehicle _object2;
+}];
+
+clearWeaponCargoGlobal _simulation;
+clearItemCargoGlobal _simulation;
+clearMagazineCargoGlobal _simulation;
+clearBackpackCargoGlobal _simulation;
+_simulation setObjectTextureGlobal [0, ""];
+_simulation setObjectTextureGlobal [1, ""];
+
+_simulation
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/hud.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/hud.sqf
new file mode 100644
index 0000000..55bf8eb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/hud.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_hud
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_hud;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+btc_lift_hud = !btc_lift_hud;
+if !(btc_lift_hud) exitWith {};
+
+disableSerialization;
+
+939996 cutRsc ["btc_lift_hud", "PLAIN"];
+private _ui = uiNamespace getVariable "btc_lift_hud";
+private _radar_background = _ui displayCtrl 1001;
+private _radar = _ui displayCtrl 1002;
+private _obj_img = _ui displayCtrl 1003;
+private _obj_pic = _ui displayCtrl 1004;
+private _arrow = _ui displayCtrl 1005;
+private _obj_name = _ui displayCtrl 1006;
+private _obj_alt = _ui displayCtrl 1007;
+private _array_hud = [_radar_background, _radar, _obj_img, _obj_pic, _arrow, _obj_name, _obj_alt];
+{_x ctrlShow true;} forEach _array_hud;
+_obj_img ctrlShow false;
+
+private _arrow_up = "\A3\ui_f\data\igui\cfg\actions\arrow_up_gs.paa";
+private _arrow_down = "\A3\ui_f\data\igui\cfg\actions\arrow_down_gs.paa";
+private _complete = "\A3\ui_f\data\map\markers\nato\b_unknown.paa";
+private _incomplete = "\A3\ui_f\data\map\markers\nato\b_unknown.paa";
+
+[btc_lift_fnc_hudLoop, 0,
+ [_arrow_up, _arrow_down, _complete, _incomplete, _obj_img, _obj_pic, _arrow, _obj_name, _obj_alt]
+] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/hudLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/hudLoop.sqf
new file mode 100644
index 0000000..81ce65c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/hudLoop.sqf
@@ -0,0 +1,105 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_hudLoop
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _ui - [Array]
+ _PFH_id - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_hudLoop;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_ui", [], [[]]],
+ ["_PFH_id", 0, [0]]
+];
+_ui params ["_arrow_up", "_arrow_down", "_complete", "_incomplete", "_obj_img", "_obj_pic", "_arrow", "_obj_name", "_obj_alt"];
+
+disableSerialization;
+
+if !((alive player && vehicle player != player) && btc_lift_hud) then {
+ [_PFH_id] call CBA_fnc_removePerFrameHandler;
+ 939996 cutRsc ["Default", "PLAIN"];
+};
+
+private _chopper = vehicle player;
+private _array = [_chopper] call btc_lift_fnc_getLiftable;
+private _cargo_array = nearestObjects [_chopper, _array, 30];
+if (_array isEqualTo []) then {_cargo_array = [];};
+_cargo_array = _cargo_array - [_chopper];
+_cargo_array = _cargo_array select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+
+_cargo_array params [["_cargo", objNull]];
+private _can_lift = _array findIf {_cargo isKindOf _x} != -1;
+
+if (!isNull _cargo) then {
+ _cargo_pos = getPosATL _cargo;
+ (_chopper worldToModel _cargo_pos) params ["_cargo_x", "_cargo_y"];
+ _cargo_z = ((getPosATL _chopper) select 2) - (_cargo_pos select 2);
+ _obj_img ctrlShow true;
+ private _hud_x = _cargo_x / 100;
+ private _hud_y = - _cargo_y / 100;
+ private _hud_x_1 = (btc_lift_HUD_x + _hud_x) * safeZoneW + safeZoneX;
+ private _hud_y_1 = (btc_lift_HUD_y + _hud_y) * safeZoneH + safeZoneY;
+ _obj_img ctrlSetPosition [_hud_x_1, _hud_y_1];
+ _obj_img ctrlCommit 0;
+ private _pic_cargo = "";
+ private _cfgVehicles_cargo = configOf _cargo;
+ if (_cargo isKindOf "LandVehicle") then {
+ _pic_cargo = getText (_cfgVehicles_cargo >> "picture");
+ };
+ private _name_cargo = getText (_cfgVehicles_cargo >> "displayName");
+ _obj_pic ctrlSetText _pic_cargo;
+ _obj_name ctrlSetText _name_cargo;
+ if (btc_lifted) then {
+ _obj_alt ctrlSetText (format ["%1 m", (round((getPos _cargo select 2) * 10))/10]);
+ _obj_img ctrlSetTextColor [0, 1, 0, 1];
+ };
+
+ if ((abs _cargo_z) > (btc_lift_max_h + 3)) then {
+ _arrow ctrlSetText _arrow_down;
+ _arrow ctrlSetTextColor [1, 0, 0, 1];
+ } else {
+ if ((abs _cargo_z) > btc_lift_max_h) then {
+ _arrow ctrlSetText _arrow_down;
+ _arrow ctrlSetTextColor [1, 1, 0, 1];
+ };
+ };
+ if ((abs _cargo_z) < (btc_lift_min_h - 3)) then {
+ _arrow ctrlSetText _arrow_up;
+ _arrow ctrlSetTextColor [1, 0, 0, 1];
+ } else {
+ if ((abs _cargo_z) < btc_lift_min_h) then {
+ _arrow ctrlSetText _arrow_up;
+ _arrow ctrlSetTextColor [1, 1, 0, 1];
+ };
+ };
+ if ((abs _cargo_z) > btc_lift_min_h && (abs _cargo_z) < btc_lift_max_h) then {
+ _arrow ctrlSetText _complete;
+ _arrow ctrlSetTextColor [0, 1, 0, 1];
+ };
+ if !(_can_lift) then {
+ _arrow ctrlSetText _incomplete;
+ _arrow ctrlSetTextColor [1, 0, 0, 1];
+ };
+} else {
+ _obj_img ctrlShow false;
+ _obj_pic ctrlSetText "";
+ _obj_name ctrlSetText "";
+ _arrow ctrlSetText "";
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/rsc.hpp b/hearts_and_minds.kunduz_valley/core/fnc/lift/rsc.hpp
new file mode 100644
index 0000000..043c256
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/rsc.hpp
@@ -0,0 +1,124 @@
+
+class btc_lift_hud {
+ idd = 1000;
+ movingEnable=0;
+ duration=1e+011;
+ name = "btc_lift_hud";
+ onLoad = "uiNamespace setVariable [""btc_lift_hud"", _this select 0];";
+ controlsBackground[] = {};
+ objects[] = {};
+ class controls {
+ class Radar_background {
+ type = 0;
+ idc = 1001;
+ style = 48;
+
+ x = 0.82 * safezoneW + safezoneX;
+ y = 0.75 * safezoneH + safezoneY;
+ w = 0.14 * safezoneW;
+ h = 0.14 * safezoneH * (getresolution select 4);
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {0.1, 0.1, 0.1, 0.6};
+ text = "\A3\ui_f\data\igui\rscingameui\rscminimap\gradient_gs.paa";
+ };
+ class Radar {
+ type = 0;
+ idc = 1002;
+ style = 48;
+
+ x = 0.82 * safezoneW + safezoneX;
+ y = 0.75 * safezoneH + safezoneY;
+ w = 0.14 * safezoneW;
+ h = 0.14 * safezoneH * (getresolution select 4);
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 1, 1, 1};
+ text = "\A3\Ui_f\data\GUI\Rsc\RscSlingLoadAssistant\SLA_Circles_ca.paa";
+ };
+ class Img_Obj {
+ type = 0;
+ idc = 1003;
+ style = 48;
+
+ x = 0.85 * safezoneW + safezoneX;
+ y = 0.85 * safezoneH + safezoneY;
+ w = 0.025 * safezoneW;
+ h = 0.025 * safezoneH * (getresolution select 4);
+
+ font = "PuristaMedium";
+ sizeEx = 1;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 0, 0, 1};
+ text = "\A3\ui_f\data\igui\cfg\simpleTasks\types\target_ca.paa";
+ };
+ class Pic_Obj {
+ type = 0;
+ idc = 1004;
+ style = 48;
+
+ x = 0.822 * safezoneW + safezoneX;
+ y = 0.75 * safezoneH + safezoneY;
+ w = 0.03 * safezoneW;
+ h = 0.03 * safezoneH;
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 1, 1, 1};
+ text = "";
+ };
+ class Arrow {
+ type = 0;
+ idc = 1005;
+ style = 48;
+
+ x = 0.94 * safezoneW + safezoneX;
+ y = 0.75 * safezoneH + safezoneY;
+ w = 0.02 * safezoneW;
+ h = 0.02 * safezoneH * (getresolution select 4);
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 1, 1, 1};
+ text = "";
+ };
+ class Type_Obj {
+ type = 0;
+ idc = 1006;
+ style = 0x00;
+
+ x = 0.84 * safezoneW + safezoneX;
+ y = 0.68 * safezoneH + safezoneY;
+ w = 0.3 * safezoneW;
+ h = 0.1 * safezoneH;
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 1, 1, 1};
+ text = "";
+ };
+ class Alt_Obj {
+ type = 0;
+ idc = 1007;
+ style = 0x00;
+
+ x = 0.92 * safezoneW + safezoneX;
+ y = 0.935 * safezoneH + safezoneY;
+ w = 0.3 * safezoneW;
+ h = 0.1 * safezoneH;
+
+ font = "PuristaMedium";
+ sizeEx = 0.03;
+ colorBackground[] = {0, 0, 0, 0};
+ colorText[] = {1, 1, 1, 1};
+ text = "";
+ };
+ };
+};
\ No newline at end of file
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/lift/shortcuts.sqf b/hearts_and_minds.kunduz_valley/core/fnc/lift/shortcuts.sqf
new file mode 100644
index 0000000..d904a28
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/lift/shortcuts.sqf
@@ -0,0 +1,89 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_lift_fnc_shortcuts
+
+Description:
+ Create CBA keybinds for lift.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_lift_fnc_shortcuts;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+#include "\a3\editor_f\Data\Scripts\dikCodes.h"
+#define BTC_PLAY_FBSOUND true //set false if you do not want a "key-pressed-feedback" (sound)
+#define BTC_FBSOUND "ClickSoft" //really quiet sound
+
+private _menuString = "Hearts and Minds " + localize "STR_HOOKCARGO";
+[
+ _menuString,
+ "btc_HaM_lift_deployRopes",
+ [localize "STR_ACE_Fastroping_Interaction_deployRopes", "deploy ropes from helicopter"],
+ {
+ if (
+ !btc_ropes_deployed &&
+ {(driver vehicle player) isEqualTo player} &&
+ {(getPosATL player) select 2 > 4}
+ ) then {
+ [] spawn btc_lift_fnc_deployRopes;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
+
+[
+ _menuString,
+ "btc_HaM_lift_cutRopes",
+ [localize "STR_ACE_Fastroping_Interaction_cutRopes", "Cut ropes from helicopter"],
+ {
+ if (
+ btc_ropes_deployed &&
+ {(driver vehicle player) isEqualTo player}
+ ) then {
+ [] call btc_lift_fnc_destroyRopes;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
+
+[
+ _menuString,
+ "btc_HaM_lift_HUD",
+ [localize "STR_BTC_HAM_LOG_LDR_ACTIONHUD", "On / Off HUD"],
+ {
+ if (btc_ropes_deployed) then {
+ [] call btc_lift_fnc_hud;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
+
+
+[
+ _menuString,
+ "btc_HaM_lift_hook",
+ [localize "STR_BTC_HAM_LOG_HOOK", "Hook a vehicle"],
+ {
+ if ([] call btc_lift_fnc_check) then {
+ [] spawn btc_lift_fnc_hook;
+ if (BTC_PLAY_FBSOUND) then {
+ playSound BTC_FBSOUND;
+ };
+ };
+ },
+{}] call CBA_fnc_addKeybind;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/copy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/copy.sqf
new file mode 100644
index 0000000..0d4ede8
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/copy.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_copy
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _create_object_point - [Object]
+ _containers_mat - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_copy;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_create_object_point", objNull, [objNull]],
+ ["_containers_mat", btc_containers_mat, [objNull]]
+];
+
+private _objects = nearestObjects [_create_object_point, _containers_mat, 3];
+
+if (_objects isEqualTo []) exitWith {(localize "STR_BTC_HAM_O_COPY_NOCONTAINER") call CBA_fnc_notify};
+
+btc_int_ask_data = nil;
+[9, _objects select 0] remoteExecCall ["btc_int_fnc_ask_var", 2];
+
+[{!(isNil "btc_int_ask_data")}, {
+ if ("ACE_bodyBagObject" in flatten btc_int_ask_data) exitWith {
+ localize "STR_BTC_HAM_O_BODYBAG_COPY" call CBA_fnc_notify;
+ };
+
+ btc_copy_container = +btc_int_ask_data;
+
+ (localize "STR_BTC_HAM_O_COPY_SUCCSESS") call CBA_fnc_notify;
+}] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/create.sqf
new file mode 100644
index 0000000..c0e2c5f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/create.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_create
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _create_obj - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_create_obj", objNull, [objNull]]
+];
+
+closeDialog 0;
+
+btc_log_create_obj = _create_obj;
+if ([btc_log_create_obj] call btc_fnc_checkArea) exitWith {};
+
+disableSerialization;
+closeDialog 0;
+createDialog "btc_log_dlg_create";
+
+waitUntil {dialog};
+
+call btc_log_fnc_create_load;
+
+private _class = lbData [72, lbCurSel 72];
+private _selected = _class;
+private _new = _class createVehicleLocal getPosASL btc_log_create_obj;
+
+while {dialog} do {
+ if (_class != lbData [72, lbCurSel 72]) then {
+ deleteVehicle _new;
+ sleep 0.1;
+ _class = lbData [72, lbCurSel 72];
+ _selected = _class;
+ _new = _class createVehicleLocal getPosASL btc_log_create_obj;
+ _new setDir getDir btc_log_create_obj;
+ _new setPosASL getPosASL btc_log_create_obj;
+ };
+ sleep 0.1;
+};
+deleteVehicle _new;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/createVehicle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/createVehicle.sqf
new file mode 100644
index 0000000..5635f71
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/createVehicle.sqf
@@ -0,0 +1,85 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_createVehicle
+
+Description:
+ Creates an empty object of given classname type.
+
+Parameters:
+ _type - Vehicle className. [String]
+ _pos - Desired placement position. [Array]
+ _dir - Desired direction. [Number]
+ _customization - Customized appearance [Array]
+ _isMedicalVehicle - Set the ACE parameter is a medical vehicle. [Boolean]
+ _isRepairVehicle - Set the ACE parameter is a repair vehicle. [Boolean]
+ _fuelSource - Define the ACE cargo fuel source. [Array]
+ _pylons - Set pylon loadout. [Array]
+ _isContaminated - Set a vehicle contaminated. [Boolean]
+ _supplyVehicle - Is supply vehicle and current supply count. [Boolean]
+ _EDENinventory - Load EDEN inventory define in mission.sqm. [Array]
+ _allHitPointsDamage - Apply hit point damage to the vehicle. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _veh = ["vehicle_class_name", getPos player] call btc_log_fnc_createVehicle;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_type", "", [""]],
+ ["_pos", [0, 0, 0], [[]]],
+ ["_dir", 0, [0]],
+ ["_customization", [false, false], [[]]],
+ ["_isMedicalVehicle", false, [true]],
+ ["_isRepairVehicle", false, [true]],
+ ["_fuelSource", [], [[]]],
+ ["_pylons", [], [[]]],
+ ["_isContaminated", false, [false]],
+ ["_supplyVehicle", [], [[]]],
+ ["_objectTexture", [], [[]]],
+ ["_EDENinventory", [], [[]]],
+ ["_allHitPointsDamage", [], [[]]],
+ ["_flagTexture", "", [""]],
+ ["_tagTexture", "", [""]]
+];
+
+private _veh = createVehicle [_type, ASLToATL _pos, [], 0, "CAN_COLLIDE"];
+_veh setDir _dir;
+_veh setPosASL _pos;
+
+[_veh, _customization, _isMedicalVehicle, _isRepairVehicle, _fuelSource, _pylons, _isContaminated, _supplyVehicle, _objectTexture] call btc_veh_fnc_propertiesSet;
+if (_EDENinventory isNotEqualTo []) then {
+ _veh setVariable ["btc_EDENinventory", _EDENinventory];
+ [_veh, _EDENinventory] call btc_log_fnc_inventorySet;
+};
+
+if (unitIsUAV _veh) then {
+ createVehicleCrew _veh;
+};
+
+if (_allHitPointsDamage isNotEqualTo []) then {
+ {//Disable explosion effect on vehicle creation
+ [_veh, _forEachindex, _x, false] call ace_repair_fnc_setHitPointDamage;
+ } forEach (_allHitPointsDamage select 2);
+ if ((_allHitPointsDamage select 2) select {_x < 1} isEqualTo []) then {
+ _veh setDamage [1, false];
+ };
+};
+
+if (_flagTexture isNotEqualTo "") then {
+ _veh forceFlagTexture _flagTexture;
+};
+
+if (_tagTexture isNotEqualTo "") then {
+ [objNull, [], _tagTexture, _veh, objNull, "", "", true] call ace_tagging_fnc_createTag;
+};
+
+_veh call btc_veh_fnc_add;
+
+_veh
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/create_apply.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/create_apply.sqf
new file mode 100644
index 0000000..90e5a52
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/create_apply.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_create_apply
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _create_object_point - Helipad where to create the object. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_create_apply;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_create_object_point", btc_log_create_obj, [objNull]]
+];
+
+[{
+ params ["_class", "_create_object_point"];
+
+ if (_class isEqualTo btc_supplies_cargo) then {
+ btc_supplies_mat params ["_food", "_water"];
+ private _position_world = getPosWorld _create_object_point;
+ _position_world params ["_xx", "_yy", "_zz"];
+ [[
+ btc_supplies_cargo,
+ [_xx, _yy, _zz + 1.5], getDir _create_object_point,
+ "",
+ [selectRandom _food, selectRandom _water] apply {[_x, "", []]},
+ [],
+ [vectorDir _create_object_point, vectorUp _create_object_point]
+ ]] remoteExecCall ["btc_db_fnc_loadObjectStatus", 2];
+ } else {
+ [_class, getPosASL _create_object_point] remoteExecCall ["btc_log_fnc_create_s", 2];
+ };
+}, [lbData [72, lbCurSel 72], _create_object_point], 0.2] call CBA_fnc_waitAndExecute;
+
+closeDialog 0;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/create_change_target.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/create_change_target.sqf
new file mode 100644
index 0000000..c9257ae
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/create_change_target.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_create_change_target
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _main_class - []
+ _sub_class - []
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_create_change_target;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+private _var = lbText [71, lbCurSel 71];
+btc_construction_array params ["_main_class", "_sub_class"];
+private _id = _main_class find _var;
+private _category = _sub_class select _id;
+lbClear 72;
+for "_i" from 0 to ((count _category) - 1) do {
+ private _class = _category select _i;
+ private _display = getText (configFile >> "cfgVehicles" >> _class >> "displayName");
+
+ private _index = lbAdd [72, _display];
+ lbSetData [72, _index, _class];
+ if (_i isEqualTo 0) then {lbSetCurSel [72, _index];};
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/create_load.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/create_load.sqf
new file mode 100644
index 0000000..e7d5b21
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/create_load.sqf
@@ -0,0 +1,43 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_create_load
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _main_class - []
+ _sub_class - []
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_create_load;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+lbClear 71;
+btc_construction_array params ["_main_class", "_sub_class"];
+for "_i" from 0 to ((count _main_class) - 1) do {
+ private _lb = lbAdd [71, _main_class select _i];
+ if (_i isEqualTo 0) then {
+ lbSetCurSel [71, _lb];
+ };
+};
+private _category = _sub_class select 0;
+lbClear 72;
+for "_i" from 0 to ((count _category) - 1) do {
+ private _class = _category select _i;
+ private _display = getText (configFile >> "cfgVehicles" >> _class >> "displayName");
+ private _index = lbAdd [72, _display];
+ lbSetData [72, _index, _class];
+ if (_i isEqualTo 0) then {
+ lbSetCurSel [72, _index];
+ };
+};
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/create_s.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/create_s.sqf
new file mode 100644
index 0000000..e2666f9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/create_s.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_create_s
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _objec_type - [String]
+ _pos - [Array]
+ _vector - [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_create_s;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_objec_type", "", [""]],
+ ["_pos", getPosASL btc_create_object_point, [[]]],
+ ["_vector", vectorUp btc_create_object_point, [[]]]
+];
+
+private _obj = _objec_type createVehicle [0, 0, 0];
+_obj setVectorUp _vector;
+_obj setPosASL _pos;
+
+if (unitIsUAV _obj) then {
+ createVehicleCrew _obj;
+};
+
+[_obj] call btc_log_fnc_init;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/delete.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/delete.sqf
new file mode 100644
index 0000000..5ac11eb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/delete.sqf
@@ -0,0 +1,41 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_delete
+
+Description:
+ Delete object created by logistic point.
+
+Parameters:
+ _object - Helipad where the object to delete is. [Object]
+ _blackList - Object can't be deleted. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_create_object_point] call btc_log_fnc_delete;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]],
+ ["_blackList", [btc_create_object], [[]]]
+];
+
+private _array = ((nearestObjects [_object, flatten (btc_construction_array select 1), 6]) select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)}) - _blackList;
+
+if (_array isEqualTo []) exitWith {
+ [
+ [localize "STR_BTC_HAM_LOG_DELETE"],
+ ["
"]
+ ] call CBA_fnc_notify;
+};
+
+[_array select 0] remoteExecCall ["btc_log_fnc_server_delete", [2]];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/dlg.hpp b/hearts_and_minds.kunduz_valley/core/fnc/log/dlg.hpp
new file mode 100644
index 0000000..df1ca55
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/dlg.hpp
@@ -0,0 +1,40 @@
+class btc_log_dlg_create {
+ idd = -1;
+ movingEnable = 1;
+ onLoad = "";
+ objects[] = {};
+ class controlsBackground {};
+ class controls {
+ class btc_log_dlg_Apply : btc_dlg_button {
+ idc = -1;
+ text = $STR_ui_debug_but_apply; //Apply
+ action = "[] call btc_log_fnc_create_apply";
+ x = 0 * safezoneW + safezoneX;
+ y = 0.25 * safezoneH + safezoneY;
+ default = true;
+ };
+ class btc_log_dlg_Close : btc_dlg_button {
+ idc = -1;
+ text = $STR_ACE_Arsenal_buttonCloseText; //Close
+ action = "closeDialog 0;";
+ x = 0.2 * safezoneW + safezoneX;
+ y = 0.25 * safezoneH + safezoneY;
+ default = true;
+ };
+ class btc_log_dlg_main_class : btc_dlg_comboBox {
+ idc = 71;
+ onLBSelChanged = "[] call btc_log_fnc_create_change_target";
+ x = 0 * safezoneW + safezoneX;
+ y = 0 * safezoneH + safezoneY;
+ w = 0.4 * safezoneW;
+ h = 0.055 * safezoneH;
+ };
+ class btc_log_dlg_sub_class : btc_dlg_comboBox {
+ idc = 72;
+ x = 0 * safezoneW + safezoneX;
+ y = 0.1 * safezoneH + safezoneY;
+ w = 0.4 * safezoneW;
+ h = 0.055 * safezoneH;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/get_corner_points.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/get_corner_points.sqf
new file mode 100644
index 0000000..98cfb73
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/get_corner_points.sqf
@@ -0,0 +1,112 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_get_corner_points
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _vehicle - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [cursorObject] call btc_log_fnc_get_corner_points;
+ (end)
+
+Author:
+ sethduda
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]]
+];
+
+// Correct width and length factor for air
+private _widthFactor = 0.75;
+private _lengthFactor = 0.75;
+if (_vehicle isKindOf "Air") then {
+ _widthFactor = 0.3;
+};
+if (_vehicle isKindOf "Helicopter") then {
+ _widthFactor = 0.2;
+ _lengthFactor = 0.45;
+};
+
+(getCenterOfMass _vehicle) params ["_centerOfMass_x", "_centerOfMass_y", "_centerOfMass_z"];
+(boundingBoxReal _vehicle) params ["_p1", "_p2"];
+([0, 1] apply {abs ((_p2 select _x) - (_p1 select _x))}) params ["_maxWidth", "_maxLength"];
+(0 boundingBoxReal _vehicle) params ["_p1", "_p2"];
+
+private _widthOffset = ((_maxWidth / 2) - abs _centerOfMass_x) * _widthFactor;
+private _lengthOffset = ((_maxLength / 2) - abs _centerOfMass_y) * _lengthFactor;
+private _rearCorner = [_centerOfMass_x + _widthOffset, _p1 select 1, _centerOfMass_z];
+private _rearCorner2 = [_centerOfMass_x - _widthOffset, _p1 select 1, _centerOfMass_z];
+private _frontCorner = [_centerOfMass_x + _widthOffset, _centerOfMass_y + _lengthOffset, _centerOfMass_z];
+private _frontCorner2 = [_centerOfMass_x - _widthOffset, _centerOfMass_y + _lengthOffset, _centerOfMass_z];
+
+if (btc_debug) then {
+ _vehicle call {
+ private ["_obj","_bb","_bbx","_bby","_bbz","_arr","_y","_z"];
+ _obj = _this;
+ _bb = {
+ _bbx = [_this select 0 select 0, _this select 1 select 0];
+ _bby = [_this select 0 select 1, _this select 1 select 1];
+ _bbz = [_this select 0 select 2, _this select 1 select 2];
+ _arr = [];
+ 0 = {
+ _y = _x;
+ 0 = {
+ _z = _x;
+ 0 = {
+ 0 = _arr pushBack (_obj modelToWorld [_x,_y,_z]);
+ } count _bbx;
+ } count _bbz;
+ reverse _bbz;
+ } count _bby;
+ _arr pushBack (_arr select 0);
+ _arr pushBack (_arr select 1);
+ _arr
+ };
+ bbox = 0 boundingBoxReal _obj call _bb;
+ bboxr = [_rearCorner, _frontCorner2] call _bb;
+ addMissionEventHandler ["Draw3D", {
+ for "_i" from 0 to 7 step 2 do {
+ drawLine3D [
+ bbox select _i,
+ bbox select (_i + 2),
+ [0,0,1,1]
+ ];
+ drawLine3D [
+ bboxr select _i,
+ bboxr select (_i + 2),
+ [0,1,0,1]
+ ];
+ drawLine3D [
+ bbox select (_i + 2),
+ bbox select (_i + 3),
+ [0,0,1,1]
+ ];
+ drawLine3D [
+ bboxr select (_i + 2),
+ bboxr select (_i + 3),
+ [0,1,0,1]
+ ];
+ drawLine3D [
+ bbox select (_i + 3),
+ bbox select (_i + 1),
+ [0,0,1,1]
+ ];
+ drawLine3D [
+ bboxr select (_i + 3),
+ bboxr select (_i + 1),
+ [0,1,0,1]
+ ];
+ };
+ }];
+ };
+};
+
+[_rearCorner, _rearCorner2, _frontCorner, _frontCorner2];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/init.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/init.sqf
new file mode 100644
index 0000000..1d57678
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/init.sqf
@@ -0,0 +1,52 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_init
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _obj - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_init;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_obj", objNull, [objNull]]
+];
+
+if (btc_log_obj_created pushBackUnique _obj isEqualTo -1) exitWith {};
+{
+ _x addCuratorEditableObjects [[_obj], false];
+} forEach allCurators;
+
+private _type = typeOf _obj;
+if (
+ _type in btc_log_def_loadable &&
+ {getNumber (configOf _obj >> "ace_cargo_canLoad") isEqualTo 0}
+) then {
+ [_obj, round ((sizeOf _type)/1.3)] call ace_cargo_fnc_setSize;
+};
+
+if (
+ _type in btc_log_def_can_load &&
+ {getNumber (configOf _obj >> "ace_cargo_hasCargo") isEqualTo 0}
+) then {
+ [_obj, round ((sizeOf _type)/1.3)] call ace_cargo_fnc_setSpace;
+};
+
+if (isNil {_obj getVariable "btc_EDEN_defaultFuelCargo"}) then {
+ _obj setVariable ["btc_EDEN_defaultFuelCargo", _obj call ace_refuel_fnc_getFuel, true];
+};
+if (isNil {_obj getVariable "btc_EDEN_defaultSupply"}) then {
+ _obj setVariable ["btc_EDEN_defaultSupply", _obj call ace_rearm_fnc_getSupplyCount, true];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryCopy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryCopy.sqf
new file mode 100644
index 0000000..d571dd5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryCopy.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_inventoryCopy
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _searchLocation - Object to search around. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_inventoryCopy;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_searchLocation", objNull, [objNull]]
+];
+
+private _objects = nearestObjects [_searchLocation, ["AllVehicles", "ThingX"], 3];
+
+if (_objects isEqualTo []) exitWith {(localize "STR_BTC_HAM_O_COPY_NOOBJECTS") call CBA_fnc_notify};
+
+btc_copy_inventory = [_objects select 0] call btc_log_fnc_inventoryGet;
+
+(localize "str_mission_completed") call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryGet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryGet.sqf
new file mode 100644
index 0000000..dccc46d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryGet.sqf
@@ -0,0 +1,104 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_inventoryGet
+
+Description:
+ Get inventory of an object.
+
+Parameters:
+ _object - Object with inventory. [Object, String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_log_fnc_inventoryGet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull, ""]]
+];
+
+private _inventory = [];
+if (_object isEqualType objNull) then {
+ private _everyContainer = everyContainer _object;
+ {
+ _x set [1, (_x select 1) call btc_log_fnc_inventoryGet];
+ } forEach _everyContainer;
+
+ private _weaponsItemsCargo = weaponsItemsCargo _object;
+ {
+ private _magazine = _x select 4 select 0;
+ if (((_magazine call BIS_fnc_itemType) select 1) isEqualTo "UnknownMagazine") then {
+ _x set [4, []]; // Remove dummy magazine
+ };
+ } forEach _weaponsItemsCargo;
+
+ _inventory = [
+ getMagazineCargo _object,
+ _weaponsItemsCargo,
+ itemCargo _object,
+ _everyContainer
+ ]
+} else {
+ private _cfgVehicles = configFile >> "CfgVehicles" >> _object;
+ private _cfgs = "true" configClasses (_cfgVehicles >> "TransportMagazines");
+ private _magazine = _cfgs apply {
+ getText (_x >> "magazine")
+ };
+ private _numberOfItems = _cfgs apply {
+ getNumber (_x >> "count")
+ };
+ _inventory pushBack [_magazine, _numberOfItems];
+
+ private _cfgs = "true" configClasses (_cfgVehicles >> "TransportWeapons");
+ private _weapons = _cfgs apply {
+ getText (_x >> "weapon")
+ };
+ private _numberOfItems = _cfgs apply {
+ getNumber (_x >> "count")
+ };
+ private _itemCargo = [];
+ {
+ for "_i" from 0 to (_x -1) do {
+ _itemCargo pushBack [_weapons select _forEachindex,"","","",[],[],""];
+ };
+ } forEach _numberOfItems;
+ _inventory pushBack _itemCargo;
+
+ private _cfgs = "true" configClasses (_cfgVehicles >> "TransportItems");
+ private _items = _cfgs apply {
+ getText (_x >> "name")
+ };
+ private _numberOfItems = _cfgs apply {
+ getNumber (_x >> "count")
+ };
+ private _itemCargo = [];
+ {
+ for "_i" from 0 to (_x -1) do {
+ _itemCargo pushBack (_items select _forEachindex);
+ };
+ } forEach _numberOfItems;
+ _inventory pushBack _itemCargo;
+
+ private _cfgs = "true" configClasses (_cfgVehicles >> "TransportBackpacks");
+ private _backpacks = _cfgs apply {
+ getText (_x >> "backpack")
+ };
+ private _numberOfItems = _cfgs apply {
+ getNumber (_x >> "count")
+ };
+ {
+ for "_i" from 0 to (_x -1) do {
+ _itemCargo pushBack [_backpacks select _forEachindex];
+ };
+ } forEach _numberOfItems;
+ _inventory pushBack _backpacks;
+};
+
+_inventory
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryPaste.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryPaste.sqf
new file mode 100644
index 0000000..bae9e83
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryPaste.sqf
@@ -0,0 +1,39 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_inventoryPaste
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _copy_container - [Array]
+ _searchLocation - Object to search around. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_inventoryPaste;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_inventory", [], [[]]],
+ ["_searchLocation", objNull, [objNull]]
+];
+
+private _objects = nearestObjects [_searchLocation, ["AllVehicles", "ThingX"], 3];
+
+if (
+ isNil "_inventory" ||
+ {flatten _inventory isEqualTo []}
+) exitWith {(localize "STR_BTC_HAM_O_PASTE_NOCOPIEDI") call CBA_fnc_notify};
+if (_objects isEqualTo []) exitWith {(localize "STR_BTC_HAM_O_COPY_NOOBJECTS") call CBA_fnc_notify};
+
+[_objects select 0, _inventory] call btc_log_fnc_inventorySet;
+
+(localize "str_mission_completed") call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryRestore.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryRestore.sqf
new file mode 100644
index 0000000..a625168
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/inventoryRestore.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_inventoryRestore
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _searchLocation - Object to search around. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_inventoryRestore;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_searchLocation", objNull, [objNull]]
+];
+
+private _objects = nearestObjects [_searchLocation, ["AllVehicles", "ThingX"], 3];
+
+if (_objects isEqualTo []) exitWith {(localize "STR_BTC_HAM_O_COPY_NOOBJECTS") call CBA_fnc_notify};
+
+(_objects select 0) remoteExecCall ["btc_veh_fnc_inventoryRestore", 2];
+
+(localize "str_mission_completed") call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/inventorySet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/inventorySet.sqf
new file mode 100644
index 0000000..69e6e77
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/inventorySet.sqf
@@ -0,0 +1,68 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_inventorySet
+
+Description:
+ Set inventory of an object.
+
+Parameters:
+ _object - Object with inventory. [Object]
+ _inventory - Inventory to set. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, [cursorObject] call btc_log_fnc_inventoryGet] call btc_log_fnc_inventorySet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]],
+ ["_inventory", [], [[]]]
+];
+
+clearWeaponCargoGlobal _object;
+clearItemCargoGlobal _object;
+clearMagazineCargoGlobal _object;
+clearBackpackCargoGlobal _object;
+
+_inventory params [
+ ["_magazines", [], [[]]],
+ ["_weapons", [], [[]]],
+ ["_items", [], [[]]],
+ ["_everyContainer", [], [[]]]
+];
+
+{
+ if (load _object > 1) exitWith {};
+ _object addMagazineCargoGlobal [_x, (_magazines select 1) select _forEachIndex];
+} forEach (_magazines select 0);
+
+{
+ if (load _object > 1) exitWith {};
+ _object addWeaponWithAttachmentsCargoGlobal [_x, 1];
+} forEach _weapons;
+
+{
+ if (load _object > 1) exitWith {};
+ private _containerType = _x select 0;
+ if (_containerType in _items) then {
+ _object addItemCargoGlobal [_containerType, 1];
+ _items deleteAt (_items find _containerType);
+ } else {
+ _object addBackpackCargoGlobal [_containerType, 1];
+ };
+
+ private _newContainer = everyContainer _object;
+ [(_newContainer select (count _newContainer -1)) select 1, _x select 1] call btc_log_fnc_inventorySet;
+} forEach _everyContainer;
+
+{
+ if (load _object > 1) exitWith {};
+ _object addItemCargoGlobal [_x, 1];
+} forEach _items;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/paste.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/paste.sqf
new file mode 100644
index 0000000..7cd393c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/paste.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_paste
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _copy_container - [Array]
+ _create_object_point - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_paste;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_copy_container", [], [[]]],
+ ["_create_object_point", objNull, [objNull]]
+];
+
+if ([_create_object_point] call btc_fnc_checkArea) exitWith {};
+
+if (isNil "_copy_container") exitWith {(localize "STR_BTC_HAM_O_PASTE_NOCOPIED") call CBA_fnc_notify};
+
+[_copy_container] remoteExecCall ["btc_db_fnc_loadObjectStatus", 2];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/place.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/place.sqf
new file mode 100644
index 0000000..25b78a1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/place.sqf
@@ -0,0 +1,100 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_place
+
+Description:
+ Carry and place an object with keys.
+
+Parameters:
+ _placing_obj - Object to place. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_log_fnc_place;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_placing_obj", objNull, [objNull]]
+];
+
+btc_log_placing_obj = _placing_obj;
+
+[btc_log_placing_obj, clientOwner] remoteExecCall ["setOwner", 2];
+
+hint composeText [
+ localize "STR_BTC_HAM_LOG_PLACE_HINT1", //Q/Z to raise/lower the object
+ lineBreak,
+ localize "STR_BTC_HAM_LOG_PLACE_HINT2", //X/C to rotate the object
+ lineBreak,
+ localize "STR_BTC_HAM_LOG_PLACE_HINT3", //F/R to tilt the object
+ lineBreak,
+ localize "STR_BTC_HAM_LOG_PLACE_HINT4" //SHIFT to increase the movement
+];
+
+btc_log_placing = true;
+btc_log_placing_dir = 180;
+btc_log_rotating_dir = 0;
+btc_log_ptich_dir = 0;
+
+//add action ACE
+private _actionEH = [player, "DefaultAction", {true}, {btc_log_placing = false;}] call ace_common_fnc_addActionEventHandler;
+
+//show mouse hint for release
+[localize "STR_BTC_HAM_LOG_PLACE_RELEASE", ""] call ace_interaction_fnc_showMouseHint;
+
+//add actions to keys
+private _place_EH_keydown = (findDisplay 46) displayAddEventHandler ["KeyDown", btc_log_fnc_place_key_down];
+
+[player] call ace_weaponselect_fnc_putWeaponAway;
+player forceWalk true;
+
+[btc_log_placing_obj, false] remoteExecCall ["enableSimulationGlobal", 2];
+
+private _bbr = 0 boundingBoxReal btc_log_placing_obj;
+
+btc_log_placing_h = (btc_log_placing_obj modelToWorldVisual [0, 0, 0] select 2) - (player modelToWorldVisual [0, 0, 0] select 2);
+btc_log_placing_d = 1.5 + abs(((_bbr select 1) select 1) - ((_bbr select 0) select 1));
+
+[{local _this}, {
+ _this attachTo [player, [0, btc_log_placing_d, btc_log_placing_h]];
+ _this setDir btc_log_placing_dir;
+}, btc_log_placing_obj] call CBA_fnc_waitUntilAndExecute;
+
+[{
+ params ["_arguments", "_idPFH"];
+
+ if (!alive player || player getVariable ["ACE_isUnconscious", false] || !btc_log_placing || (vehicle player != player)) then {
+ _arguments params ["_placing_obj", "_actionEH", "_place_EH_keydown"];
+
+ ["ace_common_fixCollision", player] call CBA_fnc_localEvent;
+ ["ace_common_fixCollision", btc_log_placing_obj, btc_log_placing_obj] call CBA_fnc_targetEvent;
+
+ //remove PFH
+ [_idPFH] call CBA_fnc_removePerFrameHandler;
+
+ [_placing_obj, true] remoteExecCall ["enableSimulationGlobal", 2];
+ detach _placing_obj;
+
+ player forceWalk false;
+
+ btc_log_placing_obj = objNull;
+ (findDisplay 46) displayRemoveEventHandler ["KeyDown", _place_EH_keydown];
+
+ hintSilent "";
+
+ //remove mouse hint
+ call ace_interaction_fnc_hideMouseHint;
+
+ // remove drop action
+ [player, "DefaultAction", _actionEH, -1] call ace_common_fnc_removeActionEventHandler;
+
+ btc_log_placing = false; // reset flag
+ };
+}, 0.5, [_placing_obj, _actionEH, _place_EH_keydown]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/place_create_camera.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/place_create_camera.sqf
new file mode 100644
index 0000000..8816911
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/place_create_camera.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_place_create_camera
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _terminal - [Object]
+ _campos - [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_place_create_camera;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_terminal", objNull, [objNull]],
+ ["_campos", [0, 0, 0], [[]]]
+];
+
+_terminal setObjectTexture [0, "#(argb,512,512,1)r2t(uavrtt,1)"];
+
+/* create camera and stream to render surface */
+private _cam = "camera" camCreate _campos;
+_cam cameraEffect ["Internal", "Back", "uavrtt"];
+
+private _y = -180;
+private _p = 50;
+private _r = 0;
+_cam setVectorDirAndUp [
+ [ sin _y * cos _p, cos _y * cos _p, sin _p],
+ [[ sin _r,-sin _p, cos _r * cos _p], -_y] call BIS_fnc_rotateVector2D
+];
+
+btc_log_place_camera = _cam;
+btc_log_place_camera_created = true;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/place_destroy_camera.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/place_destroy_camera.sqf
new file mode 100644
index 0000000..88fa186
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/place_destroy_camera.sqf
@@ -0,0 +1,27 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_place_destroy_camera
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_place_destroy_camera;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+player cameraEffect ["TERMINATE", "BACK"];
+camDestroy btc_log_place_camera;
+btc_log_place_camera = objNull;
+btc_log_place_camera_cond = false;
+btc_log_place_camera_created = false;
+btc_log_place_camera_nvg = false;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/place_key_down.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/place_key_down.sqf
new file mode 100644
index 0000000..7ee7dc1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/place_key_down.sqf
@@ -0,0 +1,113 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_place_key_down
+
+Description:
+ https://community.bistudio.com/wiki/DIK_KeyCodes
+
+Parameters:
+ _display - [Display]
+ _key - [Number]
+ _shift - [Boolean]
+ _ctrl - [Boolean]
+ _alt - [Boolean]
+ _keyPressed - [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_place_key_down;
+ (end)
+
+Author:
+ 1kuemmel1
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_display", displayNull, [displayNull]],
+ ["_key", 16, [0]],
+ ["_shift", false, [false]],
+ ["_ctrl", false, [false]],
+ ["_alt", false, [false]],
+ ["_keyPressed", false, [false]]
+];
+
+if !(btc_log_placing) exitWith {};
+
+private _turbo = if (_shift) then {1} else {0};
+
+//height [+] (Key 16: Q)
+if (_key isEqualTo 16) then {
+ //check for max height
+ if !(btc_log_placing_h > btc_log_placing_max_h) then {
+ //increase height
+ btc_log_placing_h = btc_log_placing_h + 0.1 + _turbo/2;
+ //placing
+ btc_log_placing_obj attachTo [player, [0, btc_log_placing_d, btc_log_placing_h]];
+ };
+ //set var
+ _keyPressed = true;
+};
+//height [-] (Key 44: Z*) (*German keyboard: Y)
+if (_key isEqualTo 44) then {
+ //check for min height
+ if !(btc_log_placing_h < - 2) then {
+ //decrease heigth
+ btc_log_placing_h = btc_log_placing_h - 0.1 - _turbo/2;
+ //placing
+ btc_log_placing_obj attachTo [player, [0, btc_log_placing_d, btc_log_placing_h]];
+ };
+ //set var
+ _keyPressed = true;
+};
+//yaw [+] (Key 45: X)
+if (_key isEqualTo 45) then {
+ //rotating clockwise
+ btc_log_placing_dir = btc_log_placing_dir + 0.5 + _turbo;
+ //set var
+ _keyPressed = true;
+};
+//yaw [-] (Key 46: C)
+if (_key isEqualTo 46) then {
+ //rotating counterclockwise
+ btc_log_placing_dir = btc_log_placing_dir - 0.5 - _turbo;
+ //set var
+ _keyPressed = true;
+};
+//roll [+] (Key 33: F)
+if (_key isEqualTo 33) then {
+ //tilting clockwise
+ btc_log_rotating_dir = btc_log_rotating_dir + 0.5 + _turbo;
+ //set var
+ _keyPressed = true;
+};
+//roll [-] (Key 19: R)
+if (_key isEqualTo 19) then {
+ //tilting counterclockwise
+ btc_log_rotating_dir = btc_log_rotating_dir - 0.5 - _turbo;
+ //set var
+ _keyPressed = true;
+};
+
+//set object position (rotation and tilting)
+if (_keyPressed) then {
+ btc_log_placing_obj setVectorDirAndUp [
+ [
+ (sin btc_log_placing_dir) * (cos btc_log_ptich_dir),
+ (cos btc_log_placing_dir) * (cos btc_log_ptich_dir),
+ (sin btc_log_ptich_dir)
+ ],
+ [
+ [
+ sin btc_log_rotating_dir,
+ -sin btc_log_ptich_dir,
+ cos btc_log_rotating_dir * cos btc_log_ptich_dir
+ ],
+ -btc_log_placing_dir
+ ] call BIS_fnc_rotateVector2D
+ ];
+};
+
+_keyPressed
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/rearmSource.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/rearmSource.sqf
new file mode 100644
index 0000000..1a59385
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/rearmSource.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_rearmSource
+
+Description:
+ Rearm a rearm source.
+
+Parameters:
+ _object - Rearm truck. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_log_fnc_rearmSource;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]]
+];
+
+private _array = (nearestObjects [_object, ["LandVehicle", "Air", "Ship", "Thing"], 10]) select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+
+private _failNotify = [
+ [localize "STR_ACE_Refuel_Failed"],
+ ["
"]
+];
+if (_array isEqualTo []) exitWith {_failNotify call CBA_fnc_notify;};
+
+private _rearmSource = _array select 0;
+private _default_rearmCargo = _rearmSource getVariable ["btc_EDEN_defaultSupply", _rearmSource call ace_rearm_fnc_getSupplyCount];
+
+if (_default_rearmCargo <= 0) exitWith {_failNotify call CBA_fnc_notify;};
+
+[_rearmSource, _default_rearmCargo] remoteExecCall ["ace_rearm_fnc_makeSource", 2];
+(localize "STR_BTC_HAM_LOG_REARM_COMPLETED") call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/refuelSource.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/refuelSource.sqf
new file mode 100644
index 0000000..d249c30
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/refuelSource.sqf
@@ -0,0 +1,44 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_refuelSource
+
+Description:
+ Refuel a fuel source.
+
+Parameters:
+ _object - Fuel truck. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_log_fnc_refuelSource;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]]
+];
+
+private _array = (nearestObjects [_object, ["LandVehicle", "Air", "Ship", "Thing"], 10]) select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+
+private _failNotify = [
+ [localize "STR_ACE_Refuel_Failed"],
+ ["
"]
+];
+if (_array isEqualTo []) exitWith {_failNotify call CBA_fnc_notify;};
+
+private _fuelSource = _array select 0;
+private _default_fuelCargo = _fuelSource getVariable ["btc_EDEN_defaultFuelCargo", _fuelSource call ace_refuel_fnc_getFuel];
+
+if (_default_fuelCargo <= 0) exitWith {_failNotify call CBA_fnc_notify;};
+
+[_fuelSource, _default_fuelCargo] call ace_refuel_fnc_setFuel;
+(localize "STR_ACE_Refuel_Hint_Completed") call CBA_fnc_notify;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/repair_wreck.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/repair_wreck.sqf
new file mode 100644
index 0000000..ba75bd3
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/repair_wreck.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_repair_wreck
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _object - [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_log_fnc_repair_wreck;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]]
+];
+
+private _array = (nearestObjects [_object, ["LandVehicle", "Air", "Ship"], 10]) select {!(
+ _x isKindOf "ACE_friesBase" OR
+ _x isKindOf "ace_fastroping_helper"
+)};
+
+if (_array isEqualTo []) exitWith {(localize "STR_BTC_HAM_LOG_RWRECK_NOWRECK") call CBA_fnc_notify;};
+
+if (damage (_array select 0) != 1) exitWith {(localize "STR_BTC_HAM_LOG_RWRECK_NOTWRECK") call CBA_fnc_notify};
+
+[_array select 0] remoteExecCall ["btc_log_fnc_server_repair_wreck", 2];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/server_delete.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/server_delete.sqf
new file mode 100644
index 0000000..2e5dca2
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/server_delete.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_server_delete
+
+Description:
+ Delete object created by logistic point.
+
+Parameters:
+ _veh - Object to delete. [Object]
+ _allowlist - Item can be deleted. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_log_fnc_server_delete;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]],
+ ["_allowlist", btc_log_obj_created, [[]]]
+];
+
+if !(_veh in _allowlist) exitWith {
+ [17] remoteExecCall ["btc_fnc_show_hint", remoteExecutedOwner];
+};
+
+[_veh getVariable ["ace_cargo_loaded", []], _allowlist deleteAt (_allowlist find _veh)] call CBA_fnc_deleteEntity;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/log/server_repair_wreck.sqf b/hearts_and_minds.kunduz_valley/core/fnc/log/server_repair_wreck.sqf
new file mode 100644
index 0000000..980d7f6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/log/server_repair_wreck.sqf
@@ -0,0 +1,65 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_log_fnc_server_repair_wreck
+
+Description:
+ Repair wreck.
+
+Parameters:
+ _veh - Vehicle to repair. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _veh = [my_vehicle] spawn btc_log_fnc_server_repair_wreck;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]],
+ ["_blacklist", btc_veh_respawnable, [[]]]
+];
+
+if (_veh in _blacklist) exitWith {
+ [16] remoteExecCall ["btc_fnc_show_hint", remoteExecutedOwner];
+};
+
+private _type = typeOf _veh;
+(getPosASL _veh) params ["_x", "_y", "_z"];
+private _dir = getDir _veh;
+private _marker = _veh getVariable ["marker", ""];
+private _vehProperties = _veh call btc_veh_fnc_propertiesGet;
+
+// Reset properties
+_vehProperties set [5, false];
+(_vehProperties select 3) set [0, _veh getVariable "btc_EDEN_defaultFuelCargo"];
+(_vehProperties select 6) set [1, _veh getVariable "btc_EDEN_defaultSupply"];
+
+private _EDENinventory = _veh getVariable ["btc_EDENinventory", []];
+
+btc_vehicles = btc_vehicles - [_veh];
+
+if (_marker != "") then {
+ deleteMarker _marker;
+ remoteExecCall ["", _marker];
+};
+
+if ((getVehicleCargo _veh) isNotEqualTo []) then {
+ _veh setVehicleCargo objNull;
+};
+
+{
+ _x call btc_body_fnc_bagRecover_s;
+} forEach crew _veh;
+
+[{
+ deleteVehicle _this;
+}, _veh] call CBA_fnc_execNextFrame;
+
+private _serialisedVeh = [_type, [_x, _y, 0.5 + _z], _dir] + _vehProperties + [_EDENinventory];
+[btc_log_fnc_createVehicle, _serialisedVeh, 1] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/addWP.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/addWP.sqf
new file mode 100644
index 0000000..8458a0f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/addWP.sqf
@@ -0,0 +1,66 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_addWP
+
+Description:
+ Add waypoint to already created units.
+
+Parameters:
+ _group - Group of enemies. [Group]
+ _city - City to patrol around. [Object]
+ _area - Area to patrol around. [Number]
+ _wp - Type of wp: in "HOUSE", "PATROL" or "SENTRY". [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [group cursorObject, btc_city_all get 0, 200] call btc_mil_fnc_addWP;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_city", objNull, [objNull]],
+ ["_area", 0, [0]],
+ ["_wp", "PATROL", [""]]
+];
+
+private _pos = position _city;
+private _rpos = [_pos, _area] call btc_fnc_randomize_pos;
+
+switch (_wp) do {
+ case ("HOUSE") : {
+ private _houses = ([_city, _area] call btc_fnc_getHouses) select 0;
+ if (_houses isNotEqualTo []) then {
+ private _house = selectRandom _houses;
+ [_group, _house] call btc_fnc_house_addWP;
+ _group setVariable ["btc_inHouse", typeOf _house];
+ } else {
+ [
+ _group, _rpos,
+ _area, 2 + floor (random 4), "MOVE", "SAFE", "RED",
+ ["LIMITED", "NORMAL"] select ((vehicle leader _group) isKindOf "Air"),
+ "STAG COLUMN", "", [5, 10, 20]
+ ] remoteExecCall ["CBA_fnc_taskPatrol", groupOwner _group];
+ };
+ };
+ case ("PATROL") : {
+ [
+ _group, _rpos,
+ _area, 2 + floor (random 4), "MOVE", "AWARE", "RED",
+ ["LIMITED", "NORMAL"] select ((vehicle leader _group) isKindOf "Air"),
+ "STAG COLUMN", "", [5, 10, 20]
+ ] remoteExecCall ["CBA_fnc_taskPatrol", groupOwner _group];
+ };
+ case ("SENTRY") : {
+ [_group] call CBA_fnc_clearWaypoints;
+ [_group, _rpos, -1, "SENTRY", "AWARE", "RED", "UNCHANGED", "WEDGE", "(group this) call btc_data_fnc_add_group;", [18000, 36000, 54000]] call CBA_fnc_addWaypoint;
+ };
+};
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/aiskill.hpp b/hearts_and_minds.kunduz_valley/core/fnc/mil/aiskill.hpp
new file mode 100644
index 0000000..e6a6d19
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/aiskill.hpp
@@ -0,0 +1,12 @@
+class CfgAISkill {
+ aimingAccuracy[] = {0, 0, 1, 1};
+ aimingShake[] = {0, 0, 1, 1};
+ aimingSpeed[] = {0, 0, 1, 1};
+ commanding[] = {0, 0, 1, 1};
+ courage[] = {0, 0, 1, 1};
+ endurance[] = {0, 0, 1, 1};
+ general[] = {0, 0, 1, 1};
+ reloadSpeed[] = {0, 0, 1, 1};
+ spotDistance[] = {0, 0, 1, 1};
+ spotTime[] = {0, 0, 1, 1};
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/ammoUsage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/ammoUsage.sqf
new file mode 100644
index 0000000..b1a63c1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/ammoUsage.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_ammoUsage
+
+Description:
+ Check if a type of unit use a certain type of ammo base on item type and aiAmmoUsageFlags (Tells the AI how to use this Ammo.).
+
+Parameters:
+ _typeOf_unit - Type of unit. [String]
+ _itemType_ammo_usageAllowed - Array of item type and aiAmmoUsageFlags. [Array]
+
+Returns:
+ _bool - True if unit use this type of weapon or ammo. [Boolean]
+
+Examples:
+ (begin example)
+ [typeOf player, ["AssaultRifle"]] call btc_mil_fnc_ammoUsage;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_typeOf_unit", "", [""]],
+ ["_itemType_ammo_usageAllowed", ["MissileLauncher", "256"], [[]]]
+];
+
+private _weapons = getArray (configFile >> "CfgVehicles" >> _typeOf_unit >> "weapons");
+private _weapons_ammoUsage = [_weapons, _itemType_ammo_usageAllowed] call btc_arsenal_fnc_ammoUsage;
+
+if (btc_debug_log) then {
+ [format ["%1 Weapons: %2 isAmmoUsage: %3", _typeOf_unit, _weapons, _weapons_ammoUsage], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_weapons_ammoUsage isNotEqualTo []
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/check_cap.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/check_cap.sqf
new file mode 100644
index 0000000..6a9b078
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/check_cap.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_check_cap
+
+Description:
+ Capture city around with a time cooler.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_mil_fnc_check_cap;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+private _cap_to = btc_hideouts select {
+ time - (_x getVariable ["cap_time", time]) > btc_hideout_cap_time
+};
+if (_cap_to isEqualTo []) exitWith {};
+
+{
+ private _hideout = _x;
+ private _city_inRange = values btc_city_all inAreaArray [getPosWorld _hideout, btc_hideout_range, btc_hideout_range];
+ if (_city_inRange isEqualTo []) then {continue};
+
+ private _closest = [_hideout, _city_inRange, true] call btc_fnc_find_closecity;
+ if (_closest isEqualTo []) then {continue};
+
+ _hideout setVariable ["cap_time", time];
+
+ if (_closest getVariable ["initialized", false]) then {
+ for "_i" from 0 to (2 + (round random 3)) do {
+ [btc_mil_fnc_send, [_hideout, _closest, 0], _i * 2 + 1] call CBA_fnc_waitAndExecute;
+ };
+ } else {
+ _closest setVariable ["occupied", true];
+ if (btc_debug) then {
+ (format ["loc_%1", _closest getVariable "id"]) setMarkerColor "ColorRed";
+ };
+ };
+} forEach _cap_to;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/class.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/class.sqf
new file mode 100644
index 0000000..58fea00
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/class.sqf
@@ -0,0 +1,144 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_class
+
+Description:
+ Find class name from a specific faction.
+
+Parameters:
+ _factions - Faction names. [Array]
+ _en_AA - Allow Anti Air enemies. [Boolean]
+ _en_tank - Allow tank vehicles. [Boolean]
+
+Returns:
+ _array - Array of:
+ _enemy_side - Enemy side. [side]
+ _type_units - All units class name. [Array]
+ _type_divers - All divers class name. [Array]
+ _type_crewmen - Crew class name. [String]
+ _type_boats - All boats class name. [Array]
+ _type_motorized - All vehicles class name. [Array]
+ _type_motorized_armed - All vehicles with turret class name. [Array]
+ _type_mg - All machines gun class name. [Array]
+ _type_gl - All grenades launcher class name. [Array]
+
+Examples:
+ (begin example)
+ [["IND_F"]] call btc_mil_fnc_class;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_factions", [], [[]]],
+ ["_en_AA", false, [false]],
+ ["_en_tank", false, [false]]
+];
+
+private _enemy_side = [];
+private _type_units = [];
+private _type_divers = [];
+private _divers = [];
+private _type_crewmen = "";
+private _type_boats = [];
+private _type_motorized = [];
+private _type_motorized_armed = [];
+private _type_mg = [];
+private _type_gl = [];
+
+//Get all vehicles
+private _cfgVehicles = configFile >> "CfgVehicles";
+private _allclass = ("(configName _x) isKindOf 'AllVehicles'" configClasses _cfgVehicles) apply {configName _x};
+_allclass = _allclass select {getNumber (_cfgVehicles >> _x >> "scope") isEqualTo 2};
+
+//Check if faction existe
+private _cfgFactionClasses = configFile >> "CfgFactionClasses";
+_factions = _factions apply {
+ if !isClass(_cfgFactionClasses >> _x) then {
+ "IND_G_F"
+ } else {
+ _x
+ };
+};
+
+_enemy_side = [east, west, independent, civilian] select getNumber (_cfgFactionClasses >> _factions select 0 >> "side");
+
+//Prevent selecting same side as player side
+if (_enemy_side isEqualTo btc_player_side) exitWith {
+ [["IND_G_F"], _en_AA, _en_tank] call btc_mil_fnc_class;
+};
+
+{
+ private _faction = _x;
+
+ //Get all vehicles of the _faction selected
+ private _allclass_f = _allclass select {
+ (toUpper getText (_cfgVehicles >> _x >> "faction")) isEqualTo _faction &&
+ {!(_x isKindOf "Van_02_vehicle_base_F")} // https://feedback.bistudio.com/T129141
+ };
+
+ //Units
+ _divers = _allclass_f select {[_x, ["AssaultRifle", "64 + 32"]] call btc_mil_fnc_ammoUsage};
+ _type_divers append _divers;
+ _type_units append ((_allclass_f select {_x isKindOf "Man"}) - _divers);
+
+ //Vehicles
+ _type_boats append (_allclass_f select {_x isKindOf "Ship"});
+ _type_motorized append (
+ if (_en_tank) then {
+ _allclass_f select {(_x isKindOf "Tank") || (_x isKindOf "Car") || (_x isKindOf "Truck") || (_x isKindOf "Truck_F")}
+ } else {
+ _allclass_f select {(_x isKindOf "Car") || (_x isKindOf "Truck") || (_x isKindOf "Truck_F")}
+ }
+ );
+ _type_motorized_armed append (
+ _allclass_f select {
+ ((_x isKindOf "Air") || (_x isKindOf "Helicopter") || (_x isKindOf "Tank") || (_x isKindOf "Car")) &&
+ {_x call BIS_fnc_allTurrets isNotEqualTo []}
+ }
+ );
+
+ //Static
+ _type_mg append (_allclass_f select {_x isKindOf "StaticMGWeapon"});
+ _type_gl append (_allclass_f select {_x isKindOf "StaticGrenadeLauncher"});
+
+} forEach _factions;
+
+//Handle if no class name is found
+if (_type_divers isEqualTo []) then {
+ _type_divers = if (_enemy_side isEqualTo east) then {
+ ["O_diver_F", "O_diver_exp_F", "O_diver_TL_F"]
+ } else {
+ ["I_diver_F", "I_diver_exp_F", "I_diver_TL_F"]
+ };
+};
+if (_type_boats isEqualTo []) then {
+ _type_boats = ["I_Boat_Armed_01_minigun_F", "I_Boat_Transport_01_F", "I_SDV_01_F", "I_G_Boat_Transport_01_F"];
+};
+if (_type_mg isEqualTo []) then {
+ _type_mg = ["O_HMG_01_F", "O_HMG_01_high_F"];
+};
+if (_type_gl isEqualTo []) then {
+ _type_gl = ["O_GMG_01_F", "O_GMG_01_high_F"];
+};
+
+//Final filter unwanted units type
+if !(_en_AA) then {
+ //Remove Anti-Air Units
+ _type_units = _type_units select {!([_x, ["MissileLauncher", "256"]] call btc_mil_fnc_ammoUsage)};
+};
+_type_units = _type_units select {
+ (getText (_cfgVehicles >> _x >> "role") isNotEqualTo "Crewman") &&
+ ((_x find "_Survivor_") isEqualTo -1) &&
+ ((_x find "_Story") isEqualTo -1) &&
+ ((_x find "_unarmed_") isEqualTo -1) &&
+ (getText (_cfgVehicles >> _x >> "vehicleClass") isNotEqualTo "MenVR")
+};
+_type_crewmen = _type_units select 0;
+_type_motorized = _type_motorized select {getNumber (_cfgVehicles >> _x >> "isUav") isNotEqualTo 1};
+_type_motorized_armed = _type_motorized_armed select {getNumber (_cfgVehicles >> _x >> "isUav") isNotEqualTo 1};
+
+[_enemy_side, _type_units, _type_divers, _type_crewmen, _type_boats, _type_motorized, _type_motorized_armed, _type_mg, _type_gl]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/createUnits.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/createUnits.sqf
new file mode 100644
index 0000000..1970d98
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/createUnits.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_createUnits
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _group - [Group]
+ _pos - [Array]
+ _number - [Number]
+ _pos_iswater - [Boolean]
+ _type_units - [Array]
+ _type_divers - [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_mil_fnc_createUnits;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_pos", [0, 0, 0], [[], createHashMap]],
+ ["_number", 0, [0]],
+ ["_pos_iswater", false, [false]],
+ ["_type_units", btc_type_units, [[]]],
+ ["_type_divers", btc_type_divers, [[]]]
+];
+
+for "_i" from 1 to _number do {
+ private _unit_type = if (_pos_iswater) then {
+ selectRandom _type_divers;
+ } else {
+ selectRandom _type_units;
+ };
+
+ [_group, _unit_type, _pos] call btc_delay_fnc_createUnit;
+};
+
+_group
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/createVehicle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/createVehicle.sqf
new file mode 100644
index 0000000..191092a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/createVehicle.sqf
@@ -0,0 +1,60 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_createVehicle
+
+Description:
+ Create a vehicle with desired crews.
+
+Parameters:
+ _group - Group to store crews. [Group]
+ _pos - Position of creation. [Array]
+ _veh_type - Vehicle type. [String]
+ _dir - Direction of spawn. [Number]
+ _type_units - Array of available unit type for cargo. [Array]
+ _type_divers - Units used for submarine. [Array]
+ _type_crewmen - Array of available crews type. [Array]
+ _surfaceNormal - Surface normal. [Array]
+
+Returns:
+ _delay_vehicle - Delay for unit creation. [Number]
+
+Examples:
+ (begin example)
+ [createGroup [btc_enemy_side, true], player getPos [10, direction player]] call btc_mil_fnc_createVehicle;
+ (end)
+ (begin example)
+ [createGroup [btc_enemy_side, true], player getPos [10, direction player], "O_G_Van_02_vehicle_F"] call btc_mil_fnc_createVehicle;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (canSuspend) exitWith {[btc_mil_fnc_createVehicle, _this] call CBA_fnc_directCall};
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_pos", [0, 0, 0], [[]]],
+ ["_veh_type", selectRandom btc_type_motorized, [""]],
+ ["_dir", 0, [0]],
+ ["_surfaceNormal", [], [[]]],
+ ["_type_units", btc_type_units, [[]]],
+ ["_type_divers", btc_type_divers, [[]]],
+ ["_type_crewmen", btc_type_crewmen, [[]]]
+];
+
+private _needdiver = getText (configFile >> "CfgVehicles" >> _veh_type >> "simulation") isEqualTo "submarinex";
+_type_crewmen = [_type_crewmen, _type_divers select 0] select _needdiver;
+
+private _units_type = [];
+private _crewSeats = [_veh_type, false] call BIS_fnc_crewCount;
+private _totalSeats = [_veh_type, true] call BIS_fnc_crewCount;
+for "_i" from 0 to (_crewSeats - 1) do {
+ _units_type pushBack _type_crewmen
+};
+for "_i" from _crewSeats to (_totalSeats - 1) do {
+ _units_type pushBack selectRandom _type_units;
+};
+
+[_group, _veh_type, _units_type, _pos, _dir, 1, _surfaceNormal] call btc_delay_fnc_createVehicle
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/create_group.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_group.sqf
new file mode 100644
index 0000000..a04fd42
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_group.sqf
@@ -0,0 +1,110 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_create_group
+
+Description:
+ Create a group of enemies with the corresponding waypoint.
+
+Parameters:
+ _city - City to patrol around. [Object]
+ _area - Area to patrol around. [Number]
+ _n - Number of enemies to create inside the group. [Number]
+ _wp - Type of wp: in "HOUSE", "PATROL" or "SENTRY". [String]
+ _type_divers - Type of diver list. [Array]
+ _type_units - Type of units list. [Array]
+ _p_sea - Allow spawn in water. [Boolean]
+ _enemy_side - Side of the enemie. [Side]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player, 50, 1, "PATROL"] call btc_mil_fnc_create_group;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull, []]],
+ ["_area", 300, [0]],
+ ["_n", 0, [0]],
+ ["_wp", "PATROL", [""]],
+ ["_type_divers", btc_type_divers, [[]]],
+ ["_type_units", btc_type_units, [[]]],
+ ["_p_sea", btc_p_sea, [true]],
+ ["_enemy_side", btc_enemy_side, [east]]
+];
+
+private _pos = [_city call CBA_fnc_getPos, _area, _p_sea] call btc_fnc_randomize_pos;
+private _group_structure = [1, objNull];
+if (_wp isEqualTo "HOUSE") then { // Find building
+ ([_pos, _n] call btc_mil_fnc_getBuilding) params ["_numberOfGroup", "_structure"];
+ if (_structure isNotEqualTo objNull) then {
+ _group_structure = [_numberOfGroup, _structure];
+ } else {
+ _wp = "PATROL"; // Handle the case there is no building
+ };
+};
+
+_group_structure params ["_numberOfGroup", "_structure"];
+private _pos_iswater = (surfaceIsWater _pos) && {getTerrainHeightASL _pos < -1};
+private _hashMapGroup = createHashMap;
+_hashMapGroup set ["_pos", _pos];
+if (
+ _structure isEqualTo objNull &&
+ {!_pos_iswater}
+) then {
+ [_hashMapGroup, {
+ private _pos = _this get "_pos";
+ private _newPos = _pos findEmptyPosition [0, 40, "B_soldier_AR_F"];
+ if (_newPos isNotEqualTo []) then {
+ _pos = _newPos;
+ };
+ _pos = [_pos] call btc_fnc_findPosOutsideRock;
+ _this set ["_pos", _pos];
+ }] call btc_delay_fnc_exec;
+};
+
+private _groups = [];
+for "_i" from 1 to _numberOfGroup do {
+ private _group = createGroup _enemy_side;
+ _groups pushBack _group;
+ if (_city isEqualType objNull) then {
+ _group setVariable ["btc_city", _city];
+ };
+
+ switch (_wp) do {
+ case ("HOUSE") : {
+ _n = 1;
+ [[_group, _structure], btc_fnc_house_addWP] call btc_delay_fnc_exec;
+ _group setVariable ["btc_inHouse", typeOf _structure];
+ };
+ case ("PATROL") : {
+ [{
+ params ["_group", "_hashMapGroup", "_area"];
+ [
+ _group, _hashMapGroup get "_pos", _area,
+ 2 + floor (random 4), "MOVE", "SAFE", "RED",
+ "LIMITED", "STAG COLUMN", "", [5, 10, 20]
+ ] remoteExecCall ["CBA_fnc_taskPatrol", groupOwner _group];
+ }, [_group, _hashMapGroup, _area], btc_delay_time] call CBA_fnc_waitAndExecute;
+ };
+ case ("SENTRY") : {
+ [_group] call CBA_fnc_clearWaypoints;
+ [{
+ params ["_group", "_hashMapGroup"];
+ [_group, _hashMapGroup get "_pos", -1, "SENTRY", "AWARE", "RED"] call CBA_fnc_addWaypoint;
+ }, [_group, _hashMapGroup], btc_delay_time] call CBA_fnc_waitAndExecute;
+ };
+ };
+ [_group, _hashMapGroup, _n, _pos_iswater] call btc_mil_fnc_createUnits;
+};
+
+if (btc_debug_log) then {
+ [format ["_this = %1 ; POS %2 UNITS N %3", _this, _pos, _n], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_groups
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/create_patrol.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_patrol.sqf
new file mode 100644
index 0000000..9ce4a16
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_patrol.sqf
@@ -0,0 +1,106 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_create_patrol
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _group - Group of the patrol. [Group]
+ _random - [Number]
+ _active_city - [Object]
+ _area - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [2, (allPlayers#0), btc_patrol_area] call btc_mil_fnc_create_patrol;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_random", 0, [0]],
+ ["_active_city", objNull, [objNull]],
+ ["_area", btc_patrol_area, [0]]
+];
+
+if (isNil "btc_military_id") then {btc_military_id = 1;};
+
+if (_random isEqualTo 0) then {
+ _random = selectRandom [1, 2];
+};
+
+if (btc_debug_log) then {
+ [format ["_random = %1 _active_city %2 _area %3 btc_patrol_active = %4", _random, _active_city, _area, count btc_patrol_active], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+//Remove if too far from player
+if ([_active_city, grpNull, _area] call btc_patrol_fnc_playersInAreaCityGroup) exitWith {
+ _group call CBA_fnc_deleteEntity;
+ false
+};
+
+//Find a city
+private _cities = values btc_city_all inAreaArray [getPosWorld _active_city, _area, _area];
+private _usefuls = _cities select {!(_x getVariable ["active", false]) && _x getVariable ["occupied", false]};
+if (_usefuls isEqualTo []) exitWith {
+ _group call CBA_fnc_deleteEntity;
+ false
+};
+
+//Randomize position if city has a beach, so position could be in water
+private _start_city = selectRandom _usefuls;
+private _pos = [];
+if (_start_city getVariable ["hasbeach", false]) then {
+ _pos = [getPos _start_city, _start_city getVariable ["cachingRadius", 100], btc_p_sea] call btc_fnc_randomize_pos;
+} else {
+ _pos = getPos _start_city;
+};
+private _pos_isWater = (surfaceIsWater _pos) && {getTerrainHeightASL _pos < -2};
+if (_pos_isWater) then {
+ _pos = [_pos select 0, _pos select 1, 0];
+ _random = 2;
+};
+
+//Creating units
+_group setVariable ["btc_patrol_id", btc_military_id, btc_debug];
+btc_military_id = btc_military_id + 1;
+
+private _delay = switch (_random) do {
+ case 1 : {
+ _pos = [_pos, 0, 150, 10, false] call btc_fnc_findsafepos;
+
+ [_group, _pos, 5 + (round random 4)] call btc_mil_fnc_createUnits;
+ 0
+ };
+ case 2 : {
+ private _veh_type = "";
+ if (_pos_isWater) then {
+ _veh_type = selectRandom btc_type_boats;
+ } else {
+ _veh_type = selectRandom (btc_type_motorized + [selectRandom btc_civ_type_veh]);
+ //Tweak position of spawn
+ private _roads = _pos nearRoads 150;
+ _roads = _roads select {isOnRoad _x};
+ if (_roads isEqualTo []) then {
+ _pos = [_pos, 0, 500, 13, false] call btc_fnc_findsafepos;
+ } else {
+ _pos = getPos selectRandom _roads;
+ };
+ };
+ [_group, _pos, _veh_type] call btc_mil_fnc_createVehicle
+ };
+};
+
+[{
+ _this call btc_patrol_fnc_init;
+ (_this select 0) setVariable ["acex_headless_blacklist", false];
+}, [_group, [_start_city, _active_city], _area, _pos_isWater], _delay] call btc_delay_fnc_waitAndExecute;
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/create_static.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_static.sqf
new file mode 100644
index 0000000..6764cc8
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_static.sqf
@@ -0,0 +1,48 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_create_static
+
+Description:
+ Create a static.
+
+Parameters:
+ _pos - Position of creation. [Array]
+ _statics_type - Type of static available. [Array]
+ _dir - Direction of the static. [Number]
+ _surfaceNormal - Surface normal. [Array]
+ _city - City where the static is created. [Object]
+
+Returns:
+ _group - Created group. [Object]
+
+Examples:
+ (begin example)
+ _group = [getPosATL player] call btc_mil_fnc_create_static;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_statics_type", btc_type_mg, [[]]],
+ ["_dir", 0, [0]],
+ ["_surfaceNormal", [], [[]]],
+ ["_city", objNull, [objNull]]
+];
+
+private _group = createGroup btc_enemy_side;
+_group setVariable ["btc_city", _city];
+[_group] call CBA_fnc_clearWaypoints;
+[_group, _pos, selectRandom _statics_type, _dir, _surfaceNormal] call btc_mil_fnc_createVehicle;
+
+_group setBehaviour "COMBAT";
+_group setCombatMode "RED";
+
+if (btc_debug_log) then {
+ [format ["POS %1", _pos], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_group
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/create_staticOnRoof.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_staticOnRoof.sqf
new file mode 100644
index 0000000..d455573
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/create_staticOnRoof.sqf
@@ -0,0 +1,49 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_create_staticOnRoof
+
+Description:
+ Create static on roof.
+
+Parameters:
+ _house - House to find the roof. [Group]
+ _n - Number of static to generate. [Number]
+ _city - City where the static is created. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [flatten ([position player, 30] call btc_fnc_getHouses), 3] call btc_mil_fnc_create_staticOnRoof;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_houses", [], [[]]],
+ ["_n", 0, [0]],
+ ["_city", objNull, [objNull]]
+];
+
+private _i = 1;
+while {
+ _i <= _n &&
+ {_houses isNotEqualTo []}
+} do {
+ private _house = _houses deleteAt 0;
+ if (
+ !(_house isKindOf "Ruins") &&
+ {!(_house isKindOf "Church")} &&
+ {!("Chapel" in typeOf _house)}
+ ) then {
+ ([_house] call btc_fnc_roof) params ["_spawnPos", "_surfaceNormal"];
+
+ if (acos (_surfaceNormal vectorCos [0, 0, 1]) < 37) then {
+ [ASLToATL _spawnPos, btc_type_mg + btc_type_gl, (_house getDir _spawnPos) + (random [-15, 0, 15]), _surfaceNormal, _city] call btc_mil_fnc_create_static;
+ _i = _i + 1;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/getBuilding.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/getBuilding.sqf
new file mode 100644
index 0000000..ae2d3b1
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/getBuilding.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_getBuilding
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _rpos - [Array]
+ _n - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_mil_fnc_getBuilding;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_rpos", [0, 0, 0], [[]]],
+ ["_n", 0, [0]]
+];
+
+private _structure = objNull;
+([_rpos, 70] call btc_mil_fnc_getStructures) params ["_structures", "_houses"];
+
+if (_structures isEqualTo []) then {
+ if (_houses isNotEqualTo []) then {
+ _structure = selectRandom _houses;
+ _n = 1;
+ };
+} else {
+ _structure = selectRandom _structures;
+ _n = count (_structure buildingPos -1);
+ if (_n > 8) then {
+ _n = 2;
+ } else {
+ _n = floor (_n/2);
+ };
+};
+
+[_n, _structure]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/getStructures.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/getStructures.sqf
new file mode 100644
index 0000000..f525373
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/getStructures.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_getStructures
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _pos - [Array]
+ _radius - [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_mil_fnc_getStructures;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]],
+ ["_radius", 100, [0]]
+];
+
+private _objects = nearestTerrainObjects [_pos, ["House", "BUNKER", "FORTRESS", "TRANSMITTER"], _radius];
+private _objects = _objects select {
+ (_x buildingPos -1) isNotEqualTo [] &&
+ {damage _x isEqualTo 0}
+};
+
+private _structures = _objects select {getText (configOf _x >> "editorSubcategory") isEqualTo "EdSubcat_Military"};
+
+[_structures, _objects]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/send.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/send.sqf
new file mode 100644
index 0000000..0e25df6
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/send.sqf
@@ -0,0 +1,73 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_send
+
+Description:
+ Send a group of units to a location then call btc_data_fnc_add_group. If player is around, initiate patrol around the destination, ifnot save in database and delete units.
+
+Parameters:
+ _start - Starting point. [Object]
+ _dest - Destination. [Array, Object]
+ _typeOf_patrol - Infantry or motorized. [Number]
+ _veh_type - Vehicle type for motorized. [String]
+ _infFormation - Define the infantry formation. [String]
+
+Returns:
+ _group - Created group. [Group]
+
+Examples:
+ (begin example)
+ [allPlayers#0, getPos (allPlayers#0), 1, selectRandom btc_type_motorized] call btc_mil_fnc_send
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_start", objNull, [objNull]],
+ ["_dest", [0, 0, 0], [[], objNull]],
+ ["_typeOf_patrol", 0, [0]],
+ ["_veh_type", "", [""]],
+ ["_infFormation", "COLUMN", [""]]
+];
+
+private _pos = getPos _start;
+
+private _group = grpNull;
+private _delay = 0;
+switch (_typeOf_patrol) do {
+ case 0 : {
+ _group = ([_pos, 150, 3 + round random 6, "PATROL"] call btc_mil_fnc_create_group) select 0;
+ };
+ case 1 : {
+ _group = createGroup btc_enemy_side;
+
+ if (_veh_type isEqualTo "") then {_veh_type = selectRandom btc_type_motorized};
+ private _return_pos = [_pos, 10, 500, 13, false] call btc_fnc_findsafepos;
+
+ _delay = [_group, _return_pos, _veh_type] call btc_mil_fnc_createVehicle;
+ };
+};
+_group setVariable ["no_cache", true];
+_group setVariable ["acex_headless_blacklist", true];
+
+[{
+ params ["_group", "_typeOf_patrol", "_dest", "_infFormation"];
+
+ [_group] call CBA_fnc_clearWaypoints;
+ switch (_typeOf_patrol) do {
+ case 0 : {
+ [_group, _dest, -1, "MOVE", "AWARE", "RED", "FULL", _infFormation, "(group this) call btc_data_fnc_add_group;", nil, 60] call CBA_fnc_addWaypoint;
+ };
+ case 1 : {
+ [_group, _dest, -1, "MOVE", "AWARE", "RED", "NORMAL", "NO CHANGE", "(group this) call btc_data_fnc_add_group;", nil, 60] call CBA_fnc_addWaypoint;
+ };
+ };
+
+ _group setVariable ["acex_headless_blacklist", false];
+ _group deleteGroupWhenEmpty true;
+}, [_group, _typeOf_patrol, _dest, _infFormation], _delay] call btc_delay_fnc_waitAndExecute;
+
+_group
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/set_skill.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/set_skill.sqf
new file mode 100644
index 0000000..9e9ad2a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/set_skill.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_set_skill
+
+Description:
+ Set skills to a unit.
+
+Parameters:
+ _unit - Unit to set skill. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_mil_fnc_set_skill;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+_unit setskill ["general", btc_AI_skill select 0];
+_unit setskill ["aimingAccuracy", btc_AI_skill select 1];
+_unit setskill ["aimingShake", btc_AI_skill select 2];
+_unit setskill ["aimingSpeed", btc_AI_skill select 3];
+_unit setskill ["endurance", btc_AI_skill select 4];
+_unit setskill ["spotDistance", btc_AI_skill select 5];
+_unit setskill ["spotTime", btc_AI_skill select 6];
+_unit setskill ["courage", btc_AI_skill select 7];
+_unit setskill ["reloadSpeed", btc_AI_skill select 8];
+_unit setskill ["commanding", btc_AI_skill select 9];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/mil/unit_killed.sqf b/hearts_and_minds.kunduz_valley/core/fnc/mil/unit_killed.sqf
new file mode 100644
index 0000000..2a3fb4f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/mil/unit_killed.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_mil_fnc_unit_killed
+
+Description:
+ Handle intel and reputation when an enemy is killed.
+
+Parameters:
+ _unit - Object the event handler is assigned to. [Object]
+ _killer - Object that killed the unit. Contains the unit itself in case of collisions. [Object]
+ _instigator - Person who pulled the trigger. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_mil_fnc_unit_killed;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params ["_unit", "_causeOfDeath", "_killer", "_instigator"];
+
+if (side group _unit isNotEqualTo btc_enemy_side) exitWith {};
+
+if (random 100 > btc_info_intel_chance) then {
+ _unit setVariable ["intel", true];
+};
+
+if (
+ isPlayer _instigator ||
+ _killer isEqualTo btc_explosives_objectSide ||
+ isPlayer _killer
+) then {
+ private _repValue = btc_rep_bonus_mil_killed;
+ if (isNull _instigator && isPlayer _killer) then {
+ _instigator = _killer;
+ };
+ if (
+ _unit getVariable ["ace_captives_isHandcuffed", false] ||
+ _unit getVariable ["ace_captives_isSurrendering", false]
+ ) then {
+ if (_causeOfDeath isNotEqualTo "CardiacArrest:Bleedout") then {
+ _repValue = btc_rep_malus_mil_killed;
+ };
+ };
+ [_repValue, _instigator] call btc_rep_fnc_change;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/WPCheck.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/WPCheck.sqf
new file mode 100644
index 0000000..b3bc94f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/WPCheck.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_WPCheck
+
+Description:
+ Check if the waypoint has been completed and initialise a new patrol.
+
+Parameters:
+ _group - Group patroling. [Group]
+ _area - Area of patroling. [Number]
+ _last_wp_pos - Position of the end city (last waypoint). [Array]
+ _citiesID - ID of the starting city, activated city by player and end city. [Array]
+ _isBoat - Does the vehicle is a boat. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [group cursorTarget, 1000, getPos player, [0, 1, 2]] call btc_patrol_fnc_WPCheck;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_area", btc_patrol_area, [0]],
+ ["_last_wp_pos", [0, 0, 0], [[]]],
+ ["_citiesID", [], [[]]],
+ ["_isBoat", false, [false]]
+];
+_citiesID params [
+ ["_start_cityID", 0, [0]],
+ ["_active_cityID", 0, [0]],
+ ["_end_cityID", 0, [0]]
+];
+
+if (btc_debug) then {
+ if (!isNil {_group getVariable "btc_patrol_id"}) then {
+ deleteMarker format ["Patrol_fant_%1", _group getVariable ["btc_patrol_id", 0]];
+ };
+};
+
+private _start_city = btc_city_all get _start_cityID;
+private _active_city = btc_city_all get _active_cityID;
+private _end_city = btc_city_all get _end_cityID;
+
+//Remove if too far from player
+if ([_active_city, _group, _area] call btc_patrol_fnc_playersInAreaCityGroup) exitWith {
+ [_group] call btc_patrol_fnc_eh;
+};
+
+//Sometimes the waypoint is completed but too far due to obstacle (water for island etc)
+if ((leader _group) distance _last_wp_pos > 100) then {
+ if (btc_debug || btc_debug_log) then {
+ [format ["Patrol ID: %1, %2 inaccessible (end city ID: %3)", _group getVariable ["btc_patrol_id", "Missing patrol ID"], _end_city getVariable ["name", "no name"], _end_city getVariable ["id", 0]], __FILE__, [btc_debug, btc_debug_log]] call btc_debug_fnc_message;
+ };
+
+ //Dynamically create a balcklist of cities inaccessible from the starting city
+ private _cities_inaccessible = _start_city getVariable ["btc_cities_inaccessible", []];
+ _cities_inaccessible pushBack _end_city;
+ _start_city setVariable ["btc_cities_inaccessible", _cities_inaccessible];
+
+ _end_city = _start_city;
+};
+
+[_group, [_end_city, _active_city], _area, _isBoat] call btc_patrol_fnc_init;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/addEH.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/addEH.sqf
new file mode 100644
index 0000000..7a5959e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/addEH.sqf
@@ -0,0 +1,34 @@
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_addEH
+
+Description:
+ Add events link to the patrol system.
+
+Parameters:
+ _veh - Vehicle. [Object]
+ _group - Group to store crews. [Group]
+
+Returns:
+
+Examples:
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]],
+ ["_group", grpNull, [grpNull]]
+];
+
+if (
+ !(_group in btc_civ_veh_active) &&
+ {!(_group in btc_patrol_active)}
+) exitWith {};
+
+_veh setVariable ["btc_crews", _group];
+[_veh, "Fuel", btc_patrol_fnc_eh] call CBA_fnc_addBISEventHandler;
+if (side _group isEqualTo civilian) then {
+ [_veh, "GetOut", btc_patrol_fnc_eh] call CBA_fnc_addBISEventHandler;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/addWP.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/addWP.sqf
new file mode 100644
index 0000000..a84ee9e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/addWP.sqf
@@ -0,0 +1,77 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_addWP
+
+Description:
+ Add waypoint to the end city.
+
+Parameters:
+ _group - Group to add waypoint. [Group]
+ _pos - Position of the end city. [Array]
+ _waypointStatements - Code to execute on waypoint completion. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [group cursorTarget, getPos player, "[group this, 1000, [0, 0, 0], [0, 1, 2], false] call btc_patrol_fnc_WPCheck;"] call btc_patrol_fnc_addWP;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_pos", [0, 0, 0], [[]]],
+ ["_waypointStatements", "", [""]]
+];
+
+if (isNull _group) exitWith {
+ [format ["_group isNull %1, waypointStatements = %2 ", isNull _group, _waypointStatements], __FILE__] call btc_debug_fnc_message;
+};
+
+private _vehicle = vehicle leader _group;
+if (_vehicle isKindOf "Air" || _vehicle isKindOf "LandVehicle") then {
+ _vehicle setFuel 1;
+};
+
+[_group] call CBA_fnc_clearWaypoints;
+private _behaviorMode = "SAFE";
+private _combatMode = "RED";
+if (side _group isEqualTo civilian) then {
+ _behaviorMode = "CARELESS";
+ _combatMode = "BLUE";
+};
+
+if (_vehicle isKindOf "Air") then {
+ [_group, _pos, -1, "MOVE", _behaviorMode, _combatMode, "LIMITED", "STAG COLUMN", _waypointStatements, [0, 0, 0], 20] call CBA_fnc_addWaypoint;
+} else {
+ [_group, _pos, -1, "MOVE", _behaviorMode, _combatMode, "LIMITED", "STAG COLUMN", "", [0, 0, 0], 50] call CBA_fnc_addWaypoint;
+
+ private _roadBlackList = [];
+ for "_i" from 0 to (2 + (floor random 3)) do {
+ private _nearestRoad = [_pos getPos [100, random 360], 100, _roadBlackList] call BIS_fnc_nearestRoad;
+ private _newPos = [];
+ if (isNull _nearestRoad) then {
+ _newPos = [_pos, 150] call CBA_fnc_randPos;
+ } else {
+ _roadBlackList pushBackUnique _nearestRoad;
+ _newPos = _nearestRoad;
+ };
+ [_group, _newPos, -1, "MOVE", "UNCHANGED", "RED", "UNCHANGED", "NO CHANGE", "", [0, 0, 0], 20] call CBA_fnc_addWaypoint;
+ };
+ [_group, _pos, -1, "MOVE", "UNCHANGED", "NO CHANGE", "UNCHANGED", "NO CHANGE", _waypointStatements, [0, 0, 0], 50] call CBA_fnc_addWaypoint;
+};
+
+if (btc_debug) then {
+ if (!isNil {_group getVariable "btc_patrol_id"}) then {
+ private _patrol_id = _group getVariable ["btc_patrol_id", 0];
+ private _marker = createMarker [format ["Patrol_fant_%1", _patrol_id], [(_pos select 0) + random 30, (_pos select 1) + random 30, 0]];
+ _marker setMarkerType "mil_dot";
+ _marker setMarkerText format ["P %1", _patrol_id];
+ _marker setMarkerColor (["ColorWhite", "ColorRed"] select (_patrol_id > 0));
+ _marker setMarkerSize [0.5, 0.5];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/disabled.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/disabled.sqf
new file mode 100644
index 0000000..bb3e164
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/disabled.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_disabled
+
+Description:
+ Delete vehicle disabled due to a high impact.
+
+Parameters:
+ _veh - Vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [veh] call btc_patrol_fnc_disabled;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]],
+ ["_selection", "wheel_1_1_steering", [""]],
+ ["_damage", 0.2, [0]]
+];
+
+if (_veh getVariable ["btc_patrol_fnc_disabled_fired", false]) exitWith {};
+
+if (_damage > 0.1) then {
+ _veh setVariable ["btc_patrol_fnc_disabled_fired", true, true];
+ if (isServer) then {
+ [_veh] call btc_patrol_fnc_eh;
+ } else {
+ [_veh] remoteExecCall ["btc_patrol_fnc_eh", 2];
+ };
+};
+
+_damage
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/eh.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/eh.sqf
new file mode 100644
index 0000000..db7b894
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/eh.sqf
@@ -0,0 +1,55 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_eh
+
+Description:
+ Remove events and delete entity.
+
+Parameters:
+ _veh - Object to delete. [Object, Group]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorTarget] call btc_patrol_fnc_eh;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull, grpNull]]
+];
+
+if (_veh getVariable ["btc_patrol_fnc_eh_fired", false]) exitWith {};
+_veh setVariable ["btc_patrol_fnc_eh_fired", true, true];
+
+if (btc_debug_log) then {
+ [format ["%1, isRE %2", _veh, isRemoteExecuted], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+private _group = if (_veh isEqualType grpNull) then {
+ _veh
+} else {
+ _veh getVariable ["btc_crews", grpNull]
+};
+
+if !(
+ _group in btc_patrol_active ||
+ _group in btc_civ_veh_active
+) exitWith {};
+
+if (_veh isEqualType objNull) then {
+ if (btc_debug) then {
+ deleteMarker format ["Patrol_fant_%1", _group getVariable ["btc_patrol_id", 0]];
+ };
+
+ [[], [_veh, _group]] call btc_fnc_delete;
+} else {
+ private _vehicle = assignedVehicle leader _veh;
+ _vehicle setVariable ["btc_patrol_fnc_eh_fired", true, true];
+ [[], [_vehicle, _veh]] call btc_fnc_delete;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/init.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/init.sqf
new file mode 100644
index 0000000..7775ea0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/init.sqf
@@ -0,0 +1,64 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_init
+
+Description:
+ Initialise patrol between two city.
+
+Parameters:
+ _group - Group patroling. [Group]
+ _cities - Contain a starting city and the current active city. [Array]
+ _area - Area to find the end city. [Number]
+ _isBoat - Does the vehicle is a boat. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [group cursorTarget, [selectRandom values btc_city_all, selectRandom values btc_city_all]] call btc_patrol_fnc_init;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_group", grpNull, [grpNull]],
+ ["_cities", [], [[]]],
+ ["_area", btc_patrol_area, [0]],
+ ["_isBoat", false, [false]]
+];
+_cities params [
+ ["_start_city", objNull, [objNull]],
+ ["_active_city", objNull, [objNull]]
+];
+
+if !(isGroupDeletedWhenEmpty _group) then {
+ _group deleteGroupWhenEmpty true;
+};
+
+private _useful = [[_start_city, _active_city], _area, _isBoat] call btc_patrol_fnc_usefulCity;
+if (_useful isEqualTo [] || objNull in _useful) exitWith {
+ _group call CBA_fnc_deleteEntity;
+};
+private _end_city = selectRandom _useful;
+
+private _pos = getPos _end_city;
+if (_isBoat) then {
+ ((selectBestPlaces [_pos, _end_city getVariable ["cachingRadius", 100], "sea", 10, 1]) select 0 select 0) params ["_x", "_y"];
+ _pos = [_x, _y, 0];
+};
+
+private _start_cityID = _start_city getVariable ["id", 0];
+private _active_cityID = _active_city getVariable ["id", 0];
+private _end_cityID = _end_city getVariable ["id", 0];
+private _waypointStatements = format ["[group this, %1, %2, %3, %4] call btc_patrol_fnc_WPCheck;", _area, _pos, [_start_cityID, _active_cityID, _end_cityID], _isBoat];
+
+[_group, _pos, _waypointStatements] call btc_patrol_fnc_addWP;
+
+if (btc_debug_log) then {
+ if (!isNil {_group getVariable "btc_patrol_id"}) then {
+ [format ["ID: %1, End city ID: %2", _group getVariable ["btc_patrol_id", "Missing patrol ID"], _end_cityID], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/playersInAreaCityGroup.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/playersInAreaCityGroup.sqf
new file mode 100644
index 0000000..026802a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/playersInAreaCityGroup.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_playersInAreaCityGroup
+
+Description:
+ Check if player is around the active city or leader of the patrol.
+
+Parameters:
+ _active_city - Active city triggered. [Object]
+ _group - Group patrolling. [Group]
+ _area - Radius of patrol. [Number]
+ _players - Players. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [selectRandom values btc_city_all, group cursorTarget] call btc_patrol_fnc_playersInAreaCityGroup;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_active_city", objNull, [objNull]],
+ ["_group", grpNull, [grpNull]],
+ ["_area", btc_patrol_area, [0]],
+ ["_players", [switchableUnits, playableUnits] select isMultiplayer, [[]]]
+];
+
+_players inAreaArray [getPosWorld _active_city, _area/2, _area/2] isEqualTo [] &&
+{_players inAreaArray [getPosWorld leader _group, _area/2, _area/2] isEqualTo []}
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/patrol/usefulCity.sqf b/hearts_and_minds.kunduz_valley/core/fnc/patrol/usefulCity.sqf
new file mode 100644
index 0000000..b2ff676
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/patrol/usefulCity.sqf
@@ -0,0 +1,61 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_patrol_fnc_usefulCity
+
+Description:
+ Return useful city based on starting city and activated city by player. Prefer cities in the opposite side of the active city relatively to the starting city.
+
+Parameters:
+ _cities - Starting city and activated city by player. [Array]
+ _area - Area of patroling. [Number]
+ _isBoat - Does the vehicle is a boat. [Boolean]
+
+Returns:
+ _cities - End city of the patrol. [Array]
+
+Examples:
+ (begin example)
+ [[selectRandom values btc_city_all, selectRandom values btc_city_all]] call btc_patrol_fnc_usefulCity;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cities", [], [[]]],
+ ["_area", btc_patrol_area, [0]],
+ ["_isBoat", false, [false]]
+];
+_cities params [
+ ["_start_city", objNull, [objNull]],
+ ["_active_city", objNull, [objNull]]
+];
+
+//Find a useful end city from the start city depending of vehicle type
+private _useful = [];
+if (_isBoat) then {
+ _useful = values btc_city_all select {_x getVariable ["hasbeach", false]};
+} else {
+ _useful = values btc_city_all select {_x getVariable ["type", ""] != "NameMarine"};
+};
+private _cities = _useful inAreaArray [getPosWorld _active_city, _area, _area];
+private _cities = _cities - (_start_city getVariable ["btc_cities_inaccessible", []]);
+
+//Choose a city to have the _active_city (where the player is) between the _start_city and the _end_city: _start_city ----> _active_city ----> _end_city
+private _dirTo = _start_city getDir _active_city;
+_cities_dirTo = _cities select {
+ private _ang = _active_city getDir _x;
+ (abs(_ang - _dirTo) min (360 - abs(_ang - _dirTo)) < 45);
+};
+if (_cities_dirTo isNotEqualTo []) then {
+ _cities = _cities_dirTo;
+};
+
+//Check if end city has been found, if not take the closer city
+if (_cities isEqualTo []) then {
+ _cities = [[_active_city, _useful, false] call btc_fnc_find_closecity];
+};
+
+_cities
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/buildingchanged.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/buildingchanged.sqf
new file mode 100644
index 0000000..fd0d646
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/buildingchanged.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_buildingchanged
+
+Description:
+ Change reputation on building damage.
+
+Parameters:
+ _from - Previous building object. [Object]
+ _to - New building object. [Object]
+ _isRuin - If changes to ruins. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_rep_fnc_buildingchanged;
+ (end)
+
+Author:
+ mtusnio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_from", objNull, [objNull]],
+ ["_to", objNull, [objNull]],
+ ["_isRuin", false, [false]]
+];
+
+private _classname = toUpper typeOf _from;
+private _malus = [btc_rep_malus_building_damaged, btc_rep_malus_building_destroyed] select _isRuin;
+private _skipCategories = false;
+
+// Accept only static, terrain buildings, discard any dynamically created ones but keep already damaged buildings.
+if (
+ (getObjectType _from != 1) &&
+ !(_from in btc_buildings_changed) ||
+ {_classname isEqualTo ""} ||
+ {_classname isKindOf "Wall"} ||
+ {"GATE" in _classname}
+) exitWith {};
+
+btc_buildings_changed pushBack _to;
+
+{
+ _x params ["_buildings_classname", "_malus_multipliers"];
+
+ if (_classname find (toUpper _buildings_classname) != -1) exitWith {
+ _malus = _malus * _malus_multipliers;
+ _skipCategories = true;
+ };
+} forEach btc_buildings_multipliers;
+
+if (!_skipCategories) then {
+ {
+ _x params ["_buildings_classname", "_malus_multipliers"];
+
+ if (_classname find (toUpper _buildings_classname) != -1) then {
+ _malus = _malus * _malus_multipliers;
+ };
+ } forEach btc_buildings_categories_multipliers;
+};
+
+if (btc_debug) then {
+ [format ["%1 to %2. Malus: %3", _classname, typeOf _to, _malus], __FILE__, [btc_debug, false]] call btc_debug_fnc_message;
+};
+
+_malus call btc_rep_fnc_change;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/call_militia.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/call_militia.sqf
new file mode 100644
index 0000000..b992eb4
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/call_militia.sqf
@@ -0,0 +1,68 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_call_militia
+
+Description:
+ Call militia to a position.
+
+Parameters:
+ _pos - Position to calling for militia. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player] call btc_rep_fnc_call_militia;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+
+btc_rep_militia_called = time;
+
+private _players = if (isMultiplayer) then {playableUnits} else {switchableunits};
+
+//is there an hideout close by?
+private _start_pos = objNull;
+private _hideouts = btc_hideouts inAreaArray [_pos, 2000, 2000];
+if (_hideouts isNotEqualTo []) then {
+ _hideouts = _hideouts select {_players inAreaArray [getPosWorld _x, 500, 500] isEqualTo []};
+ if (_hideouts isNotEqualTo []) then {_start_pos = selectRandom _hideouts};
+};
+
+if (btc_debug_log) then {
+ [format ["_start_pos : %1 (HIDEOUTS)", _start_pos], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if (_start_pos isEqualTo objNull) then {
+ _start_pos = [_pos, values btc_city_all select {
+ !(_x getVariable ["active", false]) &&
+ _x getVariable ["type", ""] != "NameMarine"
+ }, false] call btc_fnc_find_closecity;
+};
+
+private _ratio = if (_pos distance _start_pos > 1000) then {0.2} else {0.6};
+
+if (btc_debug_log) then {
+ [format ["POS : %1 STARTPOS : %2 - RATIO = %3", _pos, _start_pos, _ratio], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+if ((random 1) > _ratio) then { //MOT
+ [_start_pos, _pos, 1] call btc_mil_fnc_send;
+
+ if (btc_debug_log) then {
+ [format ["MOT %1 POS %2", _group, _pos], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+} else { //INF
+ [_start_pos, _pos, 0, "", "WEDGE"] call btc_mil_fnc_send;
+
+ if (btc_debug_log) then {
+ [format ["INF %1", _group], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/change.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/change.sqf
new file mode 100644
index 0000000..991d909
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/change.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_change
+
+Description:
+ Change reputation level.
+
+Parameters:
+ _reputation - Number to add or substrat to the reputation level. [Number]
+ _player - Player triggered the reputation change. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [-10, player] call btc_rep_fnc_change;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_reputation", 0, [0]],
+ ["_player", objNull, [objNull]]
+];
+
+if (btc_debug || btc_debug_log) then {
+ [format ["GLOBAL %1 - CHANGE %2 - %3", btc_global_reputation, _reputation, name _player], __FILE__, [btc_debug, btc_debug_log, true]] call btc_debug_fnc_message;
+};
+
+btc_global_reputation = btc_global_reputation + _reputation;
+
+if (btc_p_rep_notify >= 0) then {
+ if ((btc_rep_delayed select 1) isEqualTo []) then {
+ [{
+ [{
+ abs(btc_rep_delayed select 0) > btc_p_rep_notify
+ }, {
+ btc_rep_delayed call btc_rep_fnc_notify;
+ }, [], 10 * 60, {
+ btc_rep_delayed call btc_rep_fnc_notify;
+ }] call CBA_fnc_waitUntilAndExecute;
+ }, [], 0.5] call CBA_fnc_waitAndExecute;
+ };
+ btc_rep_delayed set [0, (btc_rep_delayed select 0) + _reputation];
+ (btc_rep_delayed select 1) pushBack [_reputation, _player];
+};
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/eh_effects.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/eh_effects.sqf
new file mode 100644
index 0000000..fd4ab17
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/eh_effects.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_eh_effects
+
+Description:
+ Add effects when player do bad things (call militia, take weapons/grenade).
+
+Parameters:
+ _pos - Position where bad stuff happened. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [getPos player] call btc_rep_fnc_eh_effects;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+if (btc_global_reputation >= btc_rep_level_normal + 100) exitWith {};
+
+params [
+ ["_pos", [0, 0, 0], [[]]]
+];
+
+private _rep = (btc_global_reputation / 100);
+private _random = random (10 - _rep);
+
+if (_random <= 3) exitWith {};
+
+if (time > (btc_rep_militia_called + btc_rep_militia_call_time)) then {
+ if (_random > 3) then { //CALL MILITIA
+ [_pos] call btc_rep_fnc_call_militia;
+ };
+};
+if (btc_global_reputation < (btc_rep_level_low + 100)) then {
+ if (_random > 4) then { //GET WEAPONS
+ [btc_civ_fnc_get_weapons, [_pos, 300], 5] call CBA_fnc_waitAndExecute;
+ };
+} else {
+ if (_random > 1) then { //GET GRENADE
+ [btc_civ_fnc_get_grenade, [_pos, 300], 5] call CBA_fnc_waitAndExecute;
+ };
+};
+
+if (btc_debug_log) then {
+ [format ["REP = %1 - RANDOM = %2 - RINF TIME = %3 - MILITIA/WEAPONS = %4/%5", _rep, _random, time > (btc_rep_militia_called + btc_rep_militia_call_time), _random > 3, _random > 4], __FILE__, [false]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/explosives_defuse.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/explosives_defuse.sqf
new file mode 100644
index 0000000..90fac4f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/explosives_defuse.sqf
@@ -0,0 +1,32 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_explosives_defuse
+
+Description:
+ Change reputation when an explosive has been defused.
+
+Parameters:
+ _ied - IED object. [Object]
+ _unit - Unit defusing the IED. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_rep_fnc_explosives_defuse;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_ied", objNull, [objNull]],
+ ["_unit", objNull, [objNull]]
+];
+
+private _type_ied = typeOf _ied;
+if ((_type_ied select [0, _type_ied find "_"]) in (btc_type_ieds_ace apply {_x select [0, _x find "_"]})) then {
+ [btc_rep_bonus_disarm, _unit] call btc_rep_fnc_change;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/foodRemoved.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/foodRemoved.sqf
new file mode 100644
index 0000000..e060e6a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/foodRemoved.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_foodRemoved
+
+Description:
+ Change reputation if food is removed.
+
+Parameters:
+ _caller - Caller (player). [Object]
+ _unit - Target. [Object]
+ _listOfItemsToRemove - Classnames. [Array]
+ _numberOfItems - Number of removed items. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player, cursorObject, [btc_rep_food], 2] call btc_rep_fnc_foodRemoved;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_caller", "_target", "_listOfItemsToRemove",
+ ["_numberOfItems", 2, [0]]
+];
+
+
+private _removedItem = _listOfItemsToRemove select 0;
+if (
+ (side group _target) isEqualTo civilian &&
+ {_removedItem isKindOf [btc_rep_food, configFile >> "CfgWeapons"]}
+) then {
+ private _repChange = btc_rep_malus_foodRemove * _numberOfItems;
+ if (isServer) then {
+ [_repChange, _caller] call btc_rep_fnc_change;
+ } else {
+ [_repChange, _caller] remoteExecCall ["btc_rep_fnc_change", 2];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/grave.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/grave.sqf
new file mode 100644
index 0000000..3371aa9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/grave.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_grave
+
+Description:
+ Add reputation when a player put dead civil in grave.
+
+Parameters:
+ _restingPlace - Resting Place [Object]
+ _medic - Medic [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, player] call btc_rep_fnc_grave;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_restingPlace", "_medic"];
+
+private _church = nearestTerrainObjects [_restingPlace, ["CHURCH", "CHAPEL"], 50];
+if (_church isEqualTo []) exitWith {};
+_church = _church select 0;
+
+[btc_rep_bonus_grave, _medic] call btc_rep_fnc_change;
+
+private _city = [_church, values btc_city_all, false] call btc_fnc_find_closecity;
+private _cachingRadius = _city getVariable "cachingRadius";
+
+if (_city distance _church < _cachingRadius) then {
+ private _graveList = _city getVariable ["btc_rep_graves", []];
+ _graveList pushBack [
+ getPosASL _restingPlace,
+ getDir _restingPlace,
+ typeOf _restingPlace
+ ];
+ _city setVariable ["btc_rep_graves", _graveList];
+
+ private _graveList = _city getVariable ["btc_civ_graves", []];
+ _graveList pushBack _restingPlace;
+ _city setVariable ["btc_civ_graves", _graveList];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/hd.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/hd.sqf
new file mode 100644
index 0000000..8079b66
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/hd.sqf
@@ -0,0 +1,74 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_hd
+
+Description:
+ Handle damage.
+
+Parameters:
+ _unit - Object to destroy. [Object]
+ _part - Not use. [String]
+ _dam - Amount of damage get by the object. [Number]
+ _injurer - The source unit that caused the damage. [Object]
+ _ammo - Type of ammo use to make damage. [String]
+ _hitIndex - Hit part index of the hit point, -1 otherwise. [Number]
+ _instigator - Person who pulled the trigger. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, "body", 0.1, player] call btc_rep_fnc_hd;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+if ((_this select 1) isEqualType []) exitWith {}; // Some agents return an array when tacking damage
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_part", "", [""]],
+ ["_dam", 0, [0]],
+ ["_injurer", objNull, [objNull]],
+ ["_ammo", "", [""]],
+ ["_hitIndex", 0, [0]],
+ ["_instigator", objNull, [objNull]]
+];
+
+if (_dam <= 0.05) exitWith {_dam};
+if (
+ !isPlayer _instigator &&
+ _injurer isNotEqualTo btc_explosives_objectSide &&
+ !isPlayer _injurer
+) exitWith {_dam};
+
+private _isAgent = isAgent teamMember _unit;
+if (
+ !_isAgent && {
+ _part isEqualTo "" ||
+ {side group _unit isNotEqualTo civilian}
+ }
+) exitWith {_dam};
+
+if !(isServer) exitWith {
+ _this remoteExecCall ["btc_rep_fnc_hd", 2];
+ _dam
+};
+
+if (isNull _instigator && isPlayer _injurer) then {
+ _instigator = _injurer;
+};
+[
+ [btc_rep_malus_civ_hd, btc_rep_malus_animal_hd] select _isAgent,
+ _instigator
+] call btc_rep_fnc_change;
+if (btc_global_reputation < btc_rep_level_normal + 100) then {[getPos _unit] call btc_rep_fnc_eh_effects;};
+
+if (btc_debug_log) then {
+ [format ["REP HD = GREP %1 THIS = %2", btc_global_reputation, _this], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_dam
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/hh.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/hh.sqf
new file mode 100644
index 0000000..6b5053f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/hh.sqf
@@ -0,0 +1,33 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_hh
+
+Description:
+ Change reputation when a player heal.
+
+Parameters:
+ _healer - Player healing. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player] call btc_rep_fnc_hh;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_healer", objNull, [objNull]]
+];
+
+if (isPlayer _healer) then {
+ [btc_rep_bonus_civ_hh, _healer] call btc_rep_fnc_change;
+
+ if (btc_debug_log) then {
+ [format ["GREP %1 THIS = %2", btc_global_reputation, _this], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/killed.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/killed.sqf
new file mode 100644
index 0000000..9d15c8d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/killed.sqf
@@ -0,0 +1,61 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_killed
+
+Description:
+ Change reputation when a player kill a unit.
+
+Parameters:
+ _unit - Unit killed. [Object]
+ _killer - Killer. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, player] call btc_rep_fnc_killed;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params ["_unit", "_causeOfDeath", "_killer", "_instigator"];
+
+if (
+ (side group _unit isNotEqualTo civilian) &&
+ {!isAgent teamMember _unit}
+) exitWith {};
+
+if (
+ isPlayer _instigator ||
+ _killer isEqualTo btc_explosives_objectSide ||
+ isPlayer _killer
+) then {
+ private _isAgent = isAgent teamMember _unit;
+ if (isNull _instigator && isPlayer _killer) then {
+ _instigator = _killer;
+ };
+ [
+ [btc_rep_malus_civ_killed, btc_rep_malus_animal_killed] select _isAgent,
+ _instigator
+ ] call btc_rep_fnc_change;
+ if (btc_global_reputation < btc_rep_level_normal + 100) then {
+ [getPos _unit] call btc_rep_fnc_eh_effects;
+ };
+
+ if !(_isAgent) then {
+ _unit setVariable ["btc_rep_playerKiller", getPlayerUID _instigator];
+ private _city = (group _unit) getVariable ["btc_city", objNull];
+ if !(isNull _city) then {
+ private _civKilled = _city getVariable ["btc_rep_civKilled", []];
+ _civKilled pushBack [getPosASL _unit, getDir _unit];
+ _city setVariable ["btc_rep_civKilled", _civKilled];
+ };
+ };
+
+ if (btc_debug_log) then {
+ [format ["GREP %1 THIS = %2", btc_global_reputation, _this], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/notify.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/notify.sqf
new file mode 100644
index 0000000..e763802
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/notify.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_notify
+
+Description:
+ Show reputation change with a picture and color nuance.
+
+Parameters:
+ _reputation - Reputation number. [Number]
+ _players - List of players triggered the reputation change. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [-10] call btc_rep_fnc_notify;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_reputation", 0, [0]],
+ ["_players", [], [[]]]
+];
+
+_players sort (_reputation <= 0);
+private _player = _players select 0 select 1;
+
+private _hint = [];
+if (_reputation >= 0) then {
+ private _minRep = _reputation min 80;
+
+ _hint pushBack 20;
+ _hint pushBack [[1 - _minRep / 80, 1, 1 - _minRep / 80], _player];
+} else {
+ private _minRep = _reputation max -25;
+
+ _hint pushBack 21;
+ _hint pushBack [[1, 1 + _minRep / 25, 1 + _minRep / 25], _player];
+};
+
+_hint remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+
+btc_rep_delayed = [0, []];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/suppressed.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/suppressed.sqf
new file mode 100644
index 0000000..4ccd638
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/suppressed.sqf
@@ -0,0 +1,64 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_suppressed
+
+Description:
+ Detect if player is firing. Then add a random panic animation. If player fire in direction of a civilian without enemies around, punish him by applying reputation effect and reduce reputation.
+
+Parameters:
+ _unit - Unit to which the event is assigned [Object]
+ _distance - Distance of the projectile pass-by [Number]
+ _shooter - Who (or what) fired - vehicle or drone [Object]
+ _instigator - Who pressed the trigger. [Object]
+ _ammoObject - The ammunition itself [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, objNull, player distance cursorObject, "", "", "", "", player] call btc_rep_fnc_suppressed;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_civ", objNull, [objNull]],
+ ["_distance", 0, [0]],
+ ["_shooter", objNull, [objNull]],
+ ["_instigator", objNull, [objNull]],
+ ["_ammoObject", objNull, [objNull]]
+];
+
+if (_civ getVariable ["btc_rep_fnc_suppressed_fired", false] isEqualTo 2) exitWith {};
+if (_ammoObject isKindOf "SmokeShell") exitWith {};
+if (side group _civ isNotEqualTo civilian) exitWith {_civ setVariable ["btc_rep_fnc_suppressed_fired", 2]};
+
+if (
+ _civ getVariable ["btc_rep_fnc_suppressed_fired", 0] isEqualTo 0 &&
+ {random 3 < 1}
+) then {
+ _civ setVariable ["btc_rep_fnc_suppressed_fired", 1];
+ [_civ, selectRandom ["ApanPknlMstpSnonWnonDnon_G01", "ApanPknlMstpSnonWnonDnon_G02", "ApanPknlMstpSnonWnonDnon_G03", "ApanPpneMstpSnonWnonDnon_G01", "ApanPpneMstpSnonWnonDnon_G02", "ApanPpneMstpSnonWnonDnon_G03"], 1] call ace_common_fnc_doAnimation;
+};
+
+if (
+ _distance < 2 &&
+ {side group _instigator isEqualTo btc_player_side} &&
+ {(_shooter findNearestEnemy _civ) distance _civ > 200} &&
+ {abs((_shooter getDir _civ) - getDir _shooter) < 150/(_shooter distance _civ)}
+) then {
+ if (isServer) then {
+ [btc_rep_malus_civ_suppressed, _shooter] call btc_rep_fnc_change;
+ [getPos _civ] call btc_rep_fnc_eh_effects;
+ } else {
+ [btc_rep_malus_civ_suppressed, _shooter] remoteExecCall ["btc_rep_fnc_change", 2];
+ [getPos _civ] remoteExecCall ["btc_rep_fnc_eh_effects", 2];
+ };
+
+ if (btc_debug_log) then {
+ [format ["GREP %1 THIS = %2", btc_global_reputation, _this], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/treatment.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/treatment.sqf
new file mode 100644
index 0000000..0981557
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/treatment.sqf
@@ -0,0 +1,40 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_treatment
+
+Description:
+ Change reputation when a caller is healing a civilian.
+
+Parameters:
+ _caller - Healer. [Object]
+ _target - Civilian heal. [Object]
+ _selectionName - Not use. [String]
+ _className - Type of healing. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_rep_fnc_treatment;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_caller", objNull, [objNull]],
+ ["_target", objNull, [objNull]],
+ ["_selectionName", "", [""]],
+ ["_className", "", [""]]
+];
+
+if (isPlayer _target) exitWith {};
+if (
+ alive _target &&
+ side group _target isEqualTo civilian &&
+ !(_className in ["CheckPulse", "CheckBloodPressure", "CheckResponse"])
+) then {
+ _this remoteExecCall ["btc_rep_fnc_hh", 2];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/rep/wheelChange.sqf b/hearts_and_minds.kunduz_valley/core/fnc/rep/wheelChange.sqf
new file mode 100644
index 0000000..4e1cbb3
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/rep/wheelChange.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_rep_fnc_wheelChange
+
+Description:
+ Change reputation when a player change a wheel of a civilian car.
+
+Parameters:
+ _object - Vehicle. [Object]
+ _hitPoint - Hitpoint. [String]
+ _damage - Damage value. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, "", 1] call btc_rep_fnc_wheelChange;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ "_object",
+ "_hitPoint",
+ "_damage"
+];
+
+if (
+ _damage < 1 ||
+ {_object in btc_veh_respawnable} ||
+ {_object in btc_vehicles} ||
+ {getNumber(configOf _object >> "side") isNotEqualTo 3}
+) exitWith {};
+
+private _instigator = nearestObject [_object, btc_player_type];
+[
+ btc_rep_malus_wheelChange,
+ _instigator
+] call btc_rep_fnc_change;
+
+if (btc_debug_log) then {
+ [format ["THIS = %1 _instigator = %2", _this, _instigator], __FILE__, [false]] call btc_debug_fnc_message;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/addTicket.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/addTicket.sqf
new file mode 100644
index 0000000..71f0ed7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/addTicket.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_addTicket
+
+Description:
+ Add respawn tickets to a player or a side.
+
+Parameters:
+ _player - Player or side. [Object, Side]
+ _ticket - Value to add. [Number]
+ _uid - Player UID or side use as key. [String, Side]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, 1, getPlayerUID cursorObject] remoteExecCall ["btc_respawn_fnc_addTicket", 2];
+ (end)
+ (begin example)
+ [player, 1, getPlayerUID player] remoteExecCall ["btc_respawn_fnc_addTicket", 2];
+ (end)
+ (begin example)
+ [btc_player_side, 1, btc_player_side] remoteExecCall ["btc_respawn_fnc_addTicket", 2];
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull, west]],
+ ["_ticket", 0, [0]],
+ ["_uid", "", ["", west]]
+];
+
+if (_player isNotEqualTo objNull) then {
+ private _ticketValue = [_player, _ticket] call BIS_fnc_respawnTickets;
+ [24, _ticketValue] remoteExecCall ["btc_fnc_show_hint", _player];
+
+ if (btc_debug_log) then {
+ [format ["_ticketValue %1 _ticket %2 _uid %3", _ticketValue, _ticket, _uid], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+};
+
+private _ticketValue = _ticket + (btc_respawn_tickets getOrDefault [_uid, btc_p_respawn_ticketsAtStart]);
+btc_respawn_tickets set [_uid, _ticketValue];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/force.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/force.sqf
new file mode 100644
index 0000000..cc23306
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/force.sqf
@@ -0,0 +1,25 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_force
+
+Description:
+ Force player respawn.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_respawn_fnc_force;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+player setPos [10, 10, 10];
+player hideObject true;
+player enableSimulation false;
+forceRespawn player;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/intro.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/intro.sqf
new file mode 100644
index 0000000..d698db0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/intro.sqf
@@ -0,0 +1,58 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_intro
+
+Description:
+ Introduction camera.
+
+Parameters:
+ _gear_object - Arsenal position. [String]
+ _create_object - Repair/Logistic position. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_respawn_fnc_intro;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_gear_object", btc_gear_object, [""]],
+ ["_create_object", btc_create_object, [objNull]]
+];
+
+private _color = [1, 0.5, 0,1];
+
+private _gear_object_pos = getPos _gear_object;
+_gear_object_pos params ["_gear_object_pos_x", "_gear_object_pos_y", "_gear_object_pos_z"];
+private _create_object_pos = getPos _create_object;
+_create_object_pos params ["_create_object_pos_x", "_create_object_pos_y", "_create_object_pos_z"];
+
+private _array = [
+ ['\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa', _color, _gear_object_pos, 1.1, 1.1, 0, localize "STR_BTC_HAM_INTRO_ARSENAL_REDEPLOY", 1], //Arsenal/Re-deploy
+ ['\A3\Ui_f\data\Logos\a_64_ca.paa', _color, [_gear_object_pos_x, _gear_object_pos_y, _gear_object_pos_z + 2], 1.1, 1.1, 0, "", 1],
+ //['\A3\ui_f\data\map\vehicleicons\iconCar_ca.paa', _color, [_create_object_pos_x, _create_object_pos_y, _create_object_pos_z + 5], 0.9, 0.9, 90, "", 1],
+ ['\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa', _color, [_create_object_pos_x, _create_object_pos_y, _create_object_pos_z + 2.5], 0.9, 0.9, 0, "", 1],
+ ['\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa', _color, _create_object_pos, 0.9, 0.9, 0, localize "STR_BTC_HAM_INTRO_LOGPOINT", 1] //Rearm/Repair and Objects
+];
+if !(isNil "btc_veh_respawnable_1") then {
+ _array pushBack ['\A3\ui_f\data\map\vehicleicons\iconhelicopter_ca.paa', [0.7, 0, 0,1], getPos btc_veh_respawnable_1, 1.1, 1.1, 0, localize "STR_BTC_HAM_INTRO_ONLYRESPAWN", 1]; //Only Respawnable
+};
+
+waitUntil {time > 0}; //Wait for date synchronisation
+
+private _startingDate = btc_startDate select [0, 3];
+private _date = date select [0, 3];
+private _days = (_date vectorDiff _startingDate) vectorDotProduct [365, 30.5, 1];
+[
+ getMarkerPos "btc_base",
+ format [localize "STR_BTC_HAM_INTRO_LOADINGTXT", round _days],
+ 20, 30, 240, 0, _array, 0
+] call BIS_fnc_establishingShot;
+
+enableSaving [false, false];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/player.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/player.sqf
new file mode 100644
index 0000000..c404194
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/player.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_player
+
+Description:
+ Process dead body, save new respawn tickets player and show KIA marker.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_respawn_fnc_player;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_unit", "_player"];
+
+_unit setVariable ["btc_dont_delete", true];
+btc_body_deadPlayers pushBack _unit;
+_unit setVariable ["btc_UID", getPlayerUID _player];
+
+if (btc_p_respawn_ticketsShare) then {
+ btc_respawn_tickets set [btc_player_side, [btc_player_side] call BIS_fnc_respawnTickets];
+} else {
+ btc_respawn_tickets set [getPlayerUID _player, [_player] call BIS_fnc_respawnTickets];
+};
+
+if (btc_p_body_timeBeforeShowMarker < 0) exitwith {};
+[btc_body_fnc_createMarker, _unit, btc_p_body_timeBeforeShowMarker] call CBA_fnc_waitAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/playerConnected.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/playerConnected.sqf
new file mode 100644
index 0000000..1116c93
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/playerConnected.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_playerConnected
+
+Description:
+ Send the number of respawn tickets to a player during connection.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_respawn_fnc_playerConnected;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_player", "_info"];
+_info params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"];
+
+private _tickets = btc_respawn_tickets getOrDefault [_uid, btc_p_respawn_ticketsAtStart];
+if (_tickets isEqualTo 0) then {
+ _tickets = -1;
+};
+private _respawnTickets = [_player, _tickets] call BIS_fnc_respawnTickets;
+
+if (btc_debug_log) then {
+ [format ["_respawnTickets %1 _tickets %2 _uid %3", _respawnTickets, _tickets, _uid], __FILE__, [false]] call btc_debug_fnc_message;
+};
+
+_respawnTickets
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/respawn/screen.sqf b/hearts_and_minds.kunduz_valley/core/fnc/respawn/screen.sqf
new file mode 100644
index 0000000..3038809
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/respawn/screen.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_respawn_fnc_screen
+
+Description:
+ If no tickets force the player to respawn and allow the use of spectator mode.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_respawn_fnc_screen;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (btc_p_respawn_ticketsAtStart isEqualTo -1) exitWith {};
+
+if ([btc_player_side] call BIS_fnc_respawnTickets isEqualTo 0) then {
+ [
+ {scriptDone btc_intro_done},
+ btc_respawn_fnc_force
+ ] call CBA_fnc_waitUntilAndExecute;
+};
+
+if !(btc_p_respawn_ticketsShare) then {
+ [
+ {[player] call BIS_fnc_respawnTickets isNotEqualTo -1},
+ {
+ if (btc_debug_log) then {
+ [format ["_respawnTickets %1", [player] call BIS_fnc_respawnTickets], __FILE__, [false]] call btc_debug_fnc_message;
+ };
+
+ if ([player] call BIS_fnc_respawnTickets > 0) exitWith {};
+ [
+ {scriptDone btc_intro_done},
+ btc_respawn_fnc_force
+ ] call CBA_fnc_waitUntilAndExecute;
+ }
+ ] call CBA_fnc_waitUntilAndExecute;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/EMP.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/EMP.sqf
new file mode 100644
index 0000000..7118340
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/EMP.sqf
@@ -0,0 +1,128 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_EMP
+
+Description:
+ Find and destroy EMP station.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_EMP"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+
+[_taskID, 36, [objNull, _city] select (btc_p_spect), _city getVariable "name"] call btc_task_fnc_create;
+
+_city setVariable ["spawn_more", true];
+
+private _radius = _city getVariable ["cachingRadius", 0];
+private _composition = [];
+private _tasksID = [];
+
+for "_i" from 0 to (1 + round random 2) do {
+ private _pos = [getPos _city, _radius] call btc_fnc_randomize_pos;
+ _pos = [_pos, 0, 300, 15, false] call btc_fnc_findsafepos;
+
+ private _antenna = btc_type_satelliteAntenna + btc_type_antenna;
+ private _boxType = selectRandom (btc_cache_type select 0);
+ private _composition_station = if (random 1 < 0.4) then { // Big station
+ [
+ [selectRandom btc_type_cargoEMP,46,[0.27,-0.33,0]],
+ [selectRandom _antenna,random 360,[1.1,-1.2,2.6]],
+ [selectRandom _antenna,random 360,[1.1,2.38,0]],
+ [selectRandom _antenna,random 360,[-2.65,-0.43,0]],
+ [selectRandom _antenna,random 360,[-0.25,-3,0]],
+ [_boxType,random 360,[2.68,-0.129,0]]
+ ]
+ } else { // Small station
+ [
+ [selectRandom _antenna,random 360,[-0.3,-0.9,0]],
+ [selectRandom btc_type_solarPanel,random 360,[-1.5,1,0]],
+ [selectRandom _antenna,random 360,[0.5,1.1,0]],
+ [_boxType,random 360,[0.9,-0.5,0]]
+ ]
+ };
+
+ private _station = [_pos, random 360, _composition_station] call btc_fnc_create_composition;
+ _composition append _station;
+ private _box = _station select ((_station apply {typeOf _x}) find _boxType);
+ btc_spect_emp pushBack _box;
+ publicVariable "btc_spect_emp";
+
+ if (random 1 > 0.5) then {
+ _composition pushBack (createMine [selectRandom btc_type_mines, _box getPos [2, random 360], [], 0]);
+ } else {
+ if (random 1 > 0.5) then {
+ private _direction = random 360;
+ private _statics = btc_type_gl + btc_type_mg;
+ [_pos getPos [5, _direction], _statics, _direction, [], _city] call btc_mil_fnc_create_static;
+ };
+ };
+
+ private _destroy_taskID = _taskID + "dt" + str _i;
+ _tasksID pushBack _destroy_taskID;
+ [[_destroy_taskID, _taskID], 37, [_box, objNull] select (btc_p_spect), _composition_station select 0 select 0, false, false] call btc_task_fnc_create;
+
+ [_box, "HandleDamage", {
+ params [
+ ["_box", objNull, [objNull]],
+ ["_part", "", [""]],
+ ["_damage", 0, [0]],
+ ["_injurer", objNull, [objNull]],
+ ["_ammo", "", [""]]
+ ];
+ _thisArgs params [
+ ["_destroy_taskID", "", [""]]
+ ];
+
+ private _explosive = getNumber(configFile >> "cfgAmmo" >> _ammo >> "explosive") > 0;
+ if (
+ _explosive &&
+ {_damage > 0.6} &&
+ {_destroy_taskID call BIS_fnc_taskState isNotEqualTo "CANCELED"}
+ ) then {
+ private _pos = getPos _box;
+ [_destroy_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ private _fx = "test_EmptyObjectForSmoke" createVehicle _pos;
+ _fx setPos _pos;
+ [CBA_fnc_deleteEntity, [_fx], 120] call CBA_fnc_waitAndExecute;
+ btc_spect_emp deleteAt (btc_spect_emp find _box);
+ publicVariable "btc_spect_emp";
+ } else {
+ 0
+ };
+ }, [_destroy_taskID]] call CBA_fnc_addBISEventHandler;
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !(false in (_tasksID apply {_x call BIS_fnc_taskCompleted}))
+};
+
+[[], _composition] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/capture_officer.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/capture_officer.sqf
new file mode 100644
index 0000000..cdbc40f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/capture_officer.sqf
@@ -0,0 +1,203 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_capture_officer
+
+Description:
+ Thanks DAP for inspiration.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_capture_officer"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose two Cities \\\\
+private _usefuls = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"]) &&
+ !(_x getVariable ["occupied", false])
+};
+if (_usefuls isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city2 = selectRandom _usefuls;
+
+private _area = (getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"))/4;
+private _cities = values btc_city_all select {_x distance _city2 > _area};
+_usefuls = _cities select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"]) &&
+ _x getVariable ["occupied", false]
+};
+if (_usefuls isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city1 = selectRandom _usefuls;
+
+//// Find Road \\\\
+private _radius = (_city1 getVariable ["cachingRadius", 0])/2;
+private _roads = _city1 nearRoads (_radius * 2);
+_roads = _roads select {(_x distance _city1 > _radius) && isOnRoad _x};
+if (_roads isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _road = selectRandom _roads;
+private _pos1 = getPosATL _road;
+private _pos2 = getPos _city2;
+
+[_taskID, 14, _city2, _city2 getVariable "name"] call btc_task_fnc_create;
+
+//// Create markers \\\\
+private _marker1 = createMarker [format ["sm_2_%1", _pos1], _pos1];
+_marker1 setMarkerType "hd_flag";
+[_marker1, "str_a3_campaign_b_m06_marker01"] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker1]; //Convoy start
+_marker1 setMarkerSize [0.6, 0.6];
+
+private _marker2 = createMarker [format ["sm_2_%1", _pos2], _pos2];
+_marker2 setMarkerType "hd_flag";
+[_marker2, "STR_BTC_HAM_SIDE_CONVOY_MRKEND"] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker2]; //Convoy end
+_marker2 setMarkerSize [0.6, 0.6];
+
+private _area = createMarker [format ["sm_%1", _pos2], _pos2];
+_area setMarkerShape "ELLIPSE";
+_area setMarkerBrush "SolidBorder";
+_area setMarkerSize [_radius/2, _radius/2];
+_area setMarkerAlpha 0.3;
+_area setmarkercolor "colorBlue";
+
+private _markers = [_marker1, _marker2, _area];
+
+/// Show info path\\\
+private _veh_types = btc_civ_type_veh select {!(_x isKindOf "air")};
+private _agent = [btc_info_fnc_path, [_pos1, _pos2, _taskID, _veh_types select 0]] call CBA_fnc_directCall;
+private _startingPath = time;
+
+waitUntil {
+ !isNil {_agent getVariable "btc_path"} ||
+ {time > _startingPath + 10}
+};
+
+private _path = _agent getVariable ["btc_path", []];
+if (count _path <= 35) exitWith {
+ _markers append (allMapMarkers select {(_x select [0, count _taskID]) isEqualTo _taskID});
+ [_markers, [_agent]] call btc_fnc_delete;
+ [_taskID, "CANCELED"] call BIS_fnc_taskSetState;
+};
+
+//// Create convoy \\\\
+private _group = createGroup btc_enemy_side;
+_group setVariable ["no_cache", true];
+_group setVariable ["acex_headless_blacklist", true];
+[_group] call CBA_fnc_clearWaypoints;
+private _convoyLength = 2 + round random 1;
+private _listPositions = _path select [40, _convoyLength + 1];
+reverse _listPositions;
+[_group, ASLToAGL (_listPositions select 0), -1, "SENTRY", "SAFE", "RED", "LIMITED", "COLUMN"] call CBA_fnc_addWaypoint; // Make sure they don't move during spawn
+private _delay = 0;
+for "_i" from 1 to _convoyLength do {
+ private _pos = _listPositions deleteAt 0;
+ _delay = _delay + ([_group, ASLToAGL _pos, selectRandom _veh_types, (_listPositions select 0) getDir _pos] call btc_mil_fnc_createVehicle);
+};
+
+[{
+ params ["_group"];
+
+ _group call CBA_fnc_clearWaypoints;
+ _this call CBA_fnc_addWaypoint;
+ [12] remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+
+ private _vehs = (units _group) apply {assignedVehicle _x};
+ {
+ _x addCuratorEditableObjects [_vehs arrayIntersect _vehs, false];
+ } forEach allCurators;
+}, [
+ _group, _pos2, -1, "MOVE", "SAFE", "RED", "LIMITED", "COLUMN",
+ format ["['%1', 'FAILED'] call BIS_fnc_taskSetState;", _taskID], [0, 0, 0], _radius/2
+], _delay] call btc_delay_fnc_waitAndExecute;
+
+[{
+ params ["_group", "_taskID", "_trigger"];
+
+ private _captive = leader _group;
+ removeAllWeapons _captive;
+ private _vehs = (units _group) apply {assignedVehicle _x};
+ {
+ _x addCuratorEditableObjects [_vehs arrayIntersect _vehs, false];
+ } forEach allCurators;
+
+ private _surrender_taskID = _taskID + "su";
+ [[_surrender_taskID, _taskID], 24, objNull, typeOf _captive] call btc_task_fnc_create;
+ private _handcuff_taskID = _taskID + "hc";
+ private _back_taskID = _taskID + "bk";
+
+ //// Create trigger \\\\
+ private _trigger = createTrigger ["EmptyDetector", _captive, false];
+ _trigger setVariable ["captive", _captive];
+ _trigger setTriggerArea [15, 15, 0, false];
+ _trigger setTriggerActivation [str btc_player_side, "PRESENT", true];
+ _trigger setTriggerStatements ["this", format ["_captive = thisTrigger getVariable 'captive'; deleteVehicle thisTrigger; moveOut _captive; doStop _captive; [_captive, true] call ace_captives_fnc_setSurrendered; ['%1', 'SUCCEEDED'] call BIS_fnc_taskSetState; [['%2', '%4'], 29, _captive] call btc_task_fnc_create; [['%3', '%4'], 21, btc_create_object_point, typeOf btc_create_object_point] call btc_task_fnc_create;", _surrender_taskID, _handcuff_taskID, _back_taskID, _taskID], ""];
+ _trigger attachTo [_captive, [0, 0, 0]];
+
+ ["ace_captiveStatusChanged", {
+ params ["_unit", "_state", "_type"];
+ _thisArgs params ["_captive", "_handcuff_taskID"];
+
+ if (isNull _captive) then {
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ };
+ if (_unit isEqualTo _captive && _type isEqualTo "SetHandcuffed") then {
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ [_handcuff_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ };
+ _this
+ }, [_captive, _handcuff_taskID]] call CBA_fnc_addEventHandlerArgs;
+
+ [{
+ !alive (_this select 0) ||
+ isNull (_this select 0)
+ }, {
+ [_this select 1, "FAILED"] call btc_task_fnc_setState;
+ deleteVehicle (_this select 2);
+ }, [_captive, _taskID, _trigger]] call CBA_fnc_waitUntilAndExecute;
+
+ [{
+ (_this select 0) inArea [getPosWorld btc_create_object_point, 100, 100, 0, false] ||
+ isNull (_this select 0)
+ }, {
+ [_this select 1, "SUCCEEDED"] call btc_task_fnc_setState;
+ }, [_captive, _taskID]] call CBA_fnc_waitUntilAndExecute;
+}, [
+ _group,
+ _taskID
+], _delay] call btc_delay_fnc_waitAndExecute;
+
+waitUntil {sleep 5; _taskID call BIS_fnc_taskCompleted};
+
+_markers append (allMapMarkers select {(_x select [0, count _taskID]) isEqualTo _taskID});
+private _vehs = (units _group) apply {assignedVehicle _x};
+_vehs = (_vehs arrayIntersect _vehs);
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [_markers, _vehs + [_group]] call btc_fnc_delete;
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "FAILED") exitWith {
+ _group setVariable ["no_cache", false];
+ {
+ private _group = createGroup btc_enemy_side;
+ (crew _x) joinSilent _group;
+ [btc_data_fnc_add_group, _group] call CBA_fnc_directCall;
+ } forEach _vehs;
+ [_markers] call btc_fnc_delete;
+};
+
+[_markers, _vehs + [_group]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+50 call btc_rep_fnc_change;
\ No newline at end of file
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/checkpoint.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/checkpoint.sqf
new file mode 100644
index 0000000..6f6bfd7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/checkpoint.sqf
@@ -0,0 +1,133 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_checkpoint
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_checkpoint"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose an occupied City \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+private _pos = getPos _city;
+
+[_taskID, 9, objNull, _city getVariable "name"] call btc_task_fnc_create;
+
+_city setVariable ["spawn_more", true];
+
+private _statics = btc_type_gl + btc_type_mg;
+private _radius = _city getVariable ["cachingRadius", 0];
+
+private _boxes = [];
+private _composition = [];
+private _blacklist = [];
+private _groups = [];
+for "_i" from 1 to (2 + round random 2) do {
+ //// Choose a road \\\\
+ private _pos = [getPos _city, _radius/4] call btc_fnc_randomize_pos;
+ private _roads = _pos nearRoads 200;
+ _roads = (_roads select {isOnRoad _x}) - _blacklist;
+ if (_roads isEqualTo []) then {continue};
+ private _road = selectRandom _roads;
+ _blacklist pushBack _road;
+ _pos = getPos _road;
+
+ private _direction = [_road] call btc_fnc_road_direction;
+
+ //// Randomise composition \\\\
+ private _type_barrel = selectRandom btc_type_barrel;
+ private _type_barrel_canister1 = selectRandom (btc_type_barrel + btc_type_canister);
+ private _type_barrel_canister2 = selectRandom (btc_type_barrel + btc_type_canister);
+ private _type_pallet = selectRandom btc_type_pallet;
+ private _type_box = selectRandom btc_type_box;
+ private _type_cone = selectRandom btc_type_cones;
+ private _type_barrier = selectRandom btc_type_barrier;
+ private _composition_checkpoint = [
+ [_type_barrel,10,[0.243652,-2.78906,0]],
+ [_type_barrel,20,[-0.131836,3.12939,0]],
+ ["Land_BagFence_Long_F",90,[0.769531,-4.021,0]],
+ ["Land_BagFence_Long_F",90,[-0.638672,4.31787,0]],
+ ["Flag_Red_F",-90,[2.23193,-4.375,0]],
+ [_type_barrel_canister1,0,[1.27393,-4.93604,0]],
+ [_type_pallet,-70,[-5,3.75342,0]],
+ [_type_barrel_canister2,0,[1.83984,-4.95264,0]],
+ [_type_box,180,[-1.97998,4.88574,0]],
+ [_type_barrier,180,[2.26367,-5.38623,0]],
+ [_type_cone,180,[1.14771,-5.89697,0.00211954]],
+ [_type_barrier,0,[-2.1416,5.66553,0]],
+ [_type_cone,0,[-1.03101,6.18164,0.00211954]],
+ [_type_cone,180,[2.81616,-5.81689,0.00211954]],
+ [_type_cone,0,[-2.6731,6.17773,0.00211954]]
+ ];
+
+ //// Create checkpoint with static at _pos \\\\
+ _pos params ["_x", "_y", "_z"];
+ private _posStatic = [_x -2.39185*cos(-_direction) - 2.33984*sin(-_direction), _y + 2.33984 *cos(-_direction) -2.39185*sin(-_direction), _z];
+ private _group = [_posStatic, _statics, _direction + 180, [], _city] call btc_mil_fnc_create_static;
+ _groups pushBack _group;
+
+ private _posStatic = [_x + 2.72949*cos(-_direction) - -2.03857*sin(-_direction), _y -2.03857*cos(-_direction) +2.72949*sin(-_direction), _z];
+ private _group = [_posStatic, _statics, _direction, [], _city] call btc_mil_fnc_create_static;
+ _groups pushBack _group;
+
+ _composition append ([_pos, _direction, _composition_checkpoint] call btc_fnc_create_composition);
+
+ private _boxe = nearestObject [_pos, _type_box];
+ _boxe setVariable ["ace_cookoff_enable", false, true];
+ _boxe setVariable ["ace_cookoff_enableAmmoCookoff", false, true];
+ private _destroy_taskID = _taskID + "dt" + str _i;
+ [[_destroy_taskID, _taskID], 23, _boxe, _type_box, false, false] call btc_task_fnc_create;
+ [_boxe, _destroy_taskID] spawn {
+ params ["_boxe", "_destroy_taskID"];
+
+ private _pos = getPos _boxe;
+ waitUntil {sleep 5; _destroy_taskID call BIS_fnc_taskCompleted || !(alive _boxe)};
+ if (_destroy_taskID call BIS_fnc_taskState isNotEqualTo "CANCELED") then {
+ [_destroy_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ private _fx = "test_EmptyObjectForSmoke" createVehicle _pos;
+ _fx setPos _pos;
+ sleep 120;
+ _fx call CBA_fnc_deleteEntity;
+ };
+ };
+ _boxes pushBack _boxe;
+};
+
+if (_boxes isEqualTo []) then {[_taskID, "CANCELED"] call btc_task_fnc_setState;};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ _boxes select {alive _x} isEqualTo []
+};
+
+[[], _boxes + _composition] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], _groups apply {vehicle leader _x}] call btc_fnc_delete;
+};
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/chemicalLeak.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/chemicalLeak.sqf
new file mode 100644
index 0000000..f80f3ea
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/chemicalLeak.sqf
@@ -0,0 +1,191 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_chemicalLeak
+
+Description:
+ Some containers has been broken and drop some contaminated objects. Clean up those contaminated objects under a big shower.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_chemicalLeak"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ !(_x getVariable ["occupied", false]) &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) then {_useful = values btc_city_all;};
+
+private _city = selectRandom _useful;
+private _pos = [getPos _city, 0, _city getVariable ["cachingRadius", 100], 30, false] call btc_fnc_findsafepos;
+
+[_taskID, 30, _city, _city getVariable "name"] call btc_task_fnc_create;
+
+private _distance_between_fences = 3;
+private _number_of_fences = 2 * (3 + floor random 2);
+private _area_size = _distance_between_fences * _number_of_fences;
+private _offset = _area_size + _distance_between_fences/2;
+
+//// Randomise composition \\\\
+private _cone = selectRandom btc_type_cones;
+private _barrier = selectRandom btc_type_barrier;
+private _lamp = selectRandom btc_type_tentLamp;
+private _connectorTent = selectRandom btc_type_connectorTent;
+private _cfgVehicles = configfile >> "CfgVehicles";
+private _editorCategory = getText(_cfgVehicles >> _connectorTent >> "editorCategory");
+private _editorSubcategory = getText(_cfgVehicles >> _connectorTent >> "editorSubcategory");
+private _connectorTentClosed = selectRandom (btc_type_connectorTentClosed select {
+ _editorSubcategory isEqualTo (getText(_cfgVehicles >> _x >> "editorSubcategory")) &&
+ _editorCategory isEqualTo (getText(_cfgVehicles >> _x >> "editorCategory"))
+});
+private _crossTent = selectRandom (btc_type_crossTent select {
+ _editorSubcategory isEqualTo (getText(_cfgVehicles >> _x >> "editorSubcategory")) &&
+ _editorCategory isEqualTo (getText(_cfgVehicles >> _x >> "editorCategory"))
+});
+
+private _doorCenter = 0;
+private _composition_pattern = [];
+for "_i" from -_number_of_fences to _number_of_fences do {
+ _composition_pattern append [
+ [_barrier, 0, [_i * _distance_between_fences, -_offset, 0]],
+ [_barrier, 0, [_i * _distance_between_fences, _offset, 0]],
+ [_barrier, 90, [ -_offset, _i * _distance_between_fences, 0]]
+ ];
+ if (_i isNotEqualTo 4) then {
+ _composition_pattern pushBack [_barrier, 90, [_offset, _i * _distance_between_fences, 0]];
+ if (random 1 > 0.7) then {
+ _composition_pattern append [
+ [selectRandom btc_type_portableLamp, 180, [_i * _distance_between_fences, -_offset + 1, 0]],
+ [selectRandom btc_type_portableLamp, 0, [_i * _distance_between_fences, _offset - 1, 0]],
+ [selectRandom btc_type_portableLamp, 270, [ -_offset + 1, _i * _distance_between_fences, 0]]
+ ];
+ };
+ } else {
+ _doorCenter = _i * _distance_between_fences;
+ };
+};
+
+private _offset_door = - 60 + _offset;
+private _sas = -12 + _offset;
+_composition_pattern append [
+ [_cone, random 360,[60.3545 + _offset_door,_doorCenter + 2,0]],
+ [_cone, random 360,[60.3755 + _offset_door,_doorCenter - 2,0]],
+ [selectRandom btc_type_portable_light,40,[61.1982 + _offset_door,_doorCenter - 4,0]],
+ [selectRandom btc_type_portable_light,37,[60.7373 + _offset_door,_doorCenter + 5,0]],
+ [selectRandom btc_type_body_bags,332,[63 + _offset_door,_doorCenter - 4.7,0.1]],
+ [selectRandom btc_type_medicals,0,[65.4448 + _offset_door,_doorCenter - 3,0]],
+ [selectRandom btc_type_first_aid_kits,0,[65.6187 + _offset_door,_doorCenter - 4.1,0]],
+ [selectRandom btc_type_power,random [180, 223, 260],[63.9292 + _offset_door,_doorCenter + 7,0]],
+ [selectRandom (btc_type_barrel + btc_type_canister), random 360,[66.4707 + _offset_door, _doorCenter - 4.3,0]],
+ ["DeconShower_01_F",360,[_sas + 0.2,_doorCenter,0]],
+ [selectRandom btc_type_tarp,0,[_sas + 0.2,_doorCenter,0]],
+ [_connectorTent,270,[_sas + 3.87891,_doorCenter,0]],
+ ["Land_MetalCase_01_large_F",272,[_sas + 4,_doorCenter-0.6,0]],
+ [_crossTent,270,[_sas + 7.44434,_doorCenter,0]],
+ ["Land_MetalCase_01_large_F",3,[_sas + 6.81201,_doorCenter + 2.97849,0]],
+ [_connectorTentClosed,0,[_sas + 7.42627,_doorCenter + 3.46782,0]],
+ [_connectorTentClosed,180,[_sas + 7.40625,_doorCenter - 3.64248,0]],
+ ["Land_MetalCase_01_medium_F",177.972,[_sas + 8.23242,_doorCenter-2.8,0]],
+ [_lamp,31.364,[_sas + 8.2876,_doorCenter + 4.12472,0]],
+ [_lamp,150.453,[_sas + 8.45654,_doorCenter-4.58128,0]],
+ [selectRandom(btc_type_sponge + btc_type_brush),random 360,[_sas + 9.89697,_doorCenter + 1,0]],
+ ["DeconShower_01_F",0,[_sas + 10.9,_doorCenter,0]],
+ [selectRandom btc_type_broom,random [98,108.489, 118],[_sas + 10.481,_doorCenter-1.46616,0]],
+ [selectRandom(btc_type_sponge + btc_type_brush), random 360,[_sas + 10.5405,_doorCenter + 1.2,0]],
+ ["TrashBagHolder_01_F",random [0, 0, 30],[_sas,_doorCenter - 2,0]],
+ [selectRandom btc_type_tarp,0,[_sas + 10.9,_doorCenter,0]],
+ [selectRandom btc_type_spill,random 360,[-1.96582,1.60091 - _doorCenter/2,0]],
+ [selectRandom btc_type_spill,random 360,[4,3.95 - _doorCenter/2,0]],
+ [selectRandom btc_type_spill,random 360,[3.47607,-4.70143 - _doorCenter/2,0]],
+ [selectRandom btc_type_cargo_ruins,random 360,[6.31689,0.373489 - _doorCenter/2,0]],
+ [selectRandom btc_type_cargo_ruins,random 360,[-4,7.95 - _doorCenter/2,0]],
+ [selectRandom btc_type_spill,random 360,[0,11.95 - _doorCenter/2,0]],
+ [selectRandom btc_type_SCBA,random 360,[_sas + 0.510742,_doorCenter + 1.4,0]]
+];
+{
+ if (random 1 > 0.5) then {
+ _composition_pattern pushBack _x;
+ };
+} forEach [
+ [selectRandom btc_type_spill,random 360,[-4,-4.05 - _doorCenter/2,0]],
+ [selectRandom btc_type_cargo_ruins,random 360,[-5.12109,-6.19316 - _doorCenter/2,0]],
+ ["TrashBagHolder_01_F",random [0, 0, 30],[_sas,_doorCenter + 2.37756,0]]
+];
+{
+ if (random 1 > 0.4) then {
+ _composition_pattern pushBack ["HazmatBag_01_roll_F", random 360, _x];
+ };
+} forEach [
+ [_sas + 4.39111,_doorCenter + 1.08578,0],
+ [_sas + 3.87402,_doorCenter + 0.984695,0],
+ [_sas + 4.22461,_doorCenter + 0.898758,0],
+ [_sas + 8.41162,_doorCenter-0.9,0],
+ [_sas + 8.60547,_doorCenter-1.1,0],
+ [_sas + 8.74072,_doorCenter-0.75,0]
+];
+
+private _composition_objects = [_pos, random 360, _composition_pattern] call btc_fnc_create_composition;
+
+private _chemical = [];
+for "_i" from 1 to (5 + round random 5) do {
+ private _m_pos = [_pos, _area_size - 14] call btc_fnc_randomize_pos;
+ private _hazmat = createVehicle [selectRandom btc_type_hazmat, _m_pos, [], 2, "NONE"];
+ _hazmat setDir random 360;
+ _hazmat setVectorUp [random 1, random 1, random [-1, 0, 1]];
+ [_hazmat] call btc_log_fnc_init;
+ _chemical pushBack _hazmat;
+ if (_i < 3 || random 1 > 0.5) then {
+ btc_chem_contaminated pushBack _hazmat;
+ publicVariable "btc_chem_contaminated";
+ };
+ btc_log_obj_created deleteAt (btc_log_obj_created find _hazmat);
+};
+
+private _bring_taskID = _taskID + "br";
+[[_bring_taskID, _taskID], 31, _pos, btc_containers_mat select 0] call btc_task_fnc_create;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ (nearestObjects [_pos, btc_containers_mat, 200]) isNotEqualTo []
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], _composition_objects + _chemical] call btc_fnc_delete;
+};
+
+[_bring_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+
+[getPos _city, _pos getPos [_area_size * 2.5, _pos getDir _city]] call btc_civ_fnc_evacuate;
+
+private _locate_taskID = _taskID + "lc";
+[[_locate_taskID, _taskID], 32, _pos, typeOf((_chemical arrayIntersect btc_chem_contaminated) select 0)] call btc_task_fnc_create;
+private _clean_taskID = _taskID + "cl";
+private _bigShower = selectRandom (btc_chem_decontaminate select {_x isKindOf "DeconShower_02_F"});
+[[_clean_taskID, _taskID], 33, _bigShower, typeOf _bigShower] call btc_task_fnc_create;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ (_chemical arrayIntersect btc_chem_contaminated) select {!isNull _x} isEqualTo []
+};
+
+[[], _composition_objects + _chemical] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+50 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment.sqf
new file mode 100644
index 0000000..a80219d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment.sqf
@@ -0,0 +1,111 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_civtreatment
+
+Description:
+ Heal a civilian.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_civtreatment"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose a clear City \\\\
+private _useful = values btc_city_all select {
+ !(_x getVariable ["occupied", false]) &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+private _pos = getPos _city;
+
+//// Choose spawn in house or on road \\\\
+private _r = random 2;
+private _objects = [];
+if ( _r < 1) then {
+ private _roads = _pos nearRoads 200;
+ _objects = _roads select {isOnRoad _x};
+} else {
+ _objects = ([[_pos select 0, _pos select 1, 0], 200] call btc_fnc_getHouses) select 0;
+};
+
+if (_objects isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+//// Create civ on _pos \\\\
+private _veh = objNull;
+private _fx = objNull;
+if (_r < 1) then {
+ _pos = getPos (selectRandom _objects);
+ private _vehPos = [_pos, 10] call btc_fnc_randomize_pos;
+
+ private _veh_type = selectRandom btc_civ_type_veh;
+ _veh = createVehicle [_veh_type, _vehPos, [], 0, "NONE"];
+ _veh setDir (random 360);
+ _veh setDamage 0.7;
+ //// Random wheel hit \\\\
+ if (_r < 0.5) then {
+ _veh setHit ["wheel_1_2_steering", 1];
+ } else {
+ _veh setHit ["wheel_2_1_steering", 1];
+ };
+ _veh setHit ["wheel_1_1_steering", 1];
+ //// Add smoke effect on car \\\\
+ _fx = "test_EmptyObjectForSmoke" createVehicle (getPosATL _veh);
+ _fx attachTo [_veh, [0, 0, 0]];
+};
+
+private _unit_type = selectRandom btc_civ_type_units;
+private _group = createGroup civilian;
+_group setVariable ["no_cache", true];
+_group setVariable ["acex_headless_blacklist", true];
+private _unit =_group createUnit [_unit_type, _pos, [], 0, "CAN_COLLIDE"];
+_unit setBehaviour "CARELESS";
+_unit setDir (random 360);
+_unit setUnitPos "DOWN";
+
+[_taskID, 8, _unit, [_city getVariable "name", _unit_type]] call btc_task_fnc_create;
+
+sleep 1;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ playableUnits inAreaArray [getPosWorld _unit, 5000, 5000] isNotEqualTo []
+};
+
+[_unit] call btc_fnc_set_damage;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !alive _unit ||
+ {
+ _unit call ace_medical_status_fnc_isInStableCondition &&
+ [_unit] call ace_common_fnc_isAwake
+ }
+};
+
+[[], [_veh, _fx, _group]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+if !(alive _unit) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+};
+
+10 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+
+_unit setUnitPos "UP";
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment_boat.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment_boat.sqf
new file mode 100644
index 0000000..a3fe90d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/civtreatment_boat.sqf
@@ -0,0 +1,85 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_civtreatment_boat
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] spawn btc_side_fnc_civtreatment_boat;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose a Marine location \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["type", ""] isEqualTo "NameMarine" ||
+ _x getVariable ["hasbeach", false]
+};
+
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+private _pos = getPos _city;
+
+//// Choose a random position \\\\
+private _vehpos = [_pos, 0, 600, 20, 2, 60 * (pi / 180), 0] call BIS_fnc_findSafePos;
+_vehpos = [_vehpos select 0, _vehpos select 1, 0];
+
+//// Create civ on _vehpos \\\\
+private _veh_type = selectRandom btc_civ_type_boats;
+private _veh = createVehicle [_veh_type, _vehpos, [], 0, "NONE"];
+_veh setDir (random 360);
+_veh setPos _vehpos;
+
+private _unit_type = selectRandom btc_civ_type_units;
+private _group = createGroup civilian;
+_group setVariable ["no_cache", true];
+_group setVariable ["acex_headless_blacklist", true];
+private _unit = _group createUnit [_unit_type, _pos, [], 0, "NONE"];
+private _index = 1 + floor (random (_veh emptyPositions "cargo"));
+_unit assignAsCargoIndex [_veh, _index];
+_unit moveinCargo [_veh, _index];
+
+[_taskID, 10, _unit, [_city getVariable "name", _veh_type]] call btc_task_fnc_create;
+
+sleep 1;
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ playableUnits inAreaArray [getPosWorld _unit, 5000, 5000] isNotEqualTo []
+};
+
+[_unit] call btc_fnc_set_damage;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !alive _unit ||
+ {
+ _unit call ace_medical_status_fnc_isInStableCondition &&
+ [_unit] call ace_common_fnc_isAwake
+ }
+};
+
+[[], [_veh, _group]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+if !(alive _unit) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+};
+
+10 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/convoy.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/convoy.sqf
new file mode 100644
index 0000000..01eb6f5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/convoy.sqf
@@ -0,0 +1,153 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_convoy
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_convoy"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose two Cities \\\\
+private _usefuls = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"]) &&
+ !(_x getVariable ["occupied", false])
+};
+if (_usefuls isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city2 = selectRandom _usefuls;
+
+private _area = (getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"))/4;
+private _cities = values btc_city_all select {_x distance _city2 > _area};
+_usefuls = _cities select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"]) &&
+ _x getVariable ["occupied", false]
+};
+if (_usefuls isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city1 = selectRandom _usefuls;
+
+//// Find Road \\\\
+private _radius = (_city1 getVariable ["cachingRadius", 0])/2;
+private _roads = _city1 nearRoads (_radius * 2);
+_roads = _roads select {(_x distance _city1 > _radius) && isOnRoad _x};
+if (_roads isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _road = selectRandom _roads;
+private _pos1 = getPosATL _road;
+private _pos2 = getPos _city2;
+
+[_taskID, 12, _pos1, _city1 getVariable "name"] call btc_task_fnc_create;
+
+//// Create markers \\\\
+private _marker1 = createMarker [format ["sm_2_%1", _pos1], _pos1];
+_marker1 setMarkerType "hd_flag";
+[_marker1, "str_a3_campaign_b_m06_marker01"] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker1]; //Convoy start
+_marker1 setMarkerSize [0.6, 0.6];
+
+private _marker2 = createMarker [format ["sm_2_%1", _pos2], _pos2];
+_marker2 setMarkerType "hd_flag";
+[_marker2, "STR_BTC_HAM_SIDE_CONVOY_MRKEND"] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker2]; //Convoy end
+_marker2 setMarkerSize [0.6, 0.6];
+
+private _area = createMarker [format ["sm_%1", _pos2], _pos2];
+_area setMarkerShape "ELLIPSE";
+_area setMarkerBrush "SolidBorder";
+_area setMarkerSize [_radius/2, _radius/2];
+_area setMarkerAlpha 0.3;
+_area setmarkercolor "colorBlue";
+
+private _markers = [_marker1, _marker2, _area];
+
+/// Show info path\\\
+private _veh_types = btc_type_motorized select {!(_x isKindOf "air")};
+private _agent = [btc_info_fnc_path, [_pos1, _pos2, _taskID, _veh_types select 0]] call CBA_fnc_directCall;
+private _startingPath = time;
+
+waitUntil {
+ !isNil {_agent getVariable "btc_path"} ||
+ {time > _startingPath + 10}
+};
+
+private _path = _agent getVariable ["btc_path", []];
+if (count _path <= 35) exitWith {
+ _markers append (allMapMarkers select {(_x select [0, count _taskID]) isEqualTo _taskID});
+ [_markers, [_agent]] call btc_fnc_delete;
+ [_taskID, "CANCELED"] call BIS_fnc_taskSetState;
+};
+
+//// Create convoy \\\\
+private _group = createGroup btc_enemy_side;
+_group setVariable ["no_cache", true];
+_group setVariable ["acex_headless_blacklist", true];
+[_group] call CBA_fnc_clearWaypoints;
+private _convoyLength = 3 + round random 2;
+private _listPositions = _path select [40, _convoyLength + 1];
+reverse _listPositions;
+[_group, ASLToAGL (_listPositions select 0), -1, "SENTRY", "SAFE", "RED", "LIMITED", "COLUMN"] call CBA_fnc_addWaypoint; // Make sure they don't move during spawn
+private _delay = 0;
+for "_i" from 1 to _convoyLength do {
+ private _pos = _listPositions deleteAt 0;
+ _delay = _delay + ([_group, ASLToAGL _pos, selectRandom _veh_types, (_listPositions select 0) getDir _pos] call btc_mil_fnc_createVehicle);
+};
+
+[{
+ params ["_group"];
+
+ _group call CBA_fnc_clearWaypoints;
+ _this call CBA_fnc_addWaypoint;
+ [12] remoteExecCall ["btc_fnc_show_hint", [0, -2] select isDedicated];
+
+ private _vehs = (units _group) apply {assignedVehicle _x};
+ {
+ _x addCuratorEditableObjects [_vehs arrayIntersect _vehs, false];
+ } forEach allCurators;
+}, [
+ _group, _pos2, -1, "MOVE", "SAFE", "RED", "LIMITED", "COLUMN",
+ format ["['%1', 'FAILED'] call BIS_fnc_taskSetState;", _taskID], [0, 0, 0], _radius/2
+], _delay] call btc_delay_fnc_waitAndExecute;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ ((units _group) apply {assignedVehicle _x}) select {canMove _x} isEqualTo [] ||
+ isNull _group
+};
+
+_markers append (allMapMarkers select {(_x select [0, count _taskID]) isEqualTo _taskID});
+
+private _vehs = (units _group) apply {assignedVehicle _x};
+_vehs = (_vehs arrayIntersect _vehs);
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [_markers, _vehs + [_group]] call btc_fnc_delete;
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "FAILED") exitWith {
+ _group setVariable ["no_cache", false];
+ {
+ private _group = createGroup btc_enemy_side;
+ (crew _x) joinSilent _group;
+ [btc_data_fnc_add_group, _group] call CBA_fnc_directCall;
+ } forEach _vehs;
+ [_markers] call btc_fnc_delete;
+};
+
+[_markers, _vehs + [_group]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+50 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/create.sqf
new file mode 100644
index 0000000..fcff81e
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/create.sqf
@@ -0,0 +1,46 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_create
+
+Description:
+ Create side mission inside the H&M task system.
+
+Parameters:
+ _cycle - Cycle side mission. [Boolean]
+ _side_fnc_name - Side mission function name. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_supply"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_cycle", false, [false]],
+ ["_side_fnc_name", "", [""]]
+];
+
+if (_side_fnc_name isEqualTo "") then {
+ if (btc_side_list_use isEqualTo []) then {
+ btc_side_list_use = btc_side_list call BIS_fnc_arrayShuffle;
+ };
+ _side_fnc_name = format ["btc_side_fnc_%1", btc_side_list_use deleteAt 0];
+};
+
+btc_side_ID = btc_side_ID + 1;
+private _tskID = format ["btc_tsk_%1", btc_side_ID];
+if ([_tskID] call BIS_fnc_taskExists) exitWith {
+ _this call btc_side_fnc_create;
+};
+
+[_tskID] call (missionNamespace getVariable [_side_fnc_name, {}]);
+
+if (_cycle) then {
+ [true] spawn btc_side_fnc_create;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/get_city.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/get_city.sqf
new file mode 100644
index 0000000..5578bfa
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/get_city.sqf
@@ -0,0 +1,48 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_get_city
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] spawn btc_side_fnc_get_city;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+
+[_taskID, 6, _city, _city getVariable "name"] call btc_task_fnc_create;
+
+_city setVariable ["spawn_more", true];
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !(_city getVariable ["occupied", false])
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/hack.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/hack.sqf
new file mode 100644
index 0000000..6a173bf
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/hack.sqf
@@ -0,0 +1,109 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_hack
+
+Description:
+ https://forums.bistudio.com/forums/topic/186316-how-to-open-the-land_dataterminal_01_f-data-terminal-nexus-update/
+ http://killzonekid.com/arma-scripting-tutorials-uav-r2t-and-pip/
+ http://killzonekid.com/arma-scripting-tutorials-scripted-charges/
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_hack"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+private _pos = [getPos _city, 100] call btc_fnc_randomize_pos;
+private _house = selectRandom (([_pos, 100] call btc_fnc_getHouses) select 0);
+if (isNil "_house") exitWith {[] spawn btc_side_fnc_create;};
+_pos = selectRandom (_house buildingPos -1);
+
+[_taskID, 16, _city, _city getVariable "name"] call btc_task_fnc_create;
+
+_city setVariable ["spawn_more",true];
+
+//// Create terminal \\\\
+private _terminalType = "Land_DataTerminal_01_F";
+private _terminal = createVehicle [_terminalType, [_pos, ASLToATL _pos] select surfaceIsWater _pos, [], 0, "CAN_COLLIDE"];
+_pos = [[_pos, 100] call btc_fnc_randomize_pos, 50, 500, 30, 0, 60 * (pi / 180), 0] call BIS_fnc_findSafePos;
+private _launchsite = createVehicle ["Land_PenBlack_F", _pos, [], 0, "FLY"];
+private _terminal_taskID = _taskID + "ter";
+[[_terminal_taskID, _taskID], 17, _terminal, _terminalType] call btc_task_fnc_create;
+
+//// Add interaction on Terminal \\\\
+_terminal setVariable ["btc_terminal_taskID", _terminal_taskID, true];
+[_terminal] remoteExecCall ["btc_int_fnc_terminal", [0, -2] select isDedicated, _terminal];
+
+waitUntil {sleep 5; (_terminal_taskID call BIS_fnc_taskCompleted)};
+if (_terminal_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], [_terminal]] call btc_fnc_delete;
+};
+
+private _defend_taskID = _taskID + "df";
+[[_defend_taskID, _taskID], 22, _terminal, _terminalType, true] call btc_task_fnc_create;
+
+private _groups = [];
+private _closest = [_city, values btc_city_all select {!(_x getVariable ["active", false])}, false] call btc_fnc_find_closecity;
+for "_i" from 1 to (2 + round random 1) do {
+ _groups pushBack ([btc_mil_fnc_send, [_closest, getPos _terminal, 1, selectRandom btc_type_motorized]] call CBA_fnc_directCall);
+};
+
+{
+ _x setBehaviour "CARELESS"
+} forEach _groups;
+
+[_terminal, _launchsite modelToWorld [0, 100, 10]] remoteExecCall ["btc_log_fnc_place_create_camera", [0, -2] select isDedicated];
+
+waitUntil {sleep 5;
+ _defend_taskID call BIS_fnc_taskCompleted ||
+ grpNull in _groups ||
+ !(_city getVariable ["active", false])
+};
+
+if (_defend_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], [_terminal]] call btc_fnc_delete;
+};
+
+if !(_city getVariable ["active", false]) exitWith {
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+ [[], [_terminal]] call btc_fnc_delete;
+};
+
+//// Launch the hacked missile \\\\
+_pos params ["_x", "_y"];
+private _altitude = 20;
+while {_altitude < 500} do {
+ _altitude = _altitude + 3;
+ (createVehicle ["DemoCharge_Remote_Ammo_Scripted", [_x, _y, _altitude], [], 0, "CAN_COLLIDE"]) setDamage 1;
+ sleep 0.1;
+};
+private _rocket = createVehicle ["ace_rearm_Missile_AGM_02_F", [_x, _y, _altitude], [], 0, "CAN_COLLIDE"];
+private _fx = createVehicle ["test_EmptyObjectForSmoke", [_x, _y, _altitude], [], 0, "CAN_COLLIDE"];
+_fx attachTo [_rocket, [0, 0, 0]];
+
+[[], [_rocket, _terminal, _fx]] call btc_fnc_delete;
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/hostage.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/hostage.sqf
new file mode 100644
index 0000000..9831cb3
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/hostage.sqf
@@ -0,0 +1,121 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_hostage
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_hostage"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose an occupied City \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+
+//// Randomise position \\\\
+private _houses = ([getPos _city, 100] call btc_fnc_getHouses) select 0;
+_houses = _houses select {count (_x buildingPos -1) > 1}; // Building with low enterable positions are not interesting
+if (_houses isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+_houses = _houses apply {[count (_x buildingPos -1), _x]};
+_houses sort false;
+private _house = objNull;
+if (count _houses > 3) then {
+ _house = (selectRandom _houses select [0,3]) select 1;
+} else {
+ _house = _houses select 0 select 1;
+};
+private _buildingPos = _house buildingPos -1;
+_buildingPos = _buildingPos select [0, count _buildingPos min 20];
+private _pos_number = count _buildingPos - 1;
+private _pos = _buildingPos select (_pos_number - ((round random 1) min _pos_number));
+
+_city setVariable ["spawn_more", true];
+
+//// Hostage
+private _group_civ = createGroup civilian;
+_group_civ setVariable ["no_cache", true];
+private _civType = selectRandom btc_civ_type_units;
+private _captive = _group_civ createUnit [_civType, _pos, [], 0, "CAN_COLLIDE"];
+waitUntil {local _captive};
+[_captive, true] call ACE_captives_fnc_setHandcuffed;
+private _i = 0;
+while {insideBuilding _captive < 0.1 && _i < count _buildingPos} do {
+ _pos = _buildingPos select _i;
+ _captive setPosATL _pos;
+ _i = _i + 1;
+};
+
+//// Data side mission
+[_taskID, 15, _captive, [_city getVariable "name", _civType]] call btc_task_fnc_create;
+
+private _group = [];
+{
+ private _grp = createGroup btc_enemy_side;
+ private _unit = _grp createUnit [selectRandom btc_type_units, _x, [], 0, "CAN_COLLIDE"];
+ [_unit] joinSilent _grp;
+ _group pushBack _grp;
+ _grp setVariable ["no_cache", true];
+ _grp setVariable ["btc_city", _city];
+} forEach (_buildingPos - [_pos]);
+
+_trigger = createTrigger ["EmptyDetector", _pos, false];
+_trigger setVariable ["group", _group];
+_trigger setTriggerArea [20, 20, 0, false];
+_trigger setTriggerActivation [str btc_player_side, "PRESENT", true];
+_trigger setTriggerStatements ["this", "private _group = thisTrigger getVariable 'group'; {_x setCombatMode 'RED';} forEach _group;", "private _group = thisTrigger getVariable 'group'; {_x setCombatMode 'WHITE';} forEach _group;"];
+
+private _mine = objNull;
+if (random 1 > 0.5) then {
+ sleep 5;
+ _mine = createMine [selectRandom btc_type_mines, getPosATL _captive, [], 0];
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !(_captive getVariable ["ace_captives_isHandcuffed", false]) ||
+ !alive _captive
+};
+
+if (!(_captive getVariable ["ace_captives_isHandcuffed", false])) then {
+ _mine setDamage 1;
+ sleep 1;
+};
+
+_group_civ setVariable ["no_cache", false];
+{
+ _x setVariable ["no_cache", false];
+} forEach _group;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], _group + [_group_civ, _trigger, _mine]] call btc_fnc_delete;
+};
+if !(alive _captive) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ [[], _group + [_group_civ, _trigger, _mine]] call btc_fnc_delete;
+};
+
+40 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/kill.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/kill.sqf
new file mode 100644
index 0000000..0bca656
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/kill.sqf
@@ -0,0 +1,175 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_kill
+
+Description:
+ Your objective is to assassinate a man and bring his dogtag to base for identification.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_kill"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose an occupied City \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+
+//// Randomise position \\\\
+private _houses = ([getPos _city, 100] call btc_fnc_getHouses) select 0;
+_houses = _houses select {count (_x buildingPos -1) > 3}; // Building with low enterable positions are not interesting
+if (_houses isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+_houses = _houses apply {[count (_x buildingPos -1), _x]};
+_houses sort false;
+private _house = objNull;
+if (count _houses > 3) then {
+ _house = (selectRandom _houses select [0,3]) select 1;
+} else {
+ _house = _houses select 0 select 1;
+};
+private _buildingPos = _house buildingPos -1;
+_buildingPos = _buildingPos select [0, count _buildingPos min 20];
+private _pos_number = count _buildingPos - 1;
+private _pos = _buildingPos select (_pos_number - ((round random 1) min _pos_number));
+
+_city setVariable ["spawn_more", true];
+
+//// Officer
+private _group_officer = createGroup btc_enemy_side;
+_group_officer setVariable ["no_cache", true];
+private _officerType = selectRandom btc_type_units;
+private _officer = _group_officer createUnit [_officerType, _pos, [], 0, "CAN_COLLIDE"];
+private _i = 0;
+while {insideBuilding _officer < 0.1 && _i < count _buildingPos} do {
+ _pos = _buildingPos select _i;
+ _officer setPosATL _pos;
+ _i = _i + 1;
+};
+
+//// Data side mission
+private _officerName = name _officer;
+[_taskID, 25, objNull, [_officerName, _city getVariable "name"]] call btc_task_fnc_create;
+private _kill_taskID = _taskID + "ki";
+[[_kill_taskID, _taskID], 26, _officer, [_officerName, _city getVariable "name", _officerType]] call btc_task_fnc_create;
+
+private _ehDeleted = [_officer, "Deleted", {
+ params [
+ ["_officer", objNull, [objNull]]
+ ];
+ _thisArgs params ["_taskID"];
+
+ _officer removeEventHandler [_thisType, _thisID];
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+}, [_taskID]] call CBA_fnc_addBISEventHandler;
+
+private _group = [];
+{
+ private _grp = createGroup btc_enemy_side;
+ private _unit = _grp createUnit [selectRandom btc_type_units, _x, [], 0, "CAN_COLLIDE"];
+ [_unit] joinSilent _grp;
+ _group pushBack _grp;
+ _grp setVariable ["no_cache", true];
+ _grp setVariable ["btc_city", _city];
+} forEach (_buildingPos - [_pos]);
+
+_trigger = createTrigger ["EmptyDetector", _pos, false];
+_trigger setVariable ["group", _group];
+_trigger setTriggerArea [20, 20, 0, false];
+_trigger setTriggerActivation [str btc_player_side, "PRESENT", true];
+_trigger setTriggerStatements ["this", "private _group = thisTrigger getVariable 'group'; {_x setCombatMode 'RED';} forEach _group;", "private _group = thisTrigger getVariable 'group'; {_x setCombatMode 'WHITE';} forEach _group;"];
+
+private _toDelete = _group + [_group_officer, _trigger];
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !alive _officer
+};
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[], _toDelete] call btc_fnc_delete;
+};
+
+[_kill_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+private _dogTag_taskID = _taskID + "dt";
+[[_dogTag_taskID, _taskID], 27, _officer, _officerName] call btc_task_fnc_create;
+private _officer_dogtagData = [_officer] call ace_dogtags_fnc_getDogtagData;
+private _globalVariableName = format ["btc_%1", _dogTag_taskID];
+
+["btc_side_killDogTagFound", {
+ params ["_globalVariableName", "_dogTag"];
+ _thisArgs params ["_officer_dogtagData", "_dogTag_taskID", "_taskID", "_thisArgs_globalVariableName", "_officer", "_ehDeleted"];
+
+ if (_thisArgs_globalVariableName isEqualTo _globalVariableName) then {
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ _officer removeEventHandler ["Deleted", _ehDeleted];
+
+ [_dogTag_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ [[_taskID + "bs", _taskID], 28, btc_create_object_point, [_officer_dogtagData select 0, typeOf btc_create_object_point]] call btc_task_fnc_create;
+ missionNamespace setVariable [_globalVariableName, _dogTag];
+ [_dogTag, _taskID] remoteExecCall ["btc_eh_fnc_trackItem", [0, -2] select isDedicated, _officer];
+ };
+}, [_officer_dogtagData, _dogTag_taskID, _taskID, _globalVariableName, _officer, _ehDeleted]] call CBA_fnc_addEventHandlerArgs;
+
+["ace_dogtags_broadcastDogtagInfo", {
+ params ["_dogTag", "_dogTagData"];
+ _thisArgs params ["_officer_dogTagData", "_dogTag_taskID", "_taskID", "_globalVariableName"];
+
+ if (_dogTagData isEqualTo _officer_dogTagData) then {
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ ["btc_side_killDogTagFound", [_globalVariableName, _dogTag]] call CBA_fnc_serverEvent;
+ };
+ _this
+}, [_officer_dogTagData, _dogTag_taskID, _taskID, _globalVariableName]] remoteExecCall ["CBA_fnc_addEventHandlerArgs", [0, -2] select isDedicated, _officer];
+
+private _IDEH_HandleDisconnect = [missionNamespace, "HandleDisconnect", {
+ params [
+ ["_player", objNull, [objNull]]
+ ];
+ _thisArgs params ["_globalVariableName", "_taskID"];
+
+ if ((missionNamespace getVariable [_globalVariableName, ""]) in items _player) then {
+ removeMissionEventHandler [_thisType, _thisID];
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+ };
+}, [_globalVariableName, _taskID]] call CBA_fnc_addBISEventHandler;
+
+waitUntil {sleep 5;
+ true in (
+ (
+ allPlayers inAreaArray [getPosWorld btc_create_object_point, 100, 100]
+ ) apply {(missionNamespace getVariable [_globalVariableName, ""]) in itemCargo vehicle _x}
+ ) ||
+ _taskID call BIS_fnc_taskCompleted
+};
+
+_group_officer setVariable ["no_cache", false];
+{
+ _x setVariable ["no_cache", false];
+} forEach _group;
+
+[[], _toDelete] call btc_fnc_delete;
+removeMissionEventHandler ["HandleDisconnect", _IDEH_HandleDisconnect];
+if ((_taskID call BIS_fnc_taskState) in ["CANCELED", "FAILED"]) exitWith {[_taskID, _taskID call BIS_fnc_taskState] call btc_task_fnc_setState};
+
+40 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/massacre.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/massacre.sqf
new file mode 100644
index 0000000..915ec70
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/massacre.sqf
@@ -0,0 +1,143 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_massacre
+
+Description:
+ Move all dead civilians in a grave next to a church, inspired by Bucha massacre (Ukraine).
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_massacre"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose an occupied City \\\\
+private _useful = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+[_useful, true] call CBA_fnc_shuffle;
+private _city = objNull;
+private _church = objNull;
+while {_useful isNotEqualTo []} do {
+ _city = _useful deleteAt 0;
+ _church = nearestTerrainObjects [_city, ["CHURCH", "CHAPEL"], 470];
+ if (_church isNotEqualTo []) then {
+ break;
+ };
+};
+if (_useful isEqualTo [] and _church isEqualTo []) exitWith {
+ [] spawn btc_side_fnc_create;
+};
+
+private _pos = getPos _city;
+private _radius = _city getVariable ["cachingRadius", 0];
+private _roads = _pos nearRoads _radius/2;
+_roads = _roads select {isOnRoad _x};
+if (_roads isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _road = selectRandom _roads;
+
+private _churchSorted = _church apply {[_road distance _x, _x]};
+_churchSorted sort true;
+_church = _churchSorted select 0 select 1;
+[_taskID, 42, _church, [_city getVariable "name", typeOf _church]] call btc_task_fnc_create;
+
+private _group = createGroup civilian;
+private _civilians = [];
+private _composition = [];
+private _tasksID = [];
+private _objtTypes = btc_type_sports + ["Land_Suitcase_F"] + btc_type_sleepingbag_folded;
+[_objtTypes, true] call CBA_fnc_shuffle;
+
+for "_i" from 1 to (2 + round random 3) do {
+ private _roadPos = [_road, 3] call btc_ied_fnc_randomRoadPos;
+ _roadPos params ["_pos", "_dir"];
+ _pos = _pos getPos [random 5, _dir];
+ private _unit = _group createUnit [selectRandom btc_civ_type_units, _pos, [], 0, "CAN_COLLIDE"];
+ if (selectRandom [true, false]) then {
+ [position _unit, 0.05, 1.5] call BIS_fnc_flies;
+ };
+ _unit setDir random 360;
+ _unit setVariable ["btc_dont_delete", true];
+ _unit setDamage 1;
+ _civilians pushBack _unit;
+
+ private _obj = createVehicle [selectRandom (btc_type_bottles + ["Land_FMradio_F", "Land_MobilePhone_smart_F","Land_RiceBox_F", "Land_Orange_01_F"]), _pos, [], 2, "NONE"];
+ _obj addTorque [4,0,0];
+ _composition pushBack _obj;
+
+ _roadPos params ["_pos", "_dir"];
+ _pos = _pos getPos [random 2, _dir];
+ private _obj = createVehicle [selectRandom btc_type_bloods, _pos, [], 0, "CAN_COLLIDE"];
+ _obj setDir random 360;
+ _obj setVectorUp surfaceNormal _pos;
+ _composition pushBack _obj;
+
+ private _roadPos = [_road, 3] call btc_ied_fnc_randomRoadPos;
+ _roadPos params ["_pos", "_dir"];
+ _pos = _pos getPos [random 10, _dir];
+ private _obj = createVehicle [_objtTypes deleteAt 0, _pos, [], 0, "CAN_COLLIDE"];
+ _obj setDir random 360;
+ _obj addTorque [6,0,0];
+ _composition pushBack _obj;
+
+ private _civ_taskID = _taskID + "cv" + str _i;
+ _tasksID pushBack _civ_taskID;
+ [[_civ_taskID, _taskID], 43, _unit, [name _unit, typeOf _unit], false, false] call btc_task_fnc_create;
+ _unit setVariable ["btc_rep_playerKiller", _civ_taskID];
+ if (roadsConnectedTo _road isNotEqualTo []) then {
+ _road = (roadsConnectedTo _road) select 0;
+ };
+};
+
+["ace_placedInBodyBag", {
+ params ["_patient", "_bodyBag", "_isGrave", "_medic"];
+ if (
+ !(_patient in _thisArgs)
+ ) exitWith {};
+
+ _thisArgs deleteAt (_thisArgs find _patient);
+ private _taskID = _patient getVariable ["btc_rep_playerKiller", ""];
+ if (_isGrave) then {
+ [{
+ params ["_restingPlace", "_taskID"];
+ private _church = nearestTerrainObjects [_restingPlace, ["CHURCH", "CHAPEL"], 50];
+ if (_church isEqualTo []) then {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ } else {
+ [_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ };
+ }, [_bodyBag, _taskID], 0.2] call CBA_fnc_waitAndExecute;
+ } else {
+ _thisArgs pushBack _bodyBag;
+ [_taskID, _bodyBag] call BIS_fnc_taskSetDestination;
+ };
+}, _civilians] call CBA_fnc_addEventHandlerArgs;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ _civilians select {!isNull _x} isEqualTo []
+};
+
+[[], _civilians + [_group] + _composition] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+if ("FAILED" in (_tasksID apply {_x call BIS_fnc_taskState})) then {
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+} else {
+ [_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
+}
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/mines.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/mines.sqf
new file mode 100644
index 0000000..6e1664c
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/mines.sqf
@@ -0,0 +1,131 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_mines
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] spawn btc_side_fnc_mines;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) then {_useful = values btc_city_all;};
+
+private _city = selectRandom _useful;
+private _pos = [getPos _city, 0, _city getVariable ["cachingRadius", 100], 30, false] call btc_fnc_findsafepos;
+if (_pos select 2 > 50) exitWith {[] spawn btc_side_fnc_create;};
+
+[_taskID, 4, _pos, _city getVariable "name"] call btc_task_fnc_create;
+
+private _distance_between_fences = 8.1;
+private _number_of_fences = 3 + floor random 4;
+private _area_size = _distance_between_fences * _number_of_fences;
+private _offset = _area_size + _distance_between_fences/2;
+
+private _area = createMarker [format ["sm_%1", _pos], _pos];
+_area setMarkerShape "RECTANGLE";
+_area setMarkerBrush "SolidBorder";
+_area setMarkerSize [_offset, _offset];
+_area setMarkerAlpha 0.3;
+_area setmarkercolor "colorBlue";
+
+//// Randomise composition \\\\
+private _cone = selectRandom btc_type_cones;
+private _fences = + btc_type_fences;
+_fences pushBack _cone;
+private _fence = selectRandom _fences;
+
+private _offset_door = - 60 + _offset;
+private _composition_pattern = [
+ [selectRandom btc_type_bloods,81,[56.0991 + _offset_door,5.71729,0]],
+ [_cone,0,[60.3545 + _offset_door,5.86768,0]],
+ [_cone,0,[60.3755 + _offset_door,9.47217,0]],
+ [selectRandom btc_type_portable_light,101,[61.1982 + _offset_door,3.28906,0]],
+ [selectRandom btc_type_portable_light,37,[60.7373 + _offset_door,11.856,0]],
+ [selectRandom btc_type_bloods,131,[61.9722 + _offset_door,5.49609,0]],
+ [selectRandom btc_type_body_bags,332,[62.4473 + _offset_door,0.76416,0]],
+ [selectRandom btc_type_bloods,94,[62.3799 + _offset_door,8.66309,0]],
+ [selectRandom btc_type_bloods,0,[65.3276 + _offset_door,1.97803,0]],
+ [selectRandom btc_type_medicals,0,[65.4448 + _offset_door,1.52734,0]],
+ [selectRandom btc_type_first_aid_kits,0,[65.6187 + _offset_door,0.109863,0]],
+ [selectRandom btc_type_power,223,[63.9292 + _offset_door,14.8687,0]],
+ [selectRandom (btc_type_barrel + btc_type_canister),0,[66.4707 + _offset_door,0.0717773,0]]
+];
+
+for "_i" from -_number_of_fences to _number_of_fences do {
+ _composition_pattern append [
+ [_fence, 0, [_i * _distance_between_fences, -_offset, 0]],
+ [_fence, 0, [_i * _distance_between_fences, _offset, 0]],
+ [_fence, 90, [ -_offset, _i * _distance_between_fences, 0]]
+ ];
+ if (_i isNotEqualTo 1) then {
+ _composition_pattern pushBack [_fence, 90, [_offset, _i * _distance_between_fences, 0]];
+ };
+
+ if (random 1 > 0.7) then {
+ _composition_pattern append [
+ [selectRandom btc_type_signs, 180, [_i * _distance_between_fences, _offset - 1, 0]],
+ [selectRandom btc_type_signs, 0, [_i * _distance_between_fences, -_offset + 1, 0]],
+ [selectRandom btc_type_signs, 270, [_offset - 1, _i * _distance_between_fences, 0]],
+ [selectRandom btc_type_signs, 90, [ -_offset + 1, _i * _distance_between_fences, 0]]
+ ];
+ };
+};
+
+private _composition_objects = [_pos, selectRandom [0, 90, 180, 270], _composition_pattern] call btc_fnc_create_composition;
+
+private _mines = [];
+for "_i" from 1 to (5 + round random 5) do {
+ private _type = "ATMine";
+ if (random 1 > 0.6) then {_type = selectRandom btc_type_mines;};
+ private _m_pos = [_pos, _area_size - 10] call btc_fnc_randomize_pos;
+ _mines pushBack createMine [_type, _m_pos, [], 0];
+
+ if (random 1 > 0.8) then {
+ _m_pos = [_pos, _area_size - 10] call btc_fnc_randomize_pos;
+ private _s = createVehicle [selectRandom btc_type_signs, _m_pos, [], 10, "CAN_COLLIDE"];
+ _s setDir random 360;
+ _composition_objects pushBack _s;
+ };
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ playableUnits inAreaArray [_pos, 100, 100] isNotEqualTo []
+};
+
+private _closest = [_city, values btc_city_all select {!(_x getVariable ["active", false])}, false] call btc_fnc_find_closecity;
+for "_i" from 1 to (round random 2) do {
+ [btc_mil_fnc_send, [_closest, _pos, 1, selectRandom btc_type_motorized]] call CBA_fnc_directCall;
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ _mines select {!isNull _x} isEqualTo []
+};
+
+[[_area], _mines + _composition_objects] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+30 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/pandemic.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/pandemic.sqf
new file mode 100644
index 0000000..f1a698a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/pandemic.sqf
@@ -0,0 +1,99 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_pandemic
+
+Description:
+ Decontaminate civilian with a little shower. To locate civilian go to the subtask, follow red blood drop and use your chemical detector.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_pandemic"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _minNumberOfSubTask = 2;
+private _useful = values btc_city_all select {
+ !(_x getVariable ["type", ""] in ["NameMarine", "StrongpointArea"]) &&
+ {!(_x getVariable ["active", false])} &&
+ {
+ private _city = _x;
+ ({
+ (_x select 0) isEqualTo 6 &&
+ {(_x select 3) isEqualTo civilian}
+ } count (_city getVariable ["data_units", []])) >= _minNumberOfSubTask
+ }
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+private _dataCivilian = (_city getVariable ["data_units", []]) select {
+ (_x select 0) isEqualTo 6 &&
+ {(_x select 3) isEqualTo civilian}
+};
+private _extraCiv = round random (((count _dataCivilian) - _minNumberOfSubTask) min 2);
+
+[_taskID, 40, objNull, _city getVariable "name"] call btc_task_fnc_create;
+
+private _tasksID = [];
+for "_i" from 0 to (_minNumberOfSubTask + _extraCiv - 1) do {
+ private _deconta_taskID = _taskID + "dc" + str _i;
+ _tasksID pushBack _deconta_taskID;
+
+ private _selectedCiv = _dataCivilian select _i;
+ [[_deconta_taskID, _taskID], 41, _selectedCiv select 1 select 0, _selectedCiv select 2 select 0, false, false] call btc_task_fnc_create;
+
+ [{
+ params ["_city", "_civPos", "_civType"];
+ _city getVariable ["active", false] &&
+ {nearestObjects [_civPos, [_civType], 10] isNotEqualTo []}
+ }, {
+ params ["_city", "_civPos", "_civType", "_deconta_taskID"];
+ private _civ = (nearestObjects [_civPos, [_civType], 10]) select 0;
+ (group _civ) setVariable ["acex_headless_blacklist", true];
+ btc_chem_contaminated pushBack _civ;
+ publicVariable "btc_chem_contaminated";
+
+ [{
+ params ["_civ", "_deconta_taskID"];
+ !alive _civ ||
+ !(_civ in btc_chem_contaminated)
+ }, {
+ params ["_civ", "_deconta_taskID"];
+ if (_deconta_taskID call BIS_fnc_taskCompleted) exitWith {};
+ if (!alive _civ) exitWith {
+ [_deconta_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ };
+ [_deconta_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ }, [_civ, _deconta_taskID]] call CBA_fnc_waitUntilAndExecute;
+ }, [_city, _selectedCiv select 1 select 0, _selectedCiv select 2 select 0, _deconta_taskID]] call CBA_fnc_waitUntilAndExecute;
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !(false in (_tasksID apply {_x call BIS_fnc_taskCompleted}))
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+if !("SUCCEEDED" in (_tasksID apply {_x call BIS_fnc_taskState})) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+};
+
+{
+ if (_x call BIS_fnc_taskState isEqualTo "SUCCEEDED") then {
+ 15 call btc_rep_fnc_change;
+ };
+} forEach _tasksID;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/removeRubbish.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/removeRubbish.sqf
new file mode 100644
index 0000000..dc4d9f0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/removeRubbish.sqf
@@ -0,0 +1,89 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_removeRubbish
+
+Description:
+ Remove rubbish on road in city with Nemmera.
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_removeRubbish"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _minNumberOfSubTask = 2;
+private _useful = values btc_city_all select {
+ !(_x getVariable ["type", ""] in ["NameMarine", "StrongpointArea"]) &&
+ {
+ private _city = _x;
+ ({
+ isOnRoad (_x select 0) ||
+ {((_x select 0) nearRoads 6) isNotEqualTo []} // Most IED are just next to road
+ } count (_city getVariable ["ieds", []])) >= _minNumberOfSubTask
+ }
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+private _ieds = (_city getVariable ["ieds", []]) select {
+ isOnRoad (_x select 0) ||
+ {((_x select 0) nearRoads 6) isNotEqualTo []}
+};
+private _extra_ied = round random (((count _ieds) - _minNumberOfSubTask) min 2);
+
+[_taskID, 38, objNull, _city getVariable "name"] call btc_task_fnc_create;
+
+private _tasksID = [];
+for "_i" from 0 to (_minNumberOfSubTask + _extra_ied - 1) do {
+ private _clear_taskID = _taskID + "cl" + str _i;
+ _tasksID pushBack _clear_taskID;
+
+ private _selectedIED = _ieds select _i;
+ [[_clear_taskID, _taskID], 39, _selectedIED select 0, btc_type_ieds select (btc_model_ieds find (_selectedIED select 1)), false, false] call btc_task_fnc_create;
+
+ ["btc_ied_deleted", {
+ params ["_posDeleted_ied"];
+ _thisArgs params ["_clear_taskID", "_pos_ied"];
+
+ if (!(_clear_taskID call BIS_fnc_taskCompleted) && {_pos_ied distance _posDeleted_ied < 5}) then {
+ [_clear_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ if (0.5 < random 1) then {
+ [_posDeleted_ied] call btc_rep_fnc_call_militia;
+ };
+ };
+ }, [_clear_taskID, _selectedIED select 0]] call CBA_fnc_addEventHandlerArgs;
+ ["btc_ied_boom", {
+ params ["_posDeleted_ied"];
+ _thisArgs params ["_clear_taskID", "_pos_ied"];
+
+ if (!(_clear_taskID call BIS_fnc_taskCompleted) && {_pos_ied distance _posDeleted_ied < 5}) then {
+ [_clear_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ };
+ }, [_clear_taskID, _selectedIED select 0]] call CBA_fnc_addEventHandlerArgs;
+};
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !(false in (_tasksID apply {_x call BIS_fnc_taskCompleted}))
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+if !("SUCCEEDED" in (_tasksID apply {_x call BIS_fnc_taskState})) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+};
+
+2 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/rescue.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/rescue.sqf
new file mode 100644
index 0000000..fd85976
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/rescue.sqf
@@ -0,0 +1,168 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_rescue
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_rescue"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose an occupied City \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+
+//// Randomise position \\\\
+private _pos = [getPos _city, (_city getVariable ["cachingRadius", 0])/2 - 100] call btc_fnc_randomize_pos;
+_pos = [_pos, 0, 50, 13, 0, 60 * (pi / 180), 0] call btc_fnc_findsafepos;
+
+_city setVariable ["spawn_more", true];
+
+waitUntil {!isNil "btc_vehicles"}; // Wait for loading vehicles from db
+
+private _heli_type = typeOf selectRandom ((btc_vehicles + btc_veh_respawnable) select {
+ _x isKindOf "air" &&
+ {!(unitIsUAV _x)}
+});
+private _heli = createVehicle [_heli_type, _pos, [], 0, "NONE"];
+_heli setVariable ["btc_dont_delete", true];
+_heli setVariable ["ace_cookoff_enableAmmoCookoff", false, true];
+_heli setDamage [1, false];
+_heli enableSimulation false;
+_heli setPos [getPosASL _heli select 0, getPosASL _heli select 1, 0 - 1.5];
+private _pitch = if (random 1 > 0.5) then {
+ random 40
+} else {
+ -1 * random 40
+};
+private _bank = if (random 1 > 0.5) then {
+ random 40
+} else {
+ -1 * random 40
+};
+[_heli, _pitch, _bank] call BIS_fnc_setPitchBank;
+private _fx = createVehicle ["test_EmptyObjectForSmoke", _pos, [], 0, "CAN_COLLIDE"];
+
+private _group = createGroup btc_player_side;
+_group setVariable ["no_cache", true];
+private _crew = getText (configfile >> "CfgVehicles" >> _heli_type >> "crew");
+_crew createUnit [_pos, _group];
+
+[_taskID, 13, _city, _city getVariable "name"] call btc_task_fnc_create;
+private _find_taskID = _taskID + "mv";
+[[_find_taskID, _taskID], 20, objNull, _crew] call btc_task_fnc_create;
+private _back_taskID = _taskID + "bk";
+
+private _units = [];
+private _triggers = [];
+{
+ _x setVariable ["kjw_imposters_core_ignore", true, true]; // Prevent KJW Imposters from resetting captive state
+ _x setCaptive true;
+ removeAllWeapons _x;
+ _x setBehaviour "CARELESS";
+ _x setDir (random 360);
+ _x setUnitPos "DOWN";
+ _units pushBack _x;
+ //// Create trigger \\\\
+ private _trigger = createTrigger ["EmptyDetector", getPos _city, false];
+ _trigger setVariable ["unit", _x];
+ _trigger setTriggerArea [20, 20, 0, false, 10];
+ _trigger setTriggerActivation [str btc_player_side, "PRESENT", false];
+ _trigger setTriggerStatements ["this", format ["_unit = thisTrigger getVariable 'unit'; [_unit] join (thisList select 0); _unit setUnitPos 'UP'; ['%1', 'SUCCEEDED'] call BIS_fnc_taskSetState; [['%2', '%3'], 21, btc_create_object_point, typeOf btc_create_object_point, true] call btc_task_fnc_create;", _find_taskID, _back_taskID, _taskID], ""];
+ _trigger attachTo [_x, [0, 0, 0]];
+ _triggers pushBack _trigger;
+} forEach units _group;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ _units select {_x distance btc_create_object_point > 100} isEqualTo [] ||
+ _units select {alive _x} isEqualTo []
+};
+
+private _rep = 50;
+if (_units select {alive _x} isEqualTo []) then {
+ [_back_taskID, "FAILED"] call BIS_fnc_taskSetState;
+ private _bodyBag_taskID = _taskID + "bb";
+ {
+ private _IDDeleted = [_x, "Deleted", {
+ params [
+ ["_unit", objNull, [objNull]]
+ ];
+ _thisArgs params ["_taskID"];
+
+ if (_unit inArea [[-5000, -5000, 0], 10, 10, 0, false]) exitWith {}; // Detect if the body is inside a bodybag (https://github.com/acemod/ACE3/blob/44050df98b00e579e5b5a79c0d76d4d1138b4baa/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf#L40)
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+ }, [_taskID]] call CBA_fnc_addBISEventHandler;
+
+ private _unitBodyBag_taskID = _bodyBag_taskID + str(_forEachIndex);
+ [[_unitBodyBag_taskID, _taskID], 34, _x, [([_x] call ace_dogtags_fnc_getDogtagData) select 0, typeOf _x]] call btc_task_fnc_create;
+ ["ace_placedInBodyBag", {
+ params ["_patient", "_bodyBag"];
+ _thisArgs params ["_unit", "_unitBodyBag_taskID", "_taskID", "_IDDeleted"];
+
+ if (_patient isEqualTo _unit) then {
+ _patient removeEventHandler ["Deleted", _IDDeleted];
+
+ [_thisType, _thisId] call CBA_fnc_removeEventHandler;
+ [_unitBodyBag_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+
+ private _base_taskID = _taskID + "bs";
+ [[_base_taskID, _taskID], 35, btc_create_object_point, [([_patient] call ace_dogtags_fnc_getDogtagData) select 0, typeOf btc_create_object_point]] call btc_task_fnc_create;
+
+ [_bodyBag, "Deleted", {
+ params [
+ ["_bodyBag", objNull, [objNull]]
+ ];
+ _thisArgs params ["_taskID"];
+
+ if (_taskID call BIS_fnc_taskCompleted) exitWith {};
+ [_taskID, "FAILED"] call btc_task_fnc_setState;
+ }, [_taskID]] call CBA_fnc_addBISEventHandler;
+ };
+ _this
+ }, [_x, _unitBodyBag_taskID, _taskID, _IDDeleted]] call CBA_fnc_addEventHandlerArgs;
+ } forEach _units;
+
+ private _dogTagList = _units apply {([_x] call ace_dogtags_fnc_getDogtagData) select 0};
+
+ waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ {
+ (([_x] call ace_dogtags_fnc_getDogtagData) select 0) in _dogTagList
+ } count (nearestObjects [btc_create_object_point, ["ACE_bodyBagObject"], 100]) >= count _units
+ };
+ _rep = 40;
+};
+
+{
+ deleteVehicle _x;
+} forEach _triggers;
+[[], [_heli, _fx, _group] + _units] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState in ["CANCELED", "FAILED"]) exitWith {};
+
+_rep call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/supply.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/supply.sqf
new file mode 100644
index 0000000..f9154db
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/supply.sqf
@@ -0,0 +1,123 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_supply
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_supply"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+
+if (_useful isEqualTo []) then {_useful = values btc_city_all;};
+
+private _city = selectRandom _useful;
+private _pos = [getPos _city, 100] call btc_fnc_randomize_pos;
+_pos = [_pos, 0, _city getVariable ["cachingRadius", 100], 20, false] call btc_fnc_findsafepos;
+
+[_taskID, 3, _city, _city getVariable "name"] call btc_task_fnc_create;
+private _move_taskID = _taskID + "mv";
+[[_move_taskID, _taskID], 18, _pos, btc_supplies_cargo] call btc_task_fnc_create;
+
+private _area = createMarker [format ["sm_%1", _pos], _pos];
+_area setMarkerShape "ELLIPSE";
+_area setMarkerBrush "SolidBorder";
+_area setMarkerSize [30, 30];
+_area setMarkerAlpha 0.3;
+_area setmarkercolor "colorBlue";
+
+private _type_cone = selectRandom btc_type_cones;
+private _fences = selectRandom btc_type_fences;
+private _composition = [
+ [_type_cone,random 360,[0.751953,-0.587891,0]],
+ [selectRandom btc_type_foodSack, random 360,[-0.498047,-0.949219,0]],
+ [_type_cone,random 360,[0.671875,0.769531,0]],
+ [_type_cone,random 360,[-1.25586,-0.566406,0]],
+ [selectRandom btc_type_garbage,0,[0.808594,1.31055,0]],
+ [_type_cone,random 360,[-1.33594,0.791016,0]],
+ [selectRandom btc_type_table,0,[-0.195313,-1.65039,0]],
+ [_type_cone,random 360,[0.648438,2.17578,0]],
+ [selectRandom btc_type_table,0,[1.82031,-1.66406,0]],
+ [_type_cone,random 360,[-1.35938,2.19727,0]],
+ [_type_cone,random 360,[2.57227,0.550781,0]],
+ [selectRandom btc_type_table,0,[-2.19727,-1.64844,0]],
+ [_type_cone,random 360,[2.65234,-0.806641,0]],
+ ["Land_ShelvesWooden_F",0,[0.748047,-2.67383,0]],
+ [selectRandom btc_type_seat,169,[0.0859375,-2.95898,0]],
+ ["Land_ShelvesWooden_F",0,[-1.19922,-2.7168,0]],
+ [_type_cone,random 360,[-3.09766,-0.724609,0]],
+ [_type_cone,random 360,[2.54883,1.95703,0]],
+ [_type_cone,random 360,[-3.17773,0.632813,0]],
+ [selectRandom btc_type_seat,175,[2.02148,-2.80078,0]],
+ [selectRandom btc_type_seat,198,[-2.48242,-2.75781,0]],
+ [_type_cone,random 360,[-3.20117,2.03906,0]],
+ [selectRandom btc_type_PaperBox,random 360,[0.732422,-3.97656,0]],
+ [selectRandom btc_type_PaperBox,random 360,[-1.16016,-3.96289,0]],
+ [selectRandom btc_type_EmergencyBlanket,random 360,[-3.34766,-3.17383,0]],
+ [selectRandom btc_type_Sponsor,201,[-4.64453,2.35352,0]],
+ [selectRandom btc_type_Scrapyard, random 360,[-5.15234,-4.17969,0]],
+ [selectRandom btc_type_portable_light,150,[2.60156,-6.82031,0]],
+ [_fences,24,[6.77148,-3.02344,0]],
+ [_fences,321,[-6.625,-3.70313,0]],
+ [selectRandom btc_type_power,117,[5.92578,-5.69336,0]],
+ ["Flag_IDAP_F",0,[-3.80859,-6.70703,0]],
+ [selectRandom btc_type_EmergencyBlanket,random 360,[-2.17969,-8.61328,0]],
+ [selectRandom btc_type_foodSack, random 360,[2.6875,-9.44531,0]],
+ [selectRandom btc_type_Sponsor,204,[9.34766,-5.02539,0]],
+ [selectRandom btc_type_PlasticCase,353,[-2.60156,-11.7715,0]],
+ [selectRandom btc_type_MedicalTent,0,[0.322266,-12.4043,0]],
+ [selectRandom btc_type_PaperBox,random 360,[2.94531,-14.9102,0]],
+ [selectRandom btc_type_seat,229,[-2.07422,-15.2441,0]],
+ [selectRandom btc_type_cargo_ruins,300,[-10.0488,-12.1152,0]]
+];
+private _direction_composition = random 360;
+private _composition_objects = [_pos, _direction_composition, _composition] call btc_fnc_create_composition;
+
+btc_supplies_mat params ["_food", "_water"];
+waitUntil {sleep 5; (_move_taskID call BIS_fnc_taskCompleted || (nearestObjects [_pos, [btc_supplies_cargo] + _food + _water, 30]) isNotEqualTo [])};
+
+private _drop_taskID = _taskID + "dr";
+if (_move_taskID call BIS_fnc_taskState isNotEqualTo "CANCELED") then {
+ [_move_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
+ [
+ [_drop_taskID, _taskID], 19,
+ (nearestObjects [_pos, [btc_supplies_cargo] + _food + _water, 30]) select 0,
+ selectRandom(_food + _water), true
+ ] call btc_task_fnc_create;
+};
+
+[getPos _city, _pos getPos [10, _direction_composition]] call btc_civ_fnc_evacuate;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ count (nearestObjects [_pos, _food + _water, 30]) >= 2
+};
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {
+ [[_area], _composition_objects] call btc_fnc_delete;
+};
+
+50 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call btc_task_fnc_setState;
+
+[[_area], _composition_objects + nearestObjects [_pos, _food + _water + [btc_supplies_cargo], 30]] call btc_fnc_delete;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/tower.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/tower.sqf
new file mode 100644
index 0000000..767c8fd
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/tower.sqf
@@ -0,0 +1,77 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_tower
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["btc_9999"] spawn btc_side_fnc_tower;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ !((_x getVariable ["type", ""]) in ["NameLocal", "Hill", "NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+private _pos = [getPos _city, 100] call btc_fnc_randomize_pos;
+private _roads = _pos nearRoads 100;
+_roads = _roads select {isOnRoad _x};
+if (_roads isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _road = selectRandom _roads;
+_pos = getPos _road;
+
+private _direction = [_road] call btc_fnc_road_direction;
+
+_city setVariable ["spawn_more", true];
+
+//// Randomise composition \\\\
+private _tower_type = selectRandom btc_type_tower;
+private _power_type = selectRandom btc_type_power;
+private _cord_type = selectRandom btc_type_cord;
+private _btc_composition_tower = [
+ [_tower_type,0,[0,0,0]],
+ [_cord_type,63,[-1.30664,0.939453,0]],
+ [_power_type,24,[-4.56885,-0.231445,0]]
+];
+
+//// Create tower with static at _pos \\\\
+private _statics = btc_type_gl + btc_type_mg;
+[_pos getPos [5, _direction], _statics, _direction, [], _city] call btc_mil_fnc_create_static;
+[_pos getPos [- 5, _direction], _statics, _direction + 180, [], _city] call btc_mil_fnc_create_static;
+
+private _btc_composition = [_pos, _direction, _btc_composition_tower] call btc_fnc_create_composition;
+private _tower = _btc_composition select ((_btc_composition apply {typeOf _x}) find _tower_type);
+
+[_taskID, 7, _tower, [_city getVariable "name", _tower_type]] call btc_task_fnc_create;
+
+waitUntil {sleep 5;
+ !alive _tower ||
+ _taskID call BIS_fnc_taskCompleted
+};
+
+[[], _btc_composition] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/underwater_generator.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/underwater_generator.sqf
new file mode 100644
index 0000000..cb2b637
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/underwater_generator.sqf
@@ -0,0 +1,85 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_underwater_generator
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [] spawn btc_side_fnc_underwater_generator;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+//// Choose a Marine location occupied \\\\
+private _useful = values btc_city_all select {
+ _x getVariable ["occupied", false] &&
+ _x getVariable ["type", ""] isEqualTo "NameMarine"
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+
+private _city = selectRandom _useful;
+
+//// Choose a random position \\\\
+private _objects = nearestObjects [getPos _city, [], 200];
+
+_objects = _objects select {
+ (str (_x) find "wreck") isNotEqualTo -1 ||
+ (str (_x) find "broken") isNotEqualTo -1 ||
+ (str (_x) find "rock") isNotEqualTo -1
+};
+_objects = _objects select {(getPos _x select 2 < -3) && (((str (_x) find "car") isEqualTo -1) || ((str (_x) find "uaz") isEqualTo -1))};
+private _wrecks = _objects select {(str (_x) find "rock") isEqualTo -1};
+
+private _pos = [];
+if (_wrecks isEqualTo []) then {
+ if (_objects isEqualTo []) then {
+ ([getPos _city, 0, 100, 13, 2, 60 * (pi / 180), 0] call BIS_fnc_findSafePos) params ["_x", "_y"];
+ _pos = [_x, _y, getTerrainHeightASL [_x, _y]];
+ } else {
+ _pos = getPos (selectRandom _objects);
+ };
+} else {
+ _pos = getPos (selectRandom _wrecks);
+};
+
+_city setVariable ["spawn_more", true];
+
+//// Create underwater generator \\\\
+private _generator = (selectRandom btc_type_generator) createVehicle _pos;
+_pos params ["_x", "_y", "_z"];
+private _storagebladder = (selectRandom btc_type_storagebladder) createVehicle [_x + 5, _y, _z];
+
+[_taskID, 11, _generator, [_city getVariable "name", typeOf _generator]] call btc_task_fnc_create;
+
+private _group = [_pos, 8, 1 + round random 5, "PATROL"] call btc_mil_fnc_create_group;
+[_pos, 20, 2 + round random 4, "PATROL"] call btc_mil_fnc_create_group;
+
+_pos = getPosASL _generator;
+(leader (_group select 0)) setPosASL [_x, _y, _z + 1 + random 1];
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ !alive _generator
+};
+
+[[], [_generator, _storagebladder]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+
+80 call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/side/vehicle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/side/vehicle.sqf
new file mode 100644
index 0000000..21e20d0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/side/vehicle.sqf
@@ -0,0 +1,65 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_side_fnc_vehicle
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _taskID - Unique task ID. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [false, "btc_side_fnc_vehicle"] spawn btc_side_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_taskID", "btc_side", [""]]
+];
+
+private _useful = values btc_city_all select {
+ !((_x getVariable ["type", ""]) in ["NameMarine", "StrongpointArea"])
+};
+if (_useful isEqualTo []) exitWith {[] spawn btc_side_fnc_create;};
+private _city = selectRandom _useful;
+
+private _pos = [getPos _city, 100] call btc_fnc_randomize_pos;
+private _roads = _pos nearRoads 300;
+if (_roads isNotEqualTo []) then {_pos = getPos (selectRandom _roads);};
+
+private _veh_type = selectRandom btc_civ_type_veh;
+private _veh = createVehicle [_veh_type, _pos, [], 0, "NONE"];
+(_veh call ace_common_fnc_getWheelHitPointsWithSelections) params ["_wheelHitPoints", "_wheelHitPointSelections"];
+_veh setDir (random 360);
+_veh setDamage 0.7;
+private _damagedWheel = 1 + round random (count _wheelHitPointSelections - 1);
+_wheelHitPointSelections = (_wheelHitPointSelections call BIS_fnc_arrayShuffle) select [0, _damagedWheel];
+{
+ _veh setHit [_x, 1];
+} forEach _wheelHitPointSelections;
+
+[_taskID, 5, _veh, [_city getVariable "name", _veh_type]] call btc_task_fnc_create;
+
+waitUntil {sleep 5;
+ _taskID call BIS_fnc_taskCompleted ||
+ ({_x} count (_wheelHitPointSelections apply {_veh getHit _x < 1})) isEqualTo _damagedWheel ||
+ !alive _veh
+};
+
+[[], [_veh]] call btc_fnc_delete;
+
+if (_taskID call BIS_fnc_taskState isEqualTo "CANCELED") exitWith {};
+if (!alive _veh) exitWith {
+ [_taskID, "FAILED"] call BIS_fnc_taskSetState;
+};
+
+(- btc_rep_malus_wheelChange * _damagedWheel) call btc_rep_fnc_change;
+
+[_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/slot/createKey.sqf b/hearts_and_minds.kunduz_valley/core/fnc/slot/createKey.sqf
new file mode 100644
index 0000000..5eb4cc7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/slot/createKey.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_slot_fnc_createKey
+
+Description:
+ Create hashMap key from slot and player.
+
+Parameters:
+ _player - Player. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [allPlayers#0] call btc_slot_fnc_createKey;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]]
+];
+
+private _key = position _player;
+if !(btc_p_slot_isShare) then {
+ _key pushBack getPlayerUID _player;
+};
+
+_player setVariable ["btc_slot_key", _key];
+
+_key
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState.sqf b/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState.sqf
new file mode 100644
index 0000000..696fb7f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState.sqf
@@ -0,0 +1,70 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_slot_fnc_deserializeState
+
+Description:
+ Deserialize player slot.
+
+Parameters:
+ _previousPos - Position of the player. [Array]
+ _dir - Direction of the player. [Number]
+ _loadout - Loadout of the player. [Array]
+ _flagTexture - Flag raised. [String]
+ _isContaminated - Chemically contaminated. [Boolean]
+ _medicalDeserializeState - Medical ACE state. [String]
+ _vehicle - Vehicle occupied by player. [Object]
+ _field_rations - Thirst and hunger player's. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ (btc_slots_serialized getOrDefault [(keys btc_slots_serialized)#0, []]) remoteExecCall ["btc_slot_fnc_deserializeState", allPlayers#0];
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+[{!isNull player}, {
+ params [
+ "_previousPos",
+ "_dir",
+ "_loadout",
+ "_flagTexture",
+ "_isContaminated",
+ "_medicalDeserializeState",
+ ["_vehicle", objNull, [objNull]],
+ ["_field_rations", [], [[]]],
+ ["_aceFlagItem", "", [""]]
+ ];
+
+ if (
+ player distance ASLToAGL _previousPos > 50 || // Don't set loadout when near main base
+ btc_p_autoloadout isEqualTo 0
+ ) then {
+ [{[player, _this] call CBA_fnc_setLoadout;}, _loadout] call CBA_fnc_execNextFrame;
+ };
+ if ((isNull _vehicle) || {!(player moveInAny _vehicle)}) then {
+ player setPosASL _previousPos;
+ };
+ player setDir _dir;
+ if (_aceFlagItem isEqualTo "") then {
+ player forceFlagTexture _flagTexture;
+ } else {
+ [player, _aceFlagItem] call ace_flags_fnc_carryFlag;
+ };
+ [{player getVariable ["ace_medical_initialized", false]}, {
+ [player, _this] call ace_medical_fnc_deserializeState;
+ }, _medicalDeserializeState] call CBA_fnc_waitUntilAndExecute;
+
+ if (_isContaminated) then {
+ player call btc_chem_fnc_damageLoop;
+ };
+
+ _field_rations params [["_thirst", 0, [0]], ["_hunger", 0, [0]]];
+ player setVariable ["acex_field_rations_thirst", _thirst];
+ player setVariable ["acex_field_rations_hunger", _hunger];
+
+}, _this] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState_s.sqf b/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState_s.sqf
new file mode 100644
index 0000000..3ff794d
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/slot/deserializeState_s.sqf
@@ -0,0 +1,38 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_slot_fnc_deserializeState_s
+
+Description:
+ Deserialize player slot.
+
+Parameters:
+ _player - Player. [Object]
+ _key - HashMap key. [String, Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [allPlayers#0, (keys btc_slots_serialized)#0] call btc_slot_fnc_deserializeState_s;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]],
+ ["_key", "", ["", []]],
+ ["_owner", -1, [0]]
+];
+
+private _data = btc_slots_serialized getOrDefault [_key, []];
+if (_data isEqualTo []) exitWith {};
+if (_data select 4) then {
+ if ((btc_chem_contaminated pushBackUnique _player) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+};
+
+_data remoteExecCall ["btc_slot_fnc_deserializeState", _owner];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/slot/serializeState.sqf b/hearts_and_minds.kunduz_valley/core/fnc/slot/serializeState.sqf
new file mode 100644
index 0000000..a85dc83
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/slot/serializeState.sqf
@@ -0,0 +1,53 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_slot_fnc_serializeState
+
+Description:
+ Serialize player slot.
+
+Parameters:
+ _unit - Unit. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [allPlayers#0] call btc_slot_fnc_serializeState;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_unit", objNull, [objNull]]
+];
+
+if (
+ isNil {_unit getVariable "btc_slot_key"}
+) exitWith {};
+
+private _loadout = [_unit] call CBA_fnc_getLoadout;
+
+private _data = [
+ getPosASL _unit,
+ getDir _unit,
+ _loadout,
+ getForcedFlagTexture _unit,
+ _unit in btc_chem_contaminated,
+ [_unit] call ace_medical_fnc_serializeState,
+ vehicle _unit,
+ [
+ _unit getVariable ["acex_field_rations_thirst", 0],
+ _unit getVariable ["acex_field_rations_hunger", 0]
+ ],
+ _unit getVariable ["ace_flags_carryingFlag", ""]
+];
+
+if (btc_debug || btc_debug_log) then {
+ [format ["%1", name _unit], __FILE__, [btc_debug, btc_debug_log, btc_debug]] call btc_debug_fnc_message;
+ [format ["%1", _data], __FILE__, [false, btc_debug_log, false]] call btc_debug_fnc_message;
+};
+
+btc_slots_serialized set [_unit getVariable ["btc_slot_key", [0, 0, 0]], _data];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/spect/checkLoop.sqf b/hearts_and_minds.kunduz_valley/core/fnc/spect/checkLoop.sqf
new file mode 100644
index 0000000..f977148
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/spect/checkLoop.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_spect_fnc_checkLoop
+
+Description:
+ Loop over EMP and create electronic failure to vehicles.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_spect_fnc_checkLoop;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if !(btc_p_spect) exitWith {};
+
+[{
+ params ["_args", "_id"];
+ _args params ["_emp", "_range"];
+
+ if (_emp isEqualTo []) exitWith {};
+
+ private _vehiclesOn = vehicles select {isEngineOn _x && {_x isKindOf "allVehicles"}};
+ private _vehiclesAround = [];
+ {
+ _vehiclesAround append (_vehiclesOn inAreaArray [getPosWorld _x, _range, _range]);
+ } forEach _emp;
+
+ [_vehiclesAround] call btc_spect_fnc_electronicFailure;
+}, 10, [btc_spect_emp, btc_spect_range / 2]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/spect/disableDevice.sqf b/hearts_and_minds.kunduz_valley/core/fnc/spect/disableDevice.sqf
new file mode 100644
index 0000000..2e56f0f
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/spect/disableDevice.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_spect_fnc_disableDevice
+
+Description:
+ Disable spectrum device.
+
+Parameters:
+
+Returns:
+
+Examples:
+ (begin example)
+ [] call btc_spect_fnc_disableDevice;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+if (btc_spect_updateOn < 0) exitWith {};
+
+[btc_spect_updateOn] call CBA_fnc_removePerFrameHandler;
+btc_spect_updateOn = -1;
+
+{missionNamespace setVariable _x} forEach [
+ ["#EM_FMin", nil],
+ ["#EM_FMax", nil],
+ ["#EM_SMin", nil],
+ ["#EM_SMax", nil],
+ ["#EM_Values", nil],
+ ["#EM_Transmit", nil],
+ ["#EM_Progress", nil],
+ ["#EM_Prev", nil],
+ ["#EM_Spectrum", nil]
+];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/spect/electronicFailure.sqf b/hearts_and_minds.kunduz_valley/core/fnc/spect/electronicFailure.sqf
new file mode 100644
index 0000000..c7f13eb
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/spect/electronicFailure.sqf
@@ -0,0 +1,48 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_spect_fnc_electronicFailure
+
+Description:
+ Apply electronic failure.
+
+Parameters:
+ _vehicles - Array of vehicles. [Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ [[vehicle (allPlayers select 0)]] call btc_spect_fnc_electronicFailure;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicles", [], [[]]]
+];
+
+{
+ private _veh = _x;
+ if (isEngineOn _x && selectRandom [false, true]) then {
+ [_veh, false] remoteExecCall ["engineOn", _veh];
+ };
+ if (isLightOn _veh && selectRandom [false, true]) then {
+ [_veh, false] remoteExecCall ["setPilotLight", _veh];
+ };
+ if (isCollisionLightOn _veh && selectRandom [false, true]) then {
+ [_veh, false] remoteExecCall ["setCollisionLight", _veh];
+ };
+ {
+ if (
+ "avionics" in _x || {"missiles" in _x} || {"svetlo" in _x} || {"battery" in _x} || {"cam" in _x} || {"com" in _x}
+ ) then {
+ if (_veh getHitIndex _forEachIndex < 1 && selectRandom [false, true]) then {
+ [_veh, [_forEachIndex, 1]] remoteExecCall ["setHitIndex", _veh];
+ break;
+ };
+ };
+ } foreach (getAllHitPointsDamage _veh select 0);
+} forEach _vehicles;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/spect/frequencies.sqf b/hearts_and_minds.kunduz_valley/core/fnc/spect/frequencies.sqf
new file mode 100644
index 0000000..4094608
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/spect/frequencies.sqf
@@ -0,0 +1,62 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_spect_fnc_frequencies
+
+Description:
+ Generate an array of frequency and amplitude based on object netID and position.
+
+Parameters:
+ _player - Player. [Object]
+ _objects - Liste of objects emmiting electromagnetic field. [Array]
+ _freq - Frequency range. [Array]
+
+Returns:
+ _signalFrequencies - Array of frequencies and amplitudes. [freq1, amp1, freq2, amp2] [Array]
+
+Examples:
+ (begin example)
+ [player, allUnitsUAV] call btc_spect_fnc_frequencies;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]],
+ ["_objects", [], [[]]],
+ ["_freq", [390, 500], [[]]]
+];
+
+private _frequencyRange = (_freq select 1) - (_freq select 0);
+
+private _signalFrequencies = [];
+{
+ private _distance = _player distance _x;
+ private _level = 100 - 100 * (_distance / btc_spect_range);
+ private _angle = _player getRelDir _x;
+ if (_level < 0 || (_angle > 90 && _angle < 270)) then {
+ _level = 0;
+ } else {
+ _level = _level * (cos _angle);
+ };
+
+ private _side = switch (side _x) do {
+ case (west) : {1};
+ case (btc_enemy_side) : {3};
+ default {2};
+ };
+ private _maxSubFreq = _frequencyRange * _side / 3;
+ private _minSubFreq = _frequencyRange * (_side - 1) / 3;
+ private _netID = netId _x;
+ private _unit = parseNumber (_netID select [count _netID - 1, 1]);
+ private _deci = parseNumber (_netID select [count _netID - 2, 1]) / 10;
+
+ _signalFrequencies append [
+ (_unit + _deci) * (_maxSubFreq - _minSubFreq) / 9 + _minSubFreq + (_freq select 0), // Generate a custom frequency base on UAV netID and side
+ _level
+ ];
+} forEach _objects;
+
+_signalFrequencies
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/spect/updateDevice.sqf b/hearts_and_minds.kunduz_valley/core/fnc/spect/updateDevice.sqf
new file mode 100644
index 0000000..6d64e5a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/spect/updateDevice.sqf
@@ -0,0 +1,74 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_spect_fnc_updateDevice
+
+Description:
+ Refresh spectrum device depend on UAV and EMP distance and angle.
+
+Parameters:
+ _player - Player. [Object]
+ _weapon - Weapon use by player. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [player, currentWeapon player] call btc_spect_fnc_updateDevice;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_player", objNull, [objNull]],
+ ["_weapon", "", [""]]
+];
+
+if (btc_spect_updateOn > -1) exitWith {};
+
+private _accessorie = (_player weaponAccessories _weapon) select 0;
+
+if !(_accessorie isKindOf ["muzzle_antenna_base_01_F", configFile >> "CfgWeapons"]) exitWith {};
+
+private _freq = [[385, 505], [77, 90]] select (_accessorie isEqualTo "muzzle_antenna_01_f");
+_freq params ["_fMin", "_fMax"];
+
+private _EM = [
+ ["#EM_FMin", _fMin],
+ ["#EM_FMax", _fMax],
+ ["#EM_SMin", 0],
+ ["#EM_SMax", 100],
+ ["#EM_Values", []],
+ ["#EM_Transmit", false],
+ ["#EM_Progress", 0]
+];
+
+if (
+ _fMin > missionNamespace getVariable ["#EM_SelMin", 0] ||
+ _fMax < missionNamespace getVariable ["#EM_SelMin", 0]
+) then {
+ _EM append [
+ ["#EM_SelMin", _fMin],
+ ["#EM_SelMax", (_fMax - _fMin) / 16 + _fMin]
+ ];
+};
+{missionNamespace setVariable _x} forEach _EM;
+
+btc_spect_updateOn = [{
+ params ["_arguments", "_idPFH"];
+ _arguments params [
+ ["_accessorie", "", [""]],
+ ["_player", player, [objNull]]
+ ];
+
+ if (((_player weaponAccessories currentWeapon _player) select 0) isNotEqualTo _accessorie) exitWith {
+ [] call btc_spect_fnc_disableDevice;
+ [_player, currentWeapon _player] call btc_spect_fnc_updateDevice;
+ };
+
+ private _signalFrequencies = [_player, allUnitsUAV] call btc_spect_fnc_frequencies;
+ _signalFrequencies append ([_player, btc_spect_emp select {damage _x < 1}, [78, 89]] call btc_spect_fnc_frequencies);
+ missionNamespace setVariable ["#EM_Values", _signalFrequencies];
+}, 1, [_accessorie]] call CBA_fnc_addPerFrameHandler;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tag/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tag/create.sqf
new file mode 100644
index 0000000..19bc1d7
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tag/create.sqf
@@ -0,0 +1,32 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tag_fnc_create
+
+Description:
+ Create tag stored in city namespace under "data_tags".
+
+Parameters:
+ _city - City to initialise. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_tag_fnc_create;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]]
+];
+
+private _array = _city getVariable ["data_tags", []];
+{
+ _x params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_tagModel"];
+
+ [AGLToASL _tagPosASL, _vectorDirAndUp, _texture, objNull, _city, "", _tagModel] call ace_tagging_fnc_createTag;
+} forEach _array;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tag/eh.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tag/eh.sqf
new file mode 100644
index 0000000..2f4b153
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tag/eh.sqf
@@ -0,0 +1,51 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tag_fnc_eh
+
+Description:
+ Store texture for city de_activation, check if player try to remove a tag or store player tag to database.
+
+Parameters:
+ _tag - Tag. [Object]
+ _texture - Texture of the tag. [String]
+ _object - Object where the tag is draw. [Object]
+ _unit - Unit tagging. [Object]
+
+Returns:
+
+Examples:
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_tag", "_texture", "_object", "_unit"];
+
+if (_unit in values btc_city_all) then {
+ _tag setVariable ["btc_texture", _texture]; //Store texture for city de_activation
+ _tag setVariable ["btc_city", _unit];
+ btc_tags_server pushBack _tag;
+} else {
+ if (isNull _tag) then {
+ _object setVariable ["btc_tag_vehicle", _texture, 2];
+ };
+ if (_texture isEqualTo "#(rgb,8,8,3)color(0,0,0,0)") then { //Check if player want to remove a tag
+ private _tags = (allSimpleObjects btc_type_blacklist) inAreaArray [getPosWorld _tag, 3, 3];
+ if (count _tags > 1) then {
+ _tags = _tags apply {[_x distance _tag, _x]};
+ _tags sort true;
+ private _tagToRemove = _tags select 1 select 1;
+ if (_tagToRemove in btc_tags_server) then {
+ [
+ [btc_rep_bonus_removeTagLetter, btc_rep_bonus_removeTag] select (_tagToRemove isKindOf "Graffiti_base_F"),
+ _unit
+ ] call btc_rep_fnc_change;
+ };
+ deleteVehicle _tagToRemove;
+ };
+ deleteVehicle _tag;
+ } else { //Store tag for database
+ btc_tags_player pushBack [_tag, _texture, _object];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tag/initArea.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tag/initArea.sqf
new file mode 100644
index 0000000..84ef500
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tag/initArea.sqf
@@ -0,0 +1,109 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tag_fnc_initArea
+
+Description:
+ Initialize positions of tags.
+
+Parameters:
+ _city - City to initialise. [Object]
+ _area - Area to create tag. [Number]
+ _n - Number of tag. [Number]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_tag_fnc_initArea;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_city", objNull, [objNull]],
+ ["_area", 100, [0]],
+ ["_n", 1, [0]]
+];
+
+private _array = _city getVariable ["data_tags", []];
+
+private _roads = _city nearRoads 50;
+private _road = if (_roads isEqualTo []) then {
+ objNull
+} else {
+ selectRandom _roads
+};
+for "_i" from 1 to _n do {
+ private _sel_pos = [_city, _area] call CBA_fnc_randPos;
+ private _sel_dir = 0;
+ if !(surfaceIsWater _sel_pos) then {
+ if (isNil "_road" || {isNull _road}) then {
+ private _roads = _sel_pos nearRoads 50;
+ if (_roads isNotEqualTo []) then {
+ _road = selectRandom _roads;
+ };
+ } else {
+ private _connected = roadsConnectedTo _road;
+ if (_connected isEqualTo []) then {
+ _sel_pos = ([_road, -1] call btc_ied_fnc_randomRoadPos) select 0;
+ _road = objNull;
+ } else {
+ _sel_dir = _road getDir (_connected select 0);
+ _sel_pos = _road getPos [
+ random (_road distance (_connected select 0)),
+ _sel_dir
+ ];
+ _sel_pos = _sel_pos getPos [random 1, _sel_dir + 90 * (selectRandom [1, -1])];
+ private _writingDirection = ((AGLToASL _sel_pos) select 2) < ((getPosASL (_connected select 0)) select 2);
+ _sel_dir = _sel_dir + 90 * ([-1, 1] select _writingDirection);
+ _road = _connected select selectRandomWeighted [0, 0.6, (count _connected) - 1, 0.4];
+ };
+ };
+
+ if (!isNull _road && {random 1 > 0.6}) then { // Draw sentences
+ private _sentences = ((localize (selectRandom btc_type_tags_sentences)) splitString " ");
+ {
+ private _word = _x;
+ {
+ private _letterPos = _sel_pos getPos [_forEachIndex * (0.7 + random 0.2), _sel_dir];
+
+ private _surface = surfaceNormal _letterPos;
+ private _v1 = vectorNormalized (_surface vectorMultiply -1);
+ private _v3 = _v1 vectorCrossProduct [0, 0, 1];
+ private _v2 = _v3 vectorCrossProduct _v1;
+ if (_v2 isEqualTo [0, 0, 0]) then {
+ _v2 = [0, 1, 0];
+ };
+
+ _letterPos set [2, 0];
+ _array pushBack [_letterPos, [_v1, _v2], format ["\a3\ui_f\data\igui\cfg\simpletasks\letters\%1_ca.paa", _x], "UserTexture1m_F"];
+ } forEach (_word splitString "");
+ _sel_pos = _sel_pos getPos [1.4, _sel_dir + 90];
+ } forEach _sentences;
+ } else { // Draw simple tag
+ private _surface = surfaceNormal _sel_pos;
+ private _v1 = vectorNormalized (_surface vectorMultiply -1);
+ private _v3 = _v1 vectorCrossProduct [0, 0, 1];
+ private _v2 = _v3 vectorCrossProduct _v1;
+ if (_v2 isEqualTo [0, 0, 0]) then {
+ _v2 = [0, 1, 0];
+ };
+
+ _sel_pos set [2, 0];
+ _array pushBack [_sel_pos, [_v1, _v2], "a3\structures_f_epb\civ\graffiti\data\graffiti_ca.paa", selectRandom btc_type_tags];
+ };
+
+ if (btc_debug) then {
+ private _marker = createMarker [format ["btc_tag_%1", _sel_pos], _sel_pos];
+ _marker setMarkerType "mil_dot";
+ _marker setMarkerColor "ColorGreen";
+ _marker setMarkerText "Tag";
+ _marker setMarkerSize [0.8, 0.8];
+ };
+ };
+};
+
+_city setVariable ["data_tags", _array];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tag/vehicle.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tag/vehicle.sqf
new file mode 100644
index 0000000..8df1f42
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tag/vehicle.sqf
@@ -0,0 +1,36 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tag_fnc_vehicle
+
+Description:
+ Create random tag with stencil on a vehicle.
+
+Parameters:
+ _vehicle - Vehicle to apply the tag to. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_tag_fnc_vehicle;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]]
+];
+
+private _sentences = localize selectRandom btc_type_tags_sentences;
+private _count = selectMax ((_sentences splitString " ") apply {count _x});
+private _size = 0.35;
+if (_count > 8) then {
+ _size = 0.25;
+};
+if (_count < 5) then {
+ _size = 0.45;
+};
+[_vehicle, _sentences, _size, selectRandom ["f7e9e1f8", "ba2619", "8fce00", "25310a", "87CEEB"]] call ace_tagging_fnc_stencilVehicle;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/task/abort.sqf b/hearts_and_minds.kunduz_valley/core/fnc/task/abort.sqf
new file mode 100644
index 0000000..56693d0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/task/abort.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_task_fnc_abort
+
+Description:
+ Abort a side mission.
+
+Parameters:
+ _task_id - Task ID of the side mission to abort. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["btc_dft"] call btc_task_fnc_abort;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_task_id", "btc_dft", [""]]
+];
+
+if (_task_id isEqualTo "") exitWith {
+ localize "STR_BTC_HAM_O_TASK_NOSIDE" call CBA_fnc_notify;
+};
+
+if (_task_id in ["btc_m", "btc_dty", "btc_dft"]) exitWith {
+ localize "STR_BTC_HAM_O_TASK_NOTASIDE" call CBA_fnc_notify;
+};
+
+[_task_id, "CANCELED"] remoteExecCall ["btc_task_fnc_setState", 2];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/task/create.sqf b/hearts_and_minds.kunduz_valley/core/fnc/task/create.sqf
new file mode 100644
index 0000000..4acbcbe
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/task/create.sqf
@@ -0,0 +1,42 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_task_fnc_create
+
+Description:
+ Create the task server side and add description to each client and JIP client.
+
+Parameters:
+ _task_ids - ID of the task. [String]
+ _description - Number of the corresponding description. [Number]
+ _destination - Destination of the task. [Object or Array]
+ _location - Custom information to fill the task description. [String or Array]
+ _isCurrent - Set task as current. [Boolean]
+ _showNotification - Show notification. [Boolean]
+
+Returns:
+ _jipID - return the join in process ID. [String]
+
+Examples:
+ (begin example)
+ [["btc_dft", "btc_m"], 0] call btc_task_fnc_create;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_task_ids", "btc_dft", ["", []]],
+ ["_description", 0, [0]],
+ ["_destination", objNull, [objNull, []]],
+ ["_location", "", ["", []]],
+ ["_isCurrent", false, [false]],
+ ["_showNotification", true, [true]]
+];
+
+if (_destination in values btc_city_all) then {
+ _destination = _destination getVariable ["city_realPos", getPos _destination];
+};
+[btc_player_side, _task_ids, nil, _destination, ["CREATED", "ASSIGNED" ] select _isCurrent] call BIS_fnc_taskCreate;
+[_task_ids, btc_player_side, _description, _destination, 2, _showNotification, _location] remoteExecCall ["btc_task_fnc_setDescription", [0, -2] select isDedicated, true];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/task/setDescription.sqf b/hearts_and_minds.kunduz_valley/core/fnc/task/setDescription.sqf
new file mode 100644
index 0000000..003db38
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/task/setDescription.sqf
@@ -0,0 +1,439 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_task_fnc_setDescription
+
+Description:
+ Set description to created task accordingly to player language.
+
+Parameters:
+ _task_ids - ID of the task. [String]
+ _side - Side of the player. [Side]
+ _description - Number of the corresponding description. [Number]
+ _destination - Destination of the task. [Object or Array]
+ _priority - Task priority. [Number]
+ _showNotification - Show notification. [Boolean]
+ _location - Custom information to fill the task description. [String or Array]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["btc_1", btc_player_side, -1] remoteExecCall ["btc_task_fnc_setDescription", [0, -2] select isDedicated, true];
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_task_ids", [], ["", []]],
+ ["_side", west, [west]],
+ ["_description", 0, [0]],
+ ["_destination", [], [objNull, []]],
+ ["_priority", 2, [0]],
+ ["_showNotification", true, [true]],
+ ["_location", "", ["", []]]
+];
+
+private _type = "";
+switch (_description) do {
+ case -1 : {
+ _description = [
+ localize "STR_BTC_HAM_MISSION_OBJ_DESC",
+ localize "STR_BTC_HAM_MISSION_OBJ_TITLE",
+ localize "STR_BTC_HAM_MISSION_OBJ_TITLE"
+ ];
+ _type = "documents";
+ };
+ case 0 : {
+ _description = [
+ localize "STR_BTC_HAM_MISSION_DEFEAT_DESC",
+ localize "STR_BTC_HAM_MISSION_DEFEAT_TITLE",
+ localize "STR_BTC_HAM_MISSION_DEFEAT_TITLE"
+ ];
+ _type = "kill";
+ };
+ case 1 : {
+ _description = [
+ localize "STR_BTC_HAM_MISSION_DESTROY_DESC",
+ localize "STR_BTC_HAM_MISSION_DESTROY_TITLE",
+ localize "STR_BTC_HAM_MISSION_DESTROY_TITLE"
+ ];
+ _type = "destroy";
+ };
+ case 2 : {
+ _description = [
+ localize "STR_BTC_HAM_O_COMMON_SHOWHINTS_6",
+ localize "STR_BTC_HAM_MISSION_SEIZE_TITLE",
+ localize "STR_BTC_HAM_MISSION_SEIZE_TITLE"
+ ];
+ _type = "map";
+ };
+ case 3 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_SUPPLIES_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_SUPPLIES_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_SUPPLIES_TITLE", _location]
+ ];
+ _type = "container";
+ };
+ case 4 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_MINES_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_MINES_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_MINES_TITLE", _location]
+ ];
+ _type = "mine";
+ };
+ case 5 : {
+ _location params ["_loc", "_vehicleType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_VEHICLE_DESC", _loc]) + ([_vehicleType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_VEHICLE_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_VEHICLE_TITLE", _loc]
+ ];
+ _type = "repair";
+ };
+ case 6 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_CONQUER_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_CONQUER_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_CONQUER_TITLE", _location]
+ ];
+ _type = "attack";
+ };
+ case 7 : {
+ _location params ["_loc", "_towerType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_TOWER_DESC", _loc]) + ([_towerType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_TOWER_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_TOWER_TITLE", _loc]
+ ];
+ _type = "destroy";
+ };
+ case 8 : {
+ _location params ["_loc", "_unitType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_CIVTREAT_DESC", _loc]) + ([_unitType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_CIVTREAT_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_CIVTREAT_TITLE", _loc]
+ ];
+ _type = "heal";
+ };
+ case 9 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_CHECKPOINT_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_CHECKPOINT_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_CHECKPOINT_TITLE", _location]
+ ];
+ _type = "destroy";
+ };
+ case 10 : {
+ _location params ["_loc", "_vehicleType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_CIVTREATBOAT_DESC", _loc]) + ([_vehicleType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_CIVTREATBOAT_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_CIVTREATBOAT_TITLE", _loc]
+ ];
+ _type = "heal";
+ };
+ case 11 : {
+ _location params ["_loc", "_vehicleType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_UNDERWATER_DESC", _loc]) + ([_vehicleType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_UNDERWATER_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_UNDERWATER_TITLE", _loc]
+ ];
+ _type = "destroy";
+ };
+ case 12 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_CONVOY_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_CONVOY_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_CONVOY_TITLE", _location]
+ ];
+ _type = "car";
+ };
+ case 13 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_RESC_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_RESC_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_RESC_TITLE", _location]
+ ];
+ _type = "heli";
+ };
+ case 14 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_CAPOFF_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_CAPOFF_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_CAPOFF_TITLE", _location]
+ ];
+ _type = "run";
+ };
+ case 15 : {
+ _location params ["_loc", "_hostageType"];
+ _description = [
+ (format [localize "STR_BTC_HAM_SIDE_HOSTAGE_DESC", _loc]) + ([_hostageType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_HOSTAGE_TITLE", _loc],
+ format [localize "STR_BTC_HAM_SIDE_HOSTAGE_TITLE", _loc]
+ ];
+ _type = "handcuff";
+ };
+ case 16 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_HACK_DESC", _location],
+ format [localize "STR_BTC_HAM_SIDE_HACK_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_HACK_TITLE", _location]
+ ];
+ _type = "defend";
+ };
+ case 17 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_HACK_OPEN_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_HACK_OPEN_TITLE",
+ localize "STR_BTC_HAM_SIDE_HACK_OPEN_TITLE"
+ ];
+ _type = "interact";
+ };
+ case 18 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_MOVE_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_MOVE_TITLE",
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_MOVE_TITLE"
+ ];
+ _type = "move";
+ };
+ case 19 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_UNLOAD_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_UNLOAD_TITLE",
+ localize "STR_BTC_HAM_SIDE_SUPPLIES_UNLOAD_TITLE"
+ ];
+ _type = "box";
+ };
+ case 20 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_RESC_FIND_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_RESC_FIND_TITLE",
+ localize "STR_BTC_HAM_SIDE_RESC_FIND_TITLE"
+ ];
+ _type = "scout";
+ };
+ case 21 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_RESC_BACK_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_RESC_BACK_TITLE",
+ localize "STR_BTC_HAM_SIDE_RESC_BACK_TITLE"
+ ];
+ _type = "move";
+ };
+ case 22 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_HACK_STARTHACK" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_HACK_DEFEND_TITLE",
+ localize "STR_BTC_HAM_SIDE_HACK_DEFEND_TITLE"
+ ];
+ _type = "defend";
+ };
+ case 23 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_CHECKPOINT_DESTROY_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_CHECKPOINT_DESTROY_TITLE",
+ localize "STR_BTC_HAM_SIDE_CHECKPOINT_DESTROY_TITLE"
+ ];
+ _type = "destroy";
+ };
+ case 24 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_CAPOFF_SURRENDER_DESC" + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_CAPOFF_SURRENDER_TITLE",
+ localize "STR_BTC_HAM_SIDE_CAPOFF_SURRENDER_TITLE"
+ ];
+ _type = "surrender";
+ };
+ case 25 : {
+ _location params ["_officerName", "_loc"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_KILL_DESC", _officerName, _loc],
+ format [localize "STR_BTC_HAM_SIDE_KILL_TITLE", _officerName],
+ format [localize "STR_BTC_HAM_SIDE_KILL_TITLE", _officerName]
+ ];
+ _type = "kill";
+ };
+ case 26 : {
+ _location params ["_officerName", "_loc", "_officerType"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_KILL_IN_DESC", _officerName, _loc] + ([_officerType] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_KILL_IN_TITLE", _officerName],
+ format [localize "STR_BTC_HAM_SIDE_KILL_IN_TITLE", _officerName]
+ ];
+ _type = "kill";
+ };
+ case 27 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_KILL_DOGTAG_DESC", _location] + format ["
", "\z\ace\addons\dogtags\data\dogtagSingle.paa"],
+ localize "STR_BTC_HAM_SIDE_KILL_DOGTAG_TITLE",
+ localize "STR_BTC_HAM_SIDE_KILL_DOGTAG_TITLE"
+ ];
+ _type = "dogtags";
+ };
+ case 28 : {
+ _location params ["_officerName", "_base"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_KILL_BRING_DESC", _officerName] + ([_base] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_KILL_BRING_TITLE",
+ localize "STR_BTC_HAM_SIDE_KILL_BRING_TITLE"
+ ];
+ _type = "move";
+ };
+ case 29 : {
+ _description = [
+ localize "STR_BTC_HAM_SIDE_CAPOFF_HANDCUFF_DESC",
+ localize "STR_BTC_HAM_SIDE_CAPOFF_HANDCUFF_TITLE",
+ localize "STR_BTC_HAM_SIDE_CAPOFF_HANDCUFF_TITLE"
+ ];
+ _type = "handcuff";
+ };
+ case 30 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_CHEM_DESC", _location] + (["B_W_Soldier_CBRN_F"] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_CHEM_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_CHEM_TITLE", _location]
+ ];
+ _type = "danger";
+ };
+ case 31 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_CHEM_BRING_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_CHEM_BRING_TITLE",
+ localize "STR_BTC_HAM_SIDE_CHEM_BRING_TITLE"
+ ];
+ _type = "container";
+ };
+ case 32 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_CHEM_LOCATE_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_CHEM_LOCATE_TITLE",
+ localize "STR_BTC_HAM_SIDE_CHEM_LOCATE_TITLE"
+ ];
+ _type = "search";
+ };
+ case 33 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_CHEM_MOVE_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_CHEM_MOVE_TITLE",
+ localize "STR_BTC_HAM_SIDE_CHEM_MOVE_TITLE"
+ ];
+ _type = "move";
+ };
+ case 34 : {
+ _location params ["_pilotName", "_typeOf_pilot"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_RESC_BODYBAG_DESC", _pilotName] + ([_typeOf_pilot] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_RESC_BODYBAG_TITLE",
+ localize "STR_BTC_HAM_SIDE_RESC_BODYBAG_TITLE"
+ ];
+ _type = "interact";
+ };
+ case 35 : {
+ _location params ["_pilotName", "_base"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_RESC_BRING_DESC", _pilotName] + ([_base] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_RESC_BRING_TITLE",
+ localize "STR_BTC_HAM_SIDE_RESC_BRING_TITLE"
+ ];
+ _type = "move";
+ };
+ case 36 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_EMP_DESC", _location, "
"],
+ format [localize "STR_BTC_HAM_SIDE_EMP_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_EMP_TITLE", _location]
+ ];
+ _type = "antenna";
+ };
+ case 37 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_EMP_DESTROY_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_EMP_DESTROY_TITLE",
+ localize "STR_BTC_HAM_SIDE_EMP_DESTROY_TITLE"
+ ];
+ _type = "search";
+ };
+ case 38 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_RUBBISH_DESC", _location] + (["B_APC_Tracked_01_CRV_F"] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_RUBBISH_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_RUBBISH_TITLE", _location]
+ ];
+ _type = "use";
+ };
+ case 39 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_RUBBISH_SPOT_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_RUBBISH_SPOT_TITLE",
+ localize "STR_BTC_HAM_SIDE_RUBBISH_SPOT_TITLE"
+ ];
+ _type = "move";
+ };
+ case 40 : {
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_PANDEMIC_DESC", _location] + (["DeconShower_01_F"] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_PANDEMIC_TITLE", _location],
+ format [localize "STR_BTC_HAM_SIDE_PANDEMIC_TITLE", _location]
+ ];
+ _type = "danger";
+ };
+ case 41 : {
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_PANDEMIC_DECON_DESC") + ([_location] call btc_fnc_typeOfPreview),
+ localize "STR_BTC_HAM_SIDE_PANDEMIC_DECON_TITLE",
+ localize "STR_BTC_HAM_SIDE_PANDEMIC_DECON_TITLE"
+ ];
+ _type = "search";
+ };
+ case 42 : {
+ _location params ["_name", "_typeOf_church"];
+ _description = [
+ format [localize "STR_BTC_HAM_SIDE_MASSACRE_DESC", _name] + ([_typeOf_church] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_MASSACRE_TITLE", _name],
+ format [localize "STR_BTC_HAM_SIDE_MASSACRE_TITLE", _name]
+ ];
+ _type = "default";
+ };
+ case 43 : {
+ _location params ["_name", "_typeOf_civ"];
+ _description = [
+ (localize "STR_BTC_HAM_SIDE_MASSACRE_C_DESC") + ([_typeOf_civ] call btc_fnc_typeOfPreview),
+ format [localize "STR_BTC_HAM_SIDE_MASSACRE_C_TITLE", _name],
+ format [localize "STR_BTC_HAM_SIDE_MASSACRE_C_TITLE", _name]
+ ];
+ _type = "interact";
+ };
+};
+
+[
+ _task_ids, _side, _description, _destination,
+ _task_id call BIS_fnc_taskState,
+ _priority, false, false, _type
+] call BIS_fnc_setTask;
+
+if !(_showNotification) exitWith {};
+
+private _task_id = if (_task_ids isEqualType []) then {
+ _task_ids select 0
+} else {
+ _task_ids
+};
+[
+ {!isNull player && {scriptDone btc_intro_done}},
+ {
+ params ["_task_id"];
+
+ if !(_task_id call BIS_fnc_taskCompleted) then {
+ _task_id call BIS_fnc_taskHint;
+ };
+ },
+ _task_id
+] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/task/setState.sqf b/hearts_and_minds.kunduz_valley/core/fnc/task/setState.sqf
new file mode 100644
index 0000000..62ce169
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/task/setState.sqf
@@ -0,0 +1,45 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_task_fnc_setState
+
+Description:
+ Set state to task and subtasks (children).
+
+Parameters:
+ _task - Task ID to change state of the main task and children. [String]
+ _state - State to apply. [String]
+
+Returns:
+ _isSet - if the state has changed array. [Boolean]
+
+Examples:
+ (begin example)
+ ["btc_dft", "CANCELED"] call btc_task_fnc_setState;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_task", "", [""]],
+ ["_state", "CANCELED", [""]]
+];
+
+private _subTasks = _task call BIS_fnc_taskChildren;
+if (_subTasks isEqualTo []) then {
+ private _taskParent = _task call BIS_fnc_taskParent;
+ if (_taskParent isNotEqualTo "") then {
+ _task = _taskParent;
+ _subTasks = _task call BIS_fnc_taskChildren;
+ };
+};
+
+([_task] + _subTasks) apply {
+ if !(_x call BIS_fnc_taskCompleted) then {
+ [_x, _state] call BIS_fnc_taskSetState
+ } else {
+ false
+ };
+}
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/task/tasktypes.hpp b/hearts_and_minds.kunduz_valley/core/fnc/task/tasktypes.hpp
new file mode 100644
index 0000000..25a821a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/task/tasktypes.hpp
@@ -0,0 +1,77 @@
+class CfgTaskTypes {
+ class Heal {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\heal_ca.paa;
+ };
+ class Kill {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\kill_ca.paa;
+ };
+ class Destroy {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa;
+ };
+ class Move {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\move_ca.paa;
+ };
+ class Search {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa;
+ };
+ class Repair {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa;
+ };
+ class Attack {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\attack_ca.paa;
+ };
+ class Navigate {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\navigate_ca.paa;
+ };
+ class Run {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa;
+ };
+ class Exit {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\exit_ca.paa;
+ };
+ class Container {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa;
+ };
+ class Mine {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\mine_ca.paa;
+ };
+ class Heli {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\heli_ca.paa;
+ };
+ class Defend {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa;
+ };
+ class Intel {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\intel_ca.paa;
+ };
+ class Car {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa;
+ };
+ class Box {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa;
+ };
+ class Surrender {
+ icon = \z\ace\addons\captives\UI\Surrender_ca.paa;
+ };
+ class Documents {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\documents_ca.paa;
+ };
+ class Map {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa;
+ };
+ class Handcuff {
+ icon = \z\ace\addons\captives\UI\handcuff_ca.paa;
+ };
+ class Dogtags {
+ icon = \z\ace\addons\dogtags\data\dogtag_icon_ca.paa;
+ };
+ class Danger {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa;
+ };
+ class Antenna {
+ icon = \A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa;
+ };
+ class Use {
+ icon = \A3\ui_f\data\igui\cfg\simpleTasks\types\use_ca.paa;
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/ViV.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/ViV.sqf
new file mode 100644
index 0000000..9eb91e3
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/ViV.sqf
@@ -0,0 +1,63 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_ViV
+
+Description:
+ Move selected vehicle in the tower cargo with a hidden vehicle.
+
+Parameters:
+ _vehicleSelected - Vehicle to store in the tower cargo. [Object]
+ _tower - Tower vehicle with cargo space to handle the hiden vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject, btc_tow_vehicleTowing] call btc_tow_fnc_ViV;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicleSelected", objNull, [objNull]],
+ ["_tower", objNull, [objNull]]
+];
+
+if (_tower setVehicleCargo _vehicleSelected) exitWith {true};
+
+private _hideVehicle = createVehicle ["B_LSV_01_unarmed_F", [0, 0, 0], [], 0, "CAN_COLLIDE"];
+_hideVehicle hideObjectGlobal true;
+
+private _model_selected = (0 boundingBoxReal _vehicleSelected) select 1;
+private _model_hide = (0 boundingBoxReal _hideVehicle) select 1;
+private _model_selected_z = ((0 boundingBoxReal _vehicleSelected) select 0) select 2;
+private _model_hide_z = ((0 boundingBoxReal _hideVehicle) select 0) select 2;
+private _attachTo = [
+ 0,
+ ((_model_hide select 1) - (_model_selected select 1)),
+ -(abs _model_hide_z - abs _model_selected_z) + 0.1
+];
+_vehicleSelected attachTo [_hideVehicle, _attachTo];
+
+if (_tower setVehicleCargo _hideVehicle) then {
+ [_tower, "CargoUnloaded", {
+ params ["_tower", "_hideVehicle"];
+ private _vehicleSelected = _thisArgs select 0;
+
+ private _pos = getPosWorld _vehicleSelected;
+ _pos set [2, (_pos select 2) + 0.3];
+
+ detach _vehicleSelected;
+ deleteVehicle _hideVehicle;
+
+ _vehicleSelected setPosWorld _pos;
+ [_vehicleSelected, [0, 0, 0.01]] remoteExecCall ["setVelocity", _vehicleSelected]; // Activate physic
+ }, [_vehicleSelected]] call CBA_fnc_addBISEventHandler;
+ true
+} else {
+ deleteVehicle _hideVehicle;
+ false
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/check.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/check.sqf
new file mode 100644
index 0000000..89e9f69
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/check.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_check
+
+Description:
+ _tower ----rope--- (hook)_towed, Show feedback message when trying to tow a vehicle.
+
+Parameters:
+ _tower - Tower vehicle. [Object]
+ _towed - Towed vehicle. [Object]
+
+Returns:
+ _canTow - Can tow or not. [Boolean]
+
+Examples:
+ (begin example)
+ _canTow = [btc_tow_vehicleTowing, cursorObject] call btc_tow_fnc_check;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_tower", objNull, [objNull]],
+ ["_towed", objNull, [objNull]]
+];
+
+private _array = [_tower] call btc_log_fnc_get_nottowable;
+
+if ((_array findIf {_towed isKindOf _x}) != -1) exitWith {
+ private _string_array = "";
+ {
+ _string_array = _string_array + ", " + _x;
+ } forEach (([_tower] call btc_log_fnc_get_nottowable) - ["Truck_F"]);
+
+ (format [localize "STR_BTC_HAM_TOW_CANT", _string_array]) call CBA_fnc_notify;
+ false
+};
+
+private _model_rear_tower = ([_tower] call btc_tow_fnc_hitch_points) select 1;
+private _model_front_towed = ([_towed] call btc_tow_fnc_hitch_points) select 0;
+private _pos_rearTower = _tower modelToWorld _model_rear_tower;
+private _pos_frontTowed = _towed modelToWorld _model_front_towed;
+
+if (_pos_rearTower distance _pos_frontTowed > 5) exitWith {
+ (localize "STR_BTC_HAM_TOW_TFAR") call CBA_fnc_notify;
+ false
+};
+if (
+ !([position _tower, ((getDir _tower) + 180) mod 360, 90, _pos_frontTowed] call BIS_fnc_inAngleSector)
+) exitWith {
+ (localize "STR_BTC_HAM_TOW_NOTA") call CBA_fnc_notify;
+ false
+};
+
+if (
+ !(isNull isVehicleCargo attachedto _tower) ||
+ !(isNull isVehicleCargo attachedto _towed) ||
+ !(isNull isVehicleCargo _tower) ||
+ !(isNull isVehicleCargo _towed) ||
+ !isNull (_tower getVariable ["btc_towing", objNull])
+) exitWith {
+ (localize "STR_BTC_HAM_TOW_ALREADYTOWED") call CBA_fnc_notify;
+ false
+};
+
+true
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/hitch_points.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/hitch_points.sqf
new file mode 100644
index 0000000..ad3ed07
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/hitch_points.sqf
@@ -0,0 +1,37 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_hitch_points
+
+Description:
+ Get point to attach rope.
+
+Parameters:
+ _vehicle - Vehicle. [Object]
+
+Returns:
+ - _array - Front and rear hitch points. [Array]
+
+Examples:
+ (begin example)
+ [cursorOject] call btc_tow_fnc_hitch_points;
+ (end)
+
+Author:
+ sethduda
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]]
+];
+
+([_vehicle] call btc_log_fnc_get_corner_points) params [
+ "_rearCorner",
+ "_rearCorner2",
+ "_frontCorner",
+ "_frontCorner2"
+];
+private _rearHitchPoint = ((_rearCorner vectorDiff _rearCorner2) vectorMultiply 0.5) vectorAdd _rearCorner2;
+private _frontHitchPoint = ((_frontCorner vectorDiff _frontCorner2) vectorMultiply 0.5) vectorAdd _frontCorner2;
+
+[_frontHitchPoint, _rearHitchPoint];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/int.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/int.sqf
new file mode 100644
index 0000000..3cf9144
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/int.sqf
@@ -0,0 +1,69 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_int
+
+Description:
+ Add towing interactions.
+
+Parameters:
+ _type - Type of vehicle. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ [typeOf cursorObject] call btc_tow_fnc_int;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_type", "", [""]]
+];
+
+private _action = [
+ "Logistic",
+ localize "STR_BTC_HAM_ACTION_LOC_MAIN",
+ "\A3\ui_f\data\igui\cfg\simpleTasks\letters\L_ca.paa",
+ {},
+ {isNull isVehicleCargo attachedto _target && isNull isVehicleCargo _target}
+] call ace_interact_menu_fnc_createAction;
+[_type, 0, ["ACE_MainActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+if (
+ !(_type isKindOf "Helicopter") ||
+ !(_type isKindOf "Plane")
+) then {
+ _action = [
+ "log_tow",
+ localize "STR_ACE_Towing_displayName",
+ "",
+ {btc_tow_vehicleTowing = _target; (localize "STR_BTC_HAM_TOW_HOOK") call CBA_fnc_notify;},
+ {
+ isNull (_target getVariable ["btc_towing", objNull]) &&
+ alive _target
+ }
+ ] call ace_interact_menu_fnc_createAction;
+ [_type, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToClass;
+};
+
+_action = [
+ "log_hook",
+ localize "STR_ACE_Towing_attach",
+ "\z\ace\addons\attach\UI\attach_ca.paa",
+ {[btc_tow_vehicleTowing, _target] call btc_tow_fnc_ropeCreate;},
+ {!isNull btc_tow_vehicleTowing && {btc_tow_vehicleTowing != _target}}
+] call ace_interact_menu_fnc_createAction;
+[_type, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+_action = [
+ "log_unhook",
+ localize "STR_ACE_Towing_detach",
+ "\z\ace\addons\attach\UI\detach_ca.paa",
+ {_target call btc_tow_fnc_unhook;},
+ {!isNull (_target getVariable ["btc_towing", objNull]);}
+] call ace_interact_menu_fnc_createAction;
+[_type, 0, ["ACE_MainActions", "Logistic"], _action] call ace_interact_menu_fnc_addActionToClass;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeBreak.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeBreak.sqf
new file mode 100644
index 0000000..d466c5b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeBreak.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_ropeBreak
+
+Description:
+ Handle towing rope when they break.
+
+Parameters:
+ _thisBI - BI parameters. [Array]
+ _thisArgsCBA - CBA parameters. [Array]
+
+Returns:
+
+Examples:
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params ["_thisBI", "_thisArgsCBA"];
+_thisBI params ["_tower"];
+_thisArgsCBA params ["_vehicleSelected", "_ropes"];
+
+_tower removeEventHandler ["RopeBreak", _thisId];
+
+_ropes apply {deleteVehicle _x};
+deTach _vehicleSelected;
+
+[_vehicleSelected, [0, 0, 0.01]] remoteExecCall ["setVelocity", _vehicleSelected];
+[_tower, getMass _tower - (getMass _vehicleSelected)/1.5] remoteExecCall ["setMass", _tower];
+
+_vehicleSelected setVariable ["btc_towing", objNull, true];
+_tower setVariable ["btc_towing", objNull, true];
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeCreate.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeCreate.sqf
new file mode 100644
index 0000000..c4f6538
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/ropeCreate.sqf
@@ -0,0 +1,73 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_ropeCreate
+
+Description:
+ Tow a vehicle.
+
+Parameters:
+ _tower - Vehicle towing. [Object]
+ _vehicleSelected - Vehicle will be towed. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_tow_fnc_ropeCreate;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_tower", objNull, [objNull]],
+ ["_vehicleSelected", objNull, [objNull]]
+];
+
+if !([_tower, _vehicleSelected] call btc_tow_fnc_check) exitWith {};
+private _alreadyLoaded = (getVehicleCargo _tower) findIf {isObjectHidden _x} isEqualTo -1;
+if (
+ _alreadyLoaded &&
+ {_tower setVehicleCargo _vehicleSelected}
+) exitWith {};
+
+private _canViV_wreck = false;
+if (_alreadyLoaded) then {
+ private _fakeVehicle = "B_LSV_01_unarmed_F" createVehicleLocal [0, 0, 0];
+ _canViV_wreck = _tower canVehicleCargo _fakeVehicle isEqualTo [true, true];
+ deleteVehicle _fakeVehicle;
+};
+if (_canViV_wreck) exitWith {
+ [_vehicleSelected, _tower] remoteExecCall ["btc_tow_fnc_ViV", 2];
+ btc_tow_vehicleTowing = objNull;
+};
+
+private _model_selected = (0 boundingBoxReal _vehicleSelected) select 1;
+private _model_tower = (0 boundingBoxReal _tower) select 0;
+private _model_selected_z = ((0 boundingBoxReal _vehicleSelected) select 0) select 2;
+private _model_tower_z = ((0 boundingBoxReal _tower) select 0) select 2;
+private _attachTo = [
+ 0,
+ ((_model_tower select 1) - (_model_selected select 1)) - 0.2,
+ -(abs _model_tower_z - abs _model_selected_z) + 0.1
+];
+_vehicleSelected attachTo [_tower, _attachTo];
+
+private _model_rear_tower = ([_tower] call btc_tow_fnc_hitch_points) select 1;
+private _model_front_selected = ([_vehicleSelected] call btc_tow_fnc_hitch_points) select 0;
+private _selected_front_relativeToTower = _tower worldToModel (_vehicleSelected modelToWorld _model_front_selected);
+private _rope1 = ropeCreate [_tower, _model_rear_tower, _tower, _selected_front_relativeToTower vectorAdd [-0.4, 0, 0]];
+private _rope2 = ropeCreate [_tower, _model_rear_tower, _tower, _selected_front_relativeToTower vectorAdd [0.4, 0, 0]];
+
+[
+ _tower, "RopeBreak",
+ {[_this, _thisArgs] call btc_tow_fnc_ropeBreak},
+ [_vehicleSelected, [_rope1, _rope2]]
+] remoteExecCall ["CBA_fnc_addBISEventHandler", 2];
+
+[_tower, getMass _tower + (getMass _vehicleSelected)/1.5] remoteExecCall ["setMass", _tower];
+_tower setVariable ["btc_towing", _vehicleSelected, true];
+_vehicleSelected setVariable ["btc_towing", _tower, true];
+btc_tow_vehicleTowing = objNull;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/tow/unhook.sqf b/hearts_and_minds.kunduz_valley/core/fnc/tow/unhook.sqf
new file mode 100644
index 0000000..b31e894
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/tow/unhook.sqf
@@ -0,0 +1,34 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_tow_fnc_unhook
+
+Description:
+ Unhook the current tower/towed vehicle.
+
+Parameters:
+ _veh - Vehicle, could be the tower or the towed vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_tow_fnc_unhook;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]]
+];
+
+private _towing = _veh getVariable ["btc_towing", objNull];
+
+private _ropes = ropes _veh;
+if (_ropes isEqualTo []) then {
+ _ropes = ropes _towing;
+};
+
+_ropes apply {ropeDestroy _x};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/add.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/add.sqf
new file mode 100644
index 0000000..f98f9d0
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/add.sqf
@@ -0,0 +1,83 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_add
+
+Description:
+ Add vehicle to the wreck system.
+
+Parameters:
+ _veh - Vehicle to add in wreck system. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ cursorObject remoteExecCall ["btc_veh_fnc_add", 2];
+ {_x addCuratorEditableObjects [btc_vehicles, false];} forEach allCurators;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_veh", objNull, [objNull]]
+];
+
+if (isNil "btc_vehicles") then {
+ btc_vehicles = [];
+};
+if (isNil {_veh getVariable "btc_EDENinventory"}) then {
+ _veh setVariable ["btc_EDENinventory", _veh call btc_log_fnc_inventoryGet];
+};
+[{ace_common_settingsInitFinished}, {
+ if (isNull _this) exitwith {};
+ if (isNil {_this getVariable "btc_EDEN_defaultFuelCargo"}) then {
+ _this setVariable ["btc_EDEN_defaultFuelCargo", _this call ace_refuel_fnc_getFuel, true];
+ };
+ if (isNil {_this getVariable "btc_EDEN_defaultSupply"}) then {
+ _this setVariable ["btc_EDEN_defaultSupply", _this call ace_rearm_fnc_getSupplyCount, true];
+ };
+}, _veh] call CBA_fnc_waitUntilAndExecute;
+
+if (btc_vehicles pushBackUnique _veh isEqualTo -1) exitWith {
+ if (btc_debug || btc_debug_log) then {
+ ["Vehicle added more than once in btc_vehicles", __FILE__, [btc_debug, btc_debug_log, true]] call btc_debug_fnc_message;
+ };
+};
+
+_veh setVariable ["btc_dont_delete", true];
+
+_veh addMPEventHandler ["MPKilled", {
+ if (isServer) then {
+ _this call btc_veh_fnc_killed;
+ };
+}];
+if ((isNumber (configOf _veh >> "ace_fastroping_enabled")) && (typeOf _veh isNotEqualTo "RHS_UH1Y_d")) then {
+ [_veh] call ace_fastroping_fnc_equipFRIES
+};
+
+if (fullCrew [_veh, "cargo", true] isNotEqualTo []) then {
+ if (
+ (btc_p_respawn_location isEqualTo 2) && (_veh isKindOf "Air") ||
+ btc_p_respawn_location > 2
+ ) then {
+ [
+ _veh,
+ "Deleted",
+ {_thisArgs call BIS_fnc_removeRespawnPosition},
+ [btc_player_side, _veh] call BIS_fnc_addRespawnPosition
+ ] call CBA_fnc_addBISEventHandler;
+ };
+
+ if (
+ (btc_p_respawn_fromOutsideBase isEqualTo 3) && (_veh isKindOf "Air") ||
+ btc_p_respawn_fromOutsideBase > 3
+ ) then {
+ [_veh, false,
+ btc_p_respawn_fromOutsideTimeout >= 3 ||
+ (btc_p_respawn_fromOutsideTimeout >= 2) && !(_veh isKindOf "Air")
+ ] remoteExecCall ["btc_fob_fnc_addInteraction", [0, -2] select isDedicated, _veh];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/addRespawn.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/addRespawn.sqf
new file mode 100644
index 0000000..72bf826
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/addRespawn.sqf
@@ -0,0 +1,94 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_addRespawn
+
+Description:
+ Add a vehicle to the respawn system and save vehicle parameters.
+
+Parameters:
+ _vehicle - Vehicle to add inside the respawn system. [Object]
+ _time - Time before respawn. [Number]
+
+Returns:
+ _handle - Value of the MPEventhandle. [Number]
+
+Examples:
+ (begin example)
+ [cursorObject, 30] remoteExecCall ["btc_veh_fnc_addRespawn", 2];
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]],
+ ["_time", 30, [0]]
+];
+
+if (isNil "btc_veh_respawnable") then {
+ btc_veh_respawnable = [];
+};
+if (isNil {_vehicle getVariable "btc_EDENinventory"}) then {
+ _vehicle setVariable ["btc_EDENinventory", _vehicle call btc_log_fnc_inventoryGet];
+};
+[{ace_common_settingsInitFinished}, {
+ if (isNull _this) exitwith {};
+ if (isNil {_this getVariable "btc_EDEN_defaultFuelCargo"}) then {
+ _this setVariable ["btc_EDEN_defaultFuelCargo", _this call ace_refuel_fnc_getFuel, true];
+ };
+ if (isNil {_this getVariable "btc_EDEN_defaultSupply"}) then {
+ _this setVariable ["btc_EDEN_defaultSupply", _this call ace_rearm_fnc_getSupplyCount, true];
+ };
+}, _vehicle] call CBA_fnc_waitUntilAndExecute;
+
+if (btc_veh_respawnable pushBackUnique _vehicle isEqualTo -1) exitWith {
+ if (btc_debug || btc_debug_log) then {
+ ["Vehicle added more than once in btc_veh_respawnable", __FILE__, [btc_debug, btc_debug_log, true]] call btc_debug_fnc_message;
+ };
+};
+
+private _type = typeOf _vehicle;
+private _pos = getPosASL _vehicle;
+private _dir = getDir _vehicle;
+private _vector = [vectorDir _vehicle, vectorUp _vehicle];
+
+_vehicle setVariable ["data_respawn", [_type, _pos, _dir, _time, _vector]];
+_vehicle setVariable ["btc_dont_delete", true];
+
+if ((isNumber (configOf _vehicle >> "ace_fastroping_enabled")) && (typeOf _vehicle isNotEqualTo "RHS_UH1Y_d")) then {_vehicle call ace_fastroping_fnc_equipFRIES};
+_vehicle addMPEventHandler ["MPKilled", {
+ if (isServer) then {
+ params ["_vehicle", "_killer", "_instigator"];
+
+ private _data = _vehicle getVariable ["data_respawn", []];
+ private _vehProperties = _vehicle call btc_veh_fnc_propertiesGet;
+
+ // Reset properties
+ _vehProperties set [5, false];
+ (_vehProperties select 3) set [0, _vehicle getVariable "btc_EDEN_defaultFuelCargo"];
+ (_vehProperties select 6) set [1, _vehicle getVariable "btc_EDEN_defaultSupply"];
+
+ _data append _vehProperties;
+ _data pushBack (_vehicle getVariable ["btc_EDENinventory", []]);
+ [btc_veh_fnc_respawn, [_vehicle, _data], _data select 3] call CBA_fnc_waitAndExecute;
+
+ [btc_rep_malus_veh_killed, _instigator] call btc_rep_fnc_change;
+ };
+}];
+
+if (fullCrew [_vehicle, "cargo", true] isNotEqualTo []) then {
+ if (btc_p_respawn_location > 0) then {
+ [
+ _vehicle,
+ "Deleted",
+ {_thisArgs call BIS_fnc_removeRespawnPosition},
+ [btc_player_side, _vehicle] call BIS_fnc_addRespawnPosition
+ ] call CBA_fnc_addBISEventHandler;
+ };
+
+ if (btc_p_respawn_location > 1) then {
+ [_vehicle, false, btc_p_respawn_fromOutsideTimeout >= 4] remoteExecCall ["btc_fob_fnc_addInteraction", [0, -2] select isDedicated, _vehicle];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/init.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/init.sqf
new file mode 100644
index 0000000..ec8ed02
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/init.sqf
@@ -0,0 +1,64 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_init
+
+Description:
+ Add custom ACE interaction depends one vehicle type (static weapon, land vehicle, helicopter and ship).
+
+Parameters:
+ _type - Type of vehicle to add custom ACE interaction. [String]
+
+Returns:
+
+Examples:
+ (begin example)
+ ["B_Truck_01_fuel_F"] call btc_veh_fnc_init;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_type", "", [""]]
+];
+
+if (isNil "btc_actions_veh") then {btc_actions_veh = [];};
+if ((btc_actions_veh pushBackUnique _type) isEqualTo -1) exitWith {};
+
+switch true do {
+ case (_type isKindOf "UGV_02_Base_F") : {};
+ case (_type isKindOf "StaticWeapon") : {};
+ case (_type isKindOf "LandVehicle" || {_type isKindOf "Ship"}) : {
+ _type call btc_tow_fnc_int;
+
+ _type call btc_flag_fnc_int;
+ };
+ case (_type isKindOf "Helicopter") : {
+ _type call btc_tow_fnc_int;
+
+ //Lift
+ _action = [
+ "Deploy_ropes", localize "STR_ACE_Fastroping_Interaction_deployRopes",
+ "\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa",
+ {[] spawn btc_lift_fnc_deployRopes;},
+ {!btc_ropes_deployed && {(driver vehicle player) isEqualTo player} && {(getPosATL player) select 2 > 4}}
+ ] call ace_interact_menu_fnc_createAction;
+ [_type, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+ _action = [
+ "Cut_ropes", localize "STR_ACE_Fastroping_Interaction_cutRopes",
+ "\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa",
+ {[] call btc_lift_fnc_destroyRopes;},
+ {btc_ropes_deployed && {(driver vehicle player) isEqualTo player}}
+ ] call ace_interact_menu_fnc_createAction;
+ [_type, 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass;
+
+ _type call btc_flag_fnc_int;
+ };
+ case (_type isKindOf "Plane") : {
+ _type call btc_tow_fnc_int;
+ };
+};
+
+
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/inventoryRestore.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/inventoryRestore.sqf
new file mode 100644
index 0000000..614d09a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/inventoryRestore.sqf
@@ -0,0 +1,35 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_inventoryRestore
+
+Description:
+ Fill me when you edit me !
+
+Parameters:
+ _object - Object to restore inventory. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ _result = [] call btc_veh_fnc_inventoryRestore;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_object", objNull, [objNull]]
+];
+
+private _inventory = _object getVariable ["btc_EDENinventory", []];
+if (_inventory isEqualTo []) then {
+ _inventory = (typeOf _object) call btc_log_fnc_inventoryGet;
+};
+
+[
+ _object,
+ _inventory
+] call btc_log_fnc_inventorySet;
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/killed.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/killed.sqf
new file mode 100644
index 0000000..64d8d24
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/killed.sqf
@@ -0,0 +1,47 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_killed
+
+Description:
+ Create marker wreck and change reputation on vehicle destruction.
+
+Parameters:
+ _vehicle - Vehicle object. [Object]
+ _killer - Killer. [Object]
+ _instigator - Person who pulled the trigger. [Object]
+ _useEffects - Same as useEffects in setDamage alt syntax. [Boolean]
+ _allowRepChange - Allow reputation change. [Boolean]
+
+Returns:
+
+Examples:
+ (begin example)
+ [btc_veh_12] call btc_veh_fnc_killed;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]],
+ ["_killer", objNull, [objNull]],
+ ["_instigator", objNull, [objNull]],
+ ["_useEffects", true, [false]],
+ ["_allowRepChange", true, [false]]
+];
+
+private _marker = createMarker [format ["m_%1", _vehicle], getPos _vehicle];
+_marker setMarkerType "mil_box";
+_marker setMarkerColor "ColorRed";
+[_marker, "STR_BTC_HAM_O_EH_VEHKILLED_MRK", getText (configOf _vehicle >> "displayName")] remoteExecCall ["btc_fnc_set_markerTextLocal", [0, -2] select isDedicated, _marker]; // %1 wreck
+
+_vehicle setVariable ["marker", _marker];
+if (_allowRepChange) then {
+ if (isServer) then {
+ [btc_rep_malus_veh_killed, _killer] call btc_rep_fnc_change;
+ } else {
+ [btc_rep_malus_veh_killed, _killer] remoteExecCall ["btc_rep_fnc_change", 2];
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesGet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesGet.sqf
new file mode 100644
index 0000000..9c86c2a
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesGet.sqf
@@ -0,0 +1,56 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_propertiesGet
+
+Description:
+ Get properties of a vehicle.
+
+Parameters:
+ _veh - Vehicle to get properties. [Object]
+
+Returns:
+ _customization - Get skin. [Array]
+ _isMedicalVehicle - Is medical vehicle. [Boolean]
+ _isRepairVehicle - Is repair vehicle. [Boolean]
+ _fuelSource - Fuel cargo and hook. [Array]
+ _pylons - Array of pylon. [Array]
+ _isContaminated - Is chemically contaminated. [Boolean]
+ _supplyVehicle - Is supply vehicle and current supply count. [Boolean]
+ _objectTexture - Texture. [Array]
+
+Examples:
+ (begin example)
+ [vehicle player] call btc_veh_fnc_propertiesGet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]]
+];
+
+private _customization = _vehicle call BIS_fnc_getVehicleCustomization;
+private _isMedicalVehicle = _vehicle call ace_medical_treatment_fnc_isMedicalVehicle;
+private _isRepairVehicle = _vehicle call ace_repair_fnc_isRepairVehicle;
+private _fuelSource = [
+ _vehicle call ace_refuel_fnc_getFuel,
+ _vehicle getVariable ["ace_refuel_hooks", []],
+ _vehicle getVariable ["btc_EDEN_defaultFuelCargo", _vehicle call ace_refuel_fnc_getFuel]
+];
+private _pylons = getPylonMagazines _vehicle;
+private _isContaminated = _vehicle in btc_chem_contaminated;
+private _supplyVehicle = [
+ _vehicle call ace_rearm_fnc_isSource,
+ _vehicle call ace_rearm_fnc_getSupplyCount,
+ _vehicle getVariable ["btc_EDEN_defaultSupply", _vehicle call ace_rearm_fnc_getSupplyCount]
+];
+
+private _objectTexture = [];
+if (_customization select 0 isEqualTo []) then {
+ _objectTexture = getObjectTextures _vehicle;
+};
+
+[_customization, _isMedicalVehicle, _isRepairVehicle, _fuelSource, _pylons, _isContaminated, _supplyVehicle, _objectTexture]
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesSet.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesSet.sqf
new file mode 100644
index 0000000..2f18f64
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/propertiesSet.sqf
@@ -0,0 +1,103 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_propertiesSet
+
+Description:
+ Set properties of a vehicle.
+
+Parameters:
+ _vehicle - Vehicle to get properties. [Object]
+ _customization - Get skin. [Array]
+ _isMedicalVehicle - Is medical vehicle. [Boolean]
+ _isRepairVehicle - Is repair vehicle. [Boolean]
+ _fuelSource - Fuel cargo and hook. [Array]
+ _pylons - Array of pylon. [Array]
+ _isContaminated - Set a vehicle contaminated. [Boolean]
+ _supplyVehicle - Is supply vehicle and current supply count. [Boolean]
+ _objectTexture - Texture. [Array]
+
+Returns:
+ _vehicle - Vehicle. [Object]
+
+Examples:
+ (begin example)
+ [vehicle player] call btc_veh_fnc_propertiesSet;
+ (end)
+
+Author:
+ Vdauphin
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]],
+ ["_customization", [false, false], [[]]],
+ ["_isMedicalVehicle", false, [true]],
+ ["_isRepairVehicle", false, [true]],
+ ["_fuelSource", [], [[]]],
+ ["_pylons", [], [[]]],
+ ["_isContaminated", false, [false]],
+ ["_supplyVehicle", [], [[]]],
+ ["_objectTexture", [], [[]]]
+];
+
+[_vehicle, _customization select 0, _customization select 1] call BIS_fnc_initVehicle;
+if (_isMedicalVehicle && {!([_vehicle] call ace_medical_treatment_fnc_isMedicalVehicle)}) then {
+ _vehicle setVariable ["ace_medical_isMedicalVehicle", _isMedicalVehicle, true];
+};
+if (_isRepairVehicle && {!([_vehicle] call ace_repair_fnc_isRepairVehicle)}) then {
+ _vehicle setVariable ["ACE_isRepairVehicle", _isRepairVehicle, true];
+};
+if (_fuelSource isNotEqualTo []) then {
+ _fuelSource params [
+ ["_fuelCargo", 0, [0]],
+ ["_hooks", nil, [[]]],
+ ["_defaultFuelCargo", getNumber (configOf _vehicle >> "ace_refuel_fuelCargo"), [0]]
+ ];
+ if ((!isNil "_hooks") && {_hooks isNotEqualTo (_vehicle getVariable ["ace_refuel_hooks", []])}) then {
+ [_vehicle, _fuelCargo, _hooks] call ace_refuel_fnc_makeSource;
+ } else {
+ if (_fuelCargo != [_vehicle] call ace_refuel_fnc_getFuel) then {
+ [_vehicle, _fuelCargo] call ace_refuel_fnc_setFuel;
+ };
+ };
+ _vehicle setVariable ["btc_EDEN_defaultFuelCargo", _defaultFuelCargo, true];
+};
+if (_pylons isNotEqualTo []) then {
+ private _pylonPaths = (configProperties [configOf _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]) apply {getArray (_x >> "turret")};
+ {
+ _vehicle removeWeaponGlobal getText (configFile >> "CfgMagazines" >> _x >> "pylonWeapon")
+ } forEach getPylonMagazines _vehicle;
+ {
+ _vehicle setPylonLoadOut [_forEachIndex + 1, _x, true, _pylonPaths select _forEachIndex]
+ } forEach _pylons;
+};
+if (_isContaminated) then {
+ if ((btc_chem_contaminated pushBackUnique _vehicle) > -1) then {
+ publicVariable "btc_chem_contaminated";
+ };
+};
+if (_supplyVehicle isNotEqualTo []) then {
+ _supplyVehicle params [
+ ["_isSupplyVehicle", false, [false]],
+ ["_currentSupply", -1, [0]],
+ ["_defaultSupply", getNumber (configOf _vehicle >> "ace_rearm_defaultSupply"), [0]]
+ ];
+
+ if (_isSupplyVehicle) then {
+ if (_currentSupply isEqualTo -1) then {
+ [_vehicle, 0] call ace_rearm_fnc_makeSource;
+ } else {
+ [_vehicle, _currentSupply] call ace_rearm_fnc_makeSource;
+ }
+ };
+ _vehicle setVariable ["btc_EDEN_defaultSupply", _defaultSupply, true];
+};
+
+if (_customization select 0 isEqualTo []) then {
+ {
+ _vehicle setObjectTextureGlobal [_forEachIndex, _x];
+ } forEach _objectTexture;
+};
+
+_vehicle
diff --git a/hearts_and_minds.kunduz_valley/core/fnc/veh/respawn.sqf b/hearts_and_minds.kunduz_valley/core/fnc/veh/respawn.sqf
new file mode 100644
index 0000000..64ca45b
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/fnc/veh/respawn.sqf
@@ -0,0 +1,74 @@
+
+/* ----------------------------------------------------------------------------
+Function: btc_veh_fnc_respawn
+
+Description:
+ Respawn the vehicle passed in parameter.
+
+Parameters:
+ _vehicle - Vehicle object. [Object]
+ _serialisedVeh - Serialised vehicle. [Object]
+
+Returns:
+
+Examples:
+ (begin example)
+ [cursorObject] call btc_veh_fnc_respawn;
+ (end)
+
+Author:
+ Giallustio
+
+---------------------------------------------------------------------------- */
+
+params [
+ ["_vehicle", objNull, [objNull]],
+ ["_serialisedVeh", [], [[]]]
+];
+
+btc_veh_respawnable deleteAt (btc_veh_respawnable find _vehicle);
+
+crew _vehicle call btc_fnc_moveOut;
+[{
+ crew (_this select 0) isEqualTo []
+}, {
+ params ["_vehicle", "_serialisedVeh"];
+
+ _vehicle call CBA_fnc_deleteEntity;
+
+ [{
+ params [
+ "_type",
+ "_pos",
+ "_dir",
+ "_time",
+ ["_vectorPos", [], [[]]],
+ ["_customization", [false, false], [[]]],
+ ["_isMedicalVehicle", false, [true]],
+ ["_isRepairVehicle", false, [true]],
+ ["_fuelSource", [], [[]]],
+ ["_pylons", [], [[]]],
+ ["_isContaminated", false, [false]],
+ ["_supplyVehicle", [], [[]]],
+ ["_objectTexture", [], [[]]],
+ ["_EDENinventory", [], [[]]]
+ ];
+
+ private _vehicle = _type createVehicle _pos;
+ _vehicle setDir _dir;
+ _vehicle setPosASL _pos;
+ _vehicle setVectorDirAndUp _vectorPos;
+
+ if (unitIsUAV _vehicle) then {
+ createVehicleCrew _vehicle;
+ };
+
+ [_vehicle, _customization, _isMedicalVehicle, _isRepairVehicle, _fuelSource, _pylons, _isContaminated, _supplyVehicle, _objectTexture] call btc_veh_fnc_propertiesSet;
+ if (_EDENinventory isNotEqualTo []) then {
+ _vehicle setVariable ["btc_EDENinventory", _EDENinventory];
+ [_vehicle, _EDENinventory] call btc_log_fnc_inventorySet;
+ };
+
+ [_vehicle, _time] call btc_veh_fnc_addRespawn;
+ }, _serialisedVeh, 2] call CBA_fnc_waitAndExecute;
+}, [_vehicle, _serialisedVeh]] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/img/btc.paa b/hearts_and_minds.kunduz_valley/core/img/btc.paa
new file mode 100644
index 0000000..5bb3898
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/img/btc.paa
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c131d3daa8c293c205b4b3d7d1bc6f2844551b58ff0b72e42034738392f6424b
+size 87559
diff --git a/hearts_and_minds.kunduz_valley/core/img/hideout.jpg b/hearts_and_minds.kunduz_valley/core/img/hideout.jpg
new file mode 100644
index 0000000..6a850b8
Binary files /dev/null and b/hearts_and_minds.kunduz_valley/core/img/hideout.jpg differ
diff --git a/hearts_and_minds.kunduz_valley/core/init.sqf b/hearts_and_minds.kunduz_valley/core/init.sqf
new file mode 100644
index 0000000..226e897
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/init.sqf
@@ -0,0 +1,18 @@
+enableSaving [false, false];
+
+[] call compileScript ["core\def\mission.sqf"];
+[] call compileScript ["define_mod.sqf"];
+
+if (isServer) then {
+ [] call compileScript ["core\init_server.sqf"];
+};
+
+[] call compileScript ["core\init_common.sqf"];
+
+if (!isDedicated && hasInterface) then {
+ [] call compileScript ["core\init_player.sqf"];
+};
+
+if (!isDedicated && !hasInterface) then {
+ [] call compileScript ["core\init_headless.sqf"];
+};
diff --git a/hearts_and_minds.kunduz_valley/core/init_common.sqf b/hearts_and_minds.kunduz_valley/core/init_common.sqf
new file mode 100644
index 0000000..ab0c014
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/init_common.sqf
@@ -0,0 +1 @@
+//
\ No newline at end of file
diff --git a/hearts_and_minds.kunduz_valley/core/init_headless.sqf b/hearts_and_minds.kunduz_valley/core/init_headless.sqf
new file mode 100644
index 0000000..2df24c9
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/init_headless.sqf
@@ -0,0 +1,2 @@
+
+[] call btc_eh_fnc_headless;
diff --git a/hearts_and_minds.kunduz_valley/core/init_player.sqf b/hearts_and_minds.kunduz_valley/core/init_player.sqf
new file mode 100644
index 0000000..9b71072
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/init_player.sqf
@@ -0,0 +1,64 @@
+btc_map_mapIllumination = ace_map_mapIllumination;
+if !(isNil "btc_custom_loc") then {
+ {
+ _x params ["_pos", "_cityType", "_cityName", "_radius"];
+ private _location = createLocation [_cityType, _pos, _radius, _radius];
+ _location setText _cityName;
+ } forEach btc_custom_loc;
+};
+btc_intro_done = [] spawn btc_respawn_fnc_intro;
+[] call btc_int_fnc_shortcuts;
+[] call btc_lift_fnc_shortcuts;
+
+[{!isNull player}, {
+ [] call compileScript ["core\doc.sqf"];
+
+ btc_respawn_marker setMarkerPosLocal player;
+ player addRating 9999;
+ ["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
+
+ [player] call btc_eh_fnc_player;
+
+ private _arsenal_trait = player call btc_arsenal_fnc_trait;
+ if (btc_p_arsenal_Restrict isEqualTo 3) then {
+ [_arsenal_trait select 1] call btc_arsenal_fnc_weaponsFilter;
+ };
+
+ btc_fob_timeout = btc_fob_timeout + CBA_missionTime;
+ [] call btc_int_fnc_add_actions;
+
+ if (player getVariable ["interpreter", false]) then {
+ player createDiarySubject ["btc_diarylog", localize "STR_BTC_HAM_CON_INFO_ASKHIDEOUT_DIARYLOG", '\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa'];
+ };
+
+ switch (btc_p_autoloadout) do {
+ case 1: {
+ player setUnitLoadout ([_arsenal_trait select 0] call btc_arsenal_fnc_loadout);
+ };
+ case 2: {
+ removeAllWeapons player;
+ };
+ default {
+ };
+ };
+
+ [] call btc_respawn_fnc_screen;
+
+ if (btc_debug) then {
+ addMissionEventHandler ["MapSingleClick", {
+ params ["_units", "_pos", "_alt", "_shift"];
+ if (
+ alive player &&
+ !_alt &&
+ !_shift
+ ) then {
+ vehicle player setPos _pos;
+ };
+ }];
+ player allowDamage false;
+
+ [{!isNull (findDisplay 12)}, {
+ ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", btc_debug_fnc_marker];
+ }] call CBA_fnc_waitUntilAndExecute;
+ };
+}] call CBA_fnc_waitUntilAndExecute;
diff --git a/hearts_and_minds.kunduz_valley/core/init_server.sqf b/hearts_and_minds.kunduz_valley/core/init_server.sqf
new file mode 100644
index 0000000..7b94867
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/core/init_server.sqf
@@ -0,0 +1,68 @@
+[] call compileScript ["core\fnc\city\init.sqf"];
+
+["Initialize", [true]] call BIS_fnc_dynamicGroups;
+setTimeMultiplier btc_p_acctime;
+
+["btc_m", -1, objNull, "", false, false] call btc_task_fnc_create;
+[["btc_dft", "btc_m"], 0] call btc_task_fnc_create;
+[["btc_dty", "btc_m"], 1] call btc_task_fnc_create;
+
+if (btc_db_load && {profileNamespace getVariable [format ["btc_hm_%1_db", worldName], false]}) then {
+ if ((profileNamespace getVariable [format ["btc_hm_%1_version", worldName], 1.13]) in [btc_version select 1, 22.1, 23, 24]) then {
+ [] call compileScript ["core\fnc\db\load.sqf"];
+ } else {
+ [] call compileScript ["core\fnc\db\load_old.sqf"];
+ };
+} else {
+ if (btc_hideout_n > 0) then {
+ for "_i" from 1 to btc_hideout_n do {[] call btc_hideout_fnc_create;};
+ } else {
+ [] spawn btc_fnc_final_phase;
+ };
+
+ [] call btc_cache_fnc_init;
+
+ btc_startDate set [3, btc_p_time];
+ setDate btc_startDate;
+
+ {
+ _x call btc_veh_fnc_add;
+ } forEach (getMissionLayerEntities "btc_vehicles" select 0);
+ if (isNil "btc_vehicles") then {btc_vehicles = [];};
+};
+
+[] call btc_eh_fnc_server;
+[btc_ied_list] call btc_ied_fnc_fired_near;
+[] call btc_chem_fnc_checkLoop;
+[] call btc_chem_fnc_handleShower;
+[] call btc_spect_fnc_checkLoop;
+[] call btc_db_fnc_autoRestartLoop;
+
+{
+ [_x, 30] call btc_veh_fnc_addRespawn;
+ if (_forEachIndex isEqualTo 0) then {
+ missionNamespace setVariable ["btc_veh_respawnable_1", _x, true];
+ };
+} forEach (getMissionLayerEntities "btc_veh_respawnable" select 0);
+if (isNil "btc_veh_respawnable") then {btc_veh_respawnable = [];};
+
+if (btc_p_side_mission_cycle > 0) then {
+ for "_i" from 1 to btc_p_side_mission_cycle do {
+ [true] spawn btc_side_fnc_create;
+ };
+};
+
+{
+ ["btc_tag_remover" + _x, "STR_BTC_HAM_ACTION_REMOVETAG", _x, ["#(rgb,8,8,3)color(0,0,0,0)"], "\a3\Modules_F_Curator\Data\portraitSmoke_ca.paa"] call ace_tagging_fnc_addCustomTag;
+} forEach ["ACE_SpraypaintRed"];
+
+if (
+ btc_p_respawn_ticketsShare &&
+ {btc_p_respawn_ticketsAtStart >= 0}
+) then {
+ private _tickets = btc_respawn_tickets getOrDefault [btc_player_side, btc_p_respawn_ticketsAtStart];
+ if (_tickets isEqualTo 0) then {
+ _tickets = -1;
+ };
+ [btc_player_side, _tickets] call BIS_fnc_respawnTickets;
+};
diff --git a/hearts_and_minds.kunduz_valley/core/sounds/allahu_akbar.ogg b/hearts_and_minds.kunduz_valley/core/sounds/allahu_akbar.ogg
new file mode 100644
index 0000000..a5ad83c
Binary files /dev/null and b/hearts_and_minds.kunduz_valley/core/sounds/allahu_akbar.ogg differ
diff --git a/hearts_and_minds.kunduz_valley/define_mod.sqf b/hearts_and_minds.kunduz_valley/define_mod.sqf
new file mode 100644
index 0000000..15e7826
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/define_mod.sqf
@@ -0,0 +1,76 @@
+btc_custom_loc = [
+/*
+ DESCRIPTION: [POS(Array),TYPE(String),NAME(String),RADIUS (Number),IS OCCUPIED(Bool)]
+ Possible types: "NameVillage","NameCity","NameCityCapital","NameLocal","Hill","Airport","NameMarine", "StrongpointArea", "BorderCrossing", "VegetationFir"
+ EXAMPLE: [[13132.8,3315.07,0.00128174],"NameVillage","Mountain 1",800,true]
+*/
+];
+
+/*
+ Here you can tweak spectator view during respawn screen.
+*/
+BIS_respSpecAi = false; // Allow spectating of AI
+BIS_respSpecAllowFreeCamera = false; // Allow moving the camera independent from units (players)
+BIS_respSpecAllow3PPCamera = false; // Allow 3rd person camera
+BIS_respSpecShowFocus = false; // Show info about the selected unit (dissapears behind the respawn UI)
+BIS_respSpecShowCameraButtons = true; // Show buttons for switching between free camera, 1st and 3rd person view (partially overlayed by respawn UI)
+BIS_respSpecShowControlsHelper = true; // Show the controls tutorial box
+BIS_respSpecShowHeader = true; // Top bar of the spectator UI including mission time
+BIS_respSpecLists = true; // Show list of available units and locations on the left hand side
+
+/*
+ Here you can specify which equipment should be added or removed from the arsenal.
+ Please take care that there are different categories (weapons, magazines, items, backpacks) for different pieces of equipment into which you have to classify the classnames.
+ In all cases, you need the classname of an object.
+
+ Attention: The function of these lists depends on the setting in the mission parameter (Restrict arsenal).
+ - "Full": here you have only the registered items in the arsenal available.
+ - "Remove only": here all registered items are removed from the arsenal. This only works for the ACE3 arsenal!
+
+ Example(s):
+ private _weapons = [
+ "arifle_MX_F", //Classname for the rifle MX
+ "arifle_MX_SW_F", //Classname for the rifle MX LSW
+ "arifle_MXC_F" //Classname for the rifle MXC
+ ];
+
+ private _items = [
+ "G_Shades_Black",
+ "G_Shades_Blue",
+ "G_Shades_Green"
+ ];
+*/
+private _weapons = [];
+private _magazines = [];
+private _items = [];
+private _backpacks = [];
+
+btc_custom_arsenal = [_weapons, _magazines, _items, _backpacks];
+
+/*
+ Here you can specify which equipment is loaded on player connection.
+*/
+
+private _radio = ["tf_anprc152", "ACRE_PRC148"] select (isClass(configFile >> "cfgPatches" >> "acre_main"));
+//Array of colored item: 0 - Desert, 1 - Tropic, 2 - Black, 3 - forest
+private _uniforms = ["U_B_CombatUniform_mcam", "U_B_CTRG_Soldier_F", "U_B_CTRG_1", "U_B_CombatUniform_mcam_wdl_f"];
+private _uniformsCBRN = ["U_B_CBRN_Suit_01_MTP_F", "U_B_CBRN_Suit_01_Tropic_F", "U_C_CBRN_Suit_01_Blue_F", "U_B_CBRN_Suit_01_Wdl_F"];
+private _uniformsSniper = ["U_B_FullGhillie_sard", "U_B_FullGhillie_lsh", "U_B_T_FullGhillie_tna_F", "U_B_T_FullGhillie_tna_F"];
+private _vests = ["V_PlateCarrierH_CTRG", "V_PlateCarrier2_rgr_noflag_F", "V_PlateCarrierH_CTRG", "V_PlateCarrier2_wdl"];
+private _helmets = ["H_HelmetSpecB_paint2", "H_HelmetB_Enh_tna_F", "H_HelmetSpecB_blk", "H_HelmetSpecB_wdl"];
+private _hoods = ["G_Balaclava_combat", "G_Balaclava_TI_G_tna_F", "G_Balaclava_combat", "G_Balaclava_combat"];
+private _hoodCBRN = "G_AirPurifyingRespirator_01_F";
+private _laserdesignators = ["Laserdesignator", "Laserdesignator_03", "Laserdesignator_01_khk_F", "Laserdesignator_01_khk_F"];
+private _night_visions = ["NVGoggles", "NVGoggles_INDEP", "NVGoggles_OPFOR", "NVGoggles_INDEP"];
+private _weapons = ["arifle_MXC_F", "arifle_MXC_khk_F", "arifle_MXC_Black_F", "arifle_MXC_Black_F"];
+private _weapons_machineGunner = ["arifle_MX_SW_F", "arifle_MX_SW_khk_F", "arifle_MX_SW_Black_F", "arifle_MX_SW_Black_F"];
+private _weapons_sniper = ["arifle_MXM_F", "arifle_MXM_khk_F", "arifle_MXM_Black_F", "arifle_MXM_Black_F"];
+private _bipods = ["bipod_01_F_snd", "bipod_01_F_khk", "bipod_01_F_blk", "bipod_01_F_blk"];
+private _pistols = ["hgun_P07_F", "hgun_P07_khk_F", "hgun_P07_F", "hgun_P07_khk_F"];
+private _launcher_AT = ["launch_B_Titan_short_F", "launch_B_Titan_short_tna_F", "launch_O_Titan_short_F", "launch_B_Titan_short_tna_F"];
+private _launcher_AA = ["launch_B_Titan_F", "launch_B_Titan_tna_F", "launch_O_Titan_F", "launch_B_Titan_tna_F"];
+private _backpacks = ["B_AssaultPack_Kerry", "B_AssaultPack_eaf_F", "B_AssaultPack_blk", "B_AssaultPack_wdl_F"];
+private _backpacks_big = ["B_Kitbag_mcamo", "B_Kitbag_rgr", "B_Kitbag_rgr", "B_Kitbag_rgr"];
+private _backpackCBRN = "B_CombinationUnitRespirator_01_F";
+
+btc_arsenal_loadout = [_uniforms, _uniformsCBRN, _uniformsSniper, _vests, _helmets, _hoods, [_hoodCBRN, _hoodCBRN, _hoodCBRN, _hoodCBRN], _laserdesignators, _night_visions, _weapons, _weapons_sniper, _weapons_machineGunner, _bipods, _pistols, _launcher_AT, _launcher_AA, _backpacks, _backpacks_big, [_backpackCBRN, _backpackCBRN, _backpackCBRN, _backpackCBRN], [_radio, _radio, _radio, _radio]];
diff --git a/hearts_and_minds.kunduz_valley/description.ext b/hearts_and_minds.kunduz_valley/description.ext
new file mode 100644
index 0000000..15781d5
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/description.ext
@@ -0,0 +1,59 @@
+
+loadScreen = "core\img\btc.paa";
+author = "Giallustio";
+onLoadName = $STR_BTC_HAM_DESCR_NAME;
+onLoadMission = $STR_BTC_HAM_DESCR_MISSION;
+enabledebugconsole = 1;
+
+#include "core\fnc\common\dlg.hpp"
+#include "core\fnc\fob\dlg.hpp"
+#include "core\fnc\log\dlg.hpp"
+#include "core\fnc\debug\defines.hpp"
+
+class RscTitles {
+ class Default {
+ idd = -1;
+ fadein = 0;
+ fadeout = 0;
+ duration = 0;
+ };
+ #include "core\fnc\lift\rsc.hpp"
+ #include "core\fnc\debug\dlg.hpp"
+};
+
+#include "core\def\param.hpp"
+
+#include "core\fnc\mil\aiskill.hpp"
+
+#include "core\fnc\task\taskTypes.hpp"
+
+class CfgFunctions {
+ // add your own functions below
+};
+
+// CBA XEH
+class Extended_PreInit_EventHandlers {
+ #include "core\fnc\eh\xeh_PreInit_EH.hpp"
+};
+
+class Extended_InitPost_EventHandlers {
+ class LandVehicle {
+ #include "core\fnc\eh\xeh_InitPost_EH_Vehicle.hpp"
+ };
+ class Air {
+ #include "core\fnc\eh\xeh_InitPost_EH_Vehicle.hpp"
+ };
+ class Ship {
+ #include "core\fnc\eh\xeh_InitPost_EH_Vehicle.hpp"
+ };
+};
+
+respawn = 3;
+respawnDelay = 2;
+respawnDialog = 0;
+respawnOnStart = 0;
+respawnTemplates[] = {"MenuPosition", "Tickets"};
+
+// Disable BI wreck system (H&M handle it internally)
+wreckManagerMode = 0;
+corpseManagerMode = 0;
diff --git a/hearts_and_minds.kunduz_valley/init.sqf b/hearts_and_minds.kunduz_valley/init.sqf
new file mode 100644
index 0000000..8a8ec55
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/init.sqf
@@ -0,0 +1,2 @@
+
+[compileScript ["core\init.sqf"]] call CBA_fnc_directCall;
diff --git a/hearts_and_minds.kunduz_valley/mission.sqm b/hearts_and_minds.kunduz_valley/mission.sqm
new file mode 100644
index 0000000..aa69286
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/mission.sqm
@@ -0,0 +1,2687 @@
+version=54;
+class EditorData
+{
+ moveGridStep=0.125;
+ angleGridStep=0.2617994;
+ scaleGridStep=1;
+ autoGroupingDist=10;
+ toggles=517;
+ mods[]=
+ {
+ "3denEnhanced"
+ };
+ class ItemIDProvider
+ {
+ nextID=249;
+ };
+ class MarkerIDProvider
+ {
+ nextID=3;
+ };
+ class LayerIndexProvider
+ {
+ nextID=7;
+ };
+ class Camera
+ {
+ pos[]={1533.485,48.208603,8559.1416};
+ dir[]={-0.81937075,-0.55340642,0.1502777};
+ up[]={-0.5443778,0.83286208,0.099844806};
+ aside[]={0.18041804,-4.2986358e-07,0.98369884};
+ };
+};
+binarizationWanted=0;
+sourceName="hearts_and_minds";
+addons[]=
+{
+ "A3_Ui_F",
+ "A3_Structures_F_Ind_Cargo",
+ "ace_cargo",
+ "A3_Structures_F_Mil_Helipads",
+ "A3_Characters_F",
+ "ace_explosives",
+ "A3_Modules_F_Curator_Curator",
+ "A3_Characters_F_Enoch",
+ "A3_Characters_F_Mark",
+ "A3_Props_F_Enoch_Military_Decontamination",
+ "A3_Signs_F",
+ "A3_Air_F_Heli_Heli_Transport_03",
+ "ace_realisticnames",
+ "A3_Soft_F_Gamma_Truck_01",
+ "Blastcore_MainCore",
+ "ace_refuel",
+ "ace_rearm",
+ "A3_Soft_F_Enoch_Truck_01",
+ "A3_Soft_F_Beta_Truck_01",
+ "A3_Soft_F_MRAP_01",
+ "A3_Armor_F_Beta_APC_Tracked_01",
+ "ace_interaction",
+ "ace_vehicle_damage",
+ "acre_sys_intercom",
+ "A3_Soft_F_Exp_LSV_01",
+ "A3_Air_F_Beta_Heli_Attack_01",
+ "A3_Soft_F_Offroad_01",
+ "A3_Air_F_Beta_Heli_Transport_01",
+ "A3_Armor_F_Beta_APC_Wheeled_01",
+ "A3_Structures_F_Mil_Flags"
+};
+class AddonsMetaData
+{
+ class List
+ {
+ items=25;
+ class Item0
+ {
+ className="A3_Ui_F";
+ name="Arma 3 - User Interface";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item1
+ {
+ className="A3_Structures_F_Ind";
+ name="Arma 3 - Industrial Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item2
+ {
+ className="ace_cargo";
+ name="ACE3 - Cargo";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item3
+ {
+ className="A3_Structures_F_Mil";
+ name="Arma 3 - Military Buildings and Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item4
+ {
+ className="A3_Characters_F";
+ name="Arma 3 Alpha - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item5
+ {
+ className="ace_explosives";
+ name="ACE3 - Explosives";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item6
+ {
+ className="A3_Modules_F_Curator";
+ name="Arma 3 Zeus Update - Scripted Modules";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item7
+ {
+ className="A3_Characters_F_Enoch";
+ name="Arma 3 Contact Platform - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item8
+ {
+ className="A3_Characters_F_Mark";
+ name="Arma 3 Marksmen - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item9
+ {
+ className="A3_Props_F_Enoch";
+ name="Arma 3 Contact Platform - Decorative and Mission Objects";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item10
+ {
+ className="A3_Signs_F";
+ name="Arma 3 - Signs";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item11
+ {
+ className="A3_Air_F_Heli";
+ name="Arma 3 Helicopters - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item12
+ {
+ className="A3_Soft_F_Gamma";
+ name="Arma 3 - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item13
+ {
+ className="Blastcore_MainCore";
+ name="Blastcore_MainCore";
+ };
+ class Item14
+ {
+ className="ace_refuel";
+ name="ACE3 - Refuel";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item15
+ {
+ className="ace_rearm";
+ name="ACE3 - Rearm";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item16
+ {
+ className="A3_Soft_F_Enoch";
+ name="Arma 3 Contact Platform - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item17
+ {
+ className="A3_Soft_F_Beta";
+ name="Arma 3 Beta - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item18
+ {
+ className="A3_Soft_F";
+ name="Arma 3 Alpha - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item19
+ {
+ className="A3_Armor_F_Beta";
+ name="Arma 3 Beta - Armored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item20
+ {
+ className="ace_interaction";
+ name="ACE3 - Interaction";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item21
+ {
+ className="ace_vehicle_damage";
+ name="ACE3 - Vehicle Damage";
+ author="ACE-Team";
+ url="https://ace3.acemod.org/";
+ };
+ class Item22
+ {
+ className="acre_sys_intercom";
+ name="ACRE2 - Vehicle Intercom";
+ author="ACRE2Team";
+ url="https://github.com/IDI-Systems/acre2";
+ };
+ class Item23
+ {
+ className="A3_Soft_F_Exp";
+ name="Arma 3 Apex - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item24
+ {
+ className="A3_Air_F_Beta";
+ name="Arma 3 Beta - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ };
+};
+dlcs[]=
+{
+ "Enoch",
+ "Mark",
+ "Heli",
+ "Expansion"
+};
+randomSeed=2442963;
+class ScenarioData
+{
+ disabledAI=1;
+ class Header
+ {
+ gameType="Coop";
+ minPlayers=1;
+ maxPlayers=30;
+ };
+};
+class CustomAttributes
+{
+ class Category0
+ {
+ name="Multiplayer";
+ class Attribute0
+ {
+ property="RespawnButton";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="RespawnTemplates";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ class Category1
+ {
+ name="Scenario";
+ class Attribute0
+ {
+ property="cba_settings_hash";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#CBA_HASH#";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_respawn_savepredeathgear";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_medical_enablefor";
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_cargo_enable";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_repair_addspareparts";
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ nil=1;
+ singleType="ANY";
+ };
+ };
+ };
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="EnableDebugConsole";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+};
+class Mission
+{
+ class Intel
+ {
+ briefingName="=BTC= co 30 HEARTS AND MINDS";
+ overviewText="by Giallustio";
+ resistanceWest=0;
+ resistanceEast=1;
+ startWeather=0.29999998;
+ startWind=0.099999994;
+ startWaves=0.099999994;
+ forecastWeather=0.29999998;
+ forecastWind=0.099999994;
+ forecastWaves=0.099999994;
+ forecastLightnings=0.099999994;
+ rainForced=1;
+ lightningsForced=1;
+ wavesForced=1;
+ windForced=1;
+ year=2035;
+ month=6;
+ day=24;
+ hour=12;
+ minute=0;
+ startFogDecay=0.013;
+ forecastFogDecay=0.013;
+ };
+ class Entities
+ {
+ items=46;
+ class Item0
+ {
+ dataType="Marker";
+ position[]={1498.2076,34.950005,8585.1846};
+ name="respawn_west";
+ text="Arsenal/Re-deploy";
+ type="Empty";
+ angle=170.10909;
+ id=0;
+ atlOffset=3.8146973e-06;
+ };
+ class Item1
+ {
+ dataType="Marker";
+ position[]={1500.5,34.950001,8574.875};
+ name="btc_base";
+ type="flag_USA";
+ angle=170.10898;
+ id=1;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ENH_markerShape";
+ expression="if (_value != 'NONE' && isServer) then {_this setMarkerShape _value}";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="NONE";
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item2
+ {
+ dataType="Marker";
+ position[]={1436.2162,34.957569,8519.2598};
+ name="btc_log_point";
+ text="Logistic Point";
+ type="mil_flag";
+ colorName="ColorGreen";
+ a=0.5;
+ b=0.5;
+ angle=355.61514;
+ id=2;
+ atlOffset=3.8146973e-06;
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1452.2148,35.681328,8519.2354};
+ angles[]={-0,2.3818617,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_create_object";
+ disableSimulation=1;
+ };
+ id=13;
+ type="Land_CargoBox_V1_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1436.25,34.957504,8519.125};
+ angles[]={-0,0.81743199,6.2812018};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ name="btc_create_object_point";
+ };
+ id=14;
+ type="Land_HelipadSquare_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isRepairFacility";
+ expression="if (_value != (if (isNumber (configOf _this >> ""ace_repair_canRepair"")) then {getNumber (configOf _this >> ""ace_repair_canRepair"")} else {(parseNumber (getRepairCargo _this > 0))})) then {_this setVariable ['ace_isRepairFacility', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1492.8594,35.680996,8566.584};
+ angles[]={-0,2.3628442,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_gear_object";
+ disableSimulation=1;
+ };
+ id=15;
+ type="Land_CargoBox_V1_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1438.9198,34.950001,8483.8896};
+ angles[]={-0,5.5114813,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=17;
+ type="Land_HelipadSquare_F";
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1454.9515,34.950001,8500.6357};
+ angles[]={-0,5.5367761,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=23;
+ type="Land_HelipadSquare_F";
+ };
+ class Item8
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1494.7883,34.951443,8578.3369};
+ angles[]={-0,5.5210114,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""side_mission"",true]";
+ description="Officer";
+ isPlayer=1;
+ isPlayable=1;
+ };
+ id=25;
+ type="B_officer_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=24;
+ atlOffset=3.8146973e-06;
+ };
+ class Item9
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1496.7883,34.951443,8583.9619};
+ angles[]={-0,5.4937911,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""interpreter"",true]";
+ description="Interpreter";
+ isPlayable=1;
+ };
+ id=29;
+ type="B_Soldier_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=28;
+ atlOffset=3.8146973e-06;
+ };
+ class Item10
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1495.4271,34.951443,8582.3262};
+ angles[]={-0,5.3041844,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ description="Adv. Engineer";
+ isPlayable=1;
+ };
+ id=31;
+ type="B_engineer_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isEngineer";
+ expression="if !(_value == ([0, 1] select (_this getUnitTrait 'engineer')) || {_value == -1}) then {_this setVariable ['ace_isEngineer', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=2;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=30;
+ atlOffset=3.8146973e-06;
+ };
+ class Item11
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={1422.375,32.447784,8395.375};
+ angles[]={6.1716499,6.2066593,6.1186852};
+ };
+ id=71;
+ type="ModuleCurator_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ModuleCurator_F_Owner";
+ expression="_this setVariable ['Owner',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#adminLogged";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ModuleCurator_F_Forced";
+ expression="_this setVariable ['Forced',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ class Attribute2
+ {
+ property="ModuleCurator_F_Name";
+ expression="_this setVariable ['Name',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="";
+ };
+ };
+ };
+ class Attribute3
+ {
+ property="ModuleInfo";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ class Attribute4
+ {
+ property="ModuleCurator_F_Addons";
+ expression="_this setVariable ['Addons',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=3;
+ };
+ };
+ };
+ nAttributes=5;
+ };
+ };
+ class Item12
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1495.7883,34.951447,8589.7119};
+ angles[]={0,3.9862313,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=90;
+ type="B_medic_F";
+ atlOffset=7.6293945e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=89;
+ atlOffset=7.6293945e-06;
+ };
+ class Item13
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1497.1101,34.951447,8588.2432};
+ angles[]={0,3.9862313,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=92;
+ type="B_medic_F";
+ atlOffset=7.6293945e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=91;
+ atlOffset=7.6293945e-06;
+ };
+ class Item14
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1491.8171,34.964172,8588.4717};
+ angles[]={-0,2.3877542,6.2791886};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=180;
+ type="B_engineer_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=93;
+ };
+ class Item15
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1490.4944,34.960426,8587.2959};
+ angles[]={6.2791886,2.3876781,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=181;
+ type="B_engineer_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=95;
+ atlOffset=3.8146973e-06;
+ };
+ class Item16
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1489.3525,34.962742,8586.2559};
+ angles[]={6.2791886,2.3876781,6.2731905};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=182;
+ type="B_soldier_AR_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=97;
+ atlOffset=3.8146973e-06;
+ };
+ class Item17
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1488.0298,34.951878,8585.0811};
+ angles[]={6.269186,2.3877847,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=183;
+ type="B_soldier_AR_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=99;
+ atlOffset=3.8146973e-06;
+ };
+ class Item18
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1486.7565,34.951443,8583.9463};
+ angles[]={-0,2.3878019,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=184;
+ type="B_soldier_AR_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=101;
+ atlOffset=3.8146973e-06;
+ };
+ class Item19
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1485.434,34.951443,8582.7705};
+ angles[]={-0,2.3877008,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=185;
+ type="B_soldier_AT_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=103;
+ atlOffset=3.8146973e-06;
+ };
+ class Item20
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1484.2922,34.954269,8581.7295};
+ angles[]={-0,2.3875399,6.2791886};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=186;
+ type="B_soldier_AT_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.02;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=105;
+ };
+ class Item21
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1482.9695,34.953461,8580.5537};
+ angles[]={6.2791886,2.3875403,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=187;
+ type="B_soldier_AA_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.05;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=107;
+ atlOffset=3.8146973e-06;
+ };
+ class Item22
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1481.7264,34.951443,8579.4854};
+ angles[]={-0,2.3877037,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=226;
+ type="B_soldier_UAV_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=109;
+ atlOffset=3.8146973e-06;
+ };
+ class Item23
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1480.4038,34.951443,8578.3105};
+ angles[]={-0,2.3877037,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=227;
+ type="B_soldier_UAV_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=111;
+ atlOffset=3.8146973e-06;
+ };
+ class Item24
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1490.4133,34.969788,8589.8369};
+ angles[]={-0,2.3877542,6.2791886};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=228;
+ type="B_W_Soldier_CBRN_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=113;
+ };
+ class Item25
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1489.0906,34.974987,8588.6621};
+ angles[]={6.2791886,2.3876781,6.2731905};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=229;
+ type="B_W_Soldier_CBRN_F";
+ atlOffset=3.8146973e-06;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.95999998;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=115;
+ atlOffset=3.8146973e-06;
+ };
+ class Item26
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1487.9487,34.982239,8587.6211};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=118;
+ type="B_Sharpshooter_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=117;
+ atlOffset=3.8146973e-06;
+ };
+ class Item27
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1486.6261,34.970993,8586.4463};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=120;
+ type="B_Sharpshooter_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=119;
+ atlOffset=3.8146973e-06;
+ };
+ class Item28
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1485.353,34.95509,8585.3105};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=122;
+ type="B_Soldier_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=121;
+ atlOffset=3.8146973e-06;
+ };
+ class Item29
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1484.0303,34.955318,8584.1348};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=124;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=123;
+ };
+ class Item30
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1482.8882,34.959885,8583.0947};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=126;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=125;
+ };
+ class Item31
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1481.5657,34.95892,8581.9189};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=128;
+ type="B_Soldier_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=127;
+ atlOffset=3.8146973e-06;
+ };
+ class Item32
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1480.3226,34.954647,8580.8506};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=130;
+ type="B_Soldier_F";
+ atlOffset=3.8146973e-06;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=129;
+ atlOffset=3.8146973e-06;
+ };
+ class Item33
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1479,34.955441,8579.6748};
+ angles[]={0,2.3876998,-0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=132;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=131;
+ };
+ class Item34
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={1473.5,31.475029,8432};
+ angles[]={6.019474,0,6.2332273};
+ };
+ name="btc_hc_1";
+ isPlayable=1;
+ id=153;
+ type="HeadlessClient_F";
+ };
+ class Item35
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1333.8844,39.864479,8420.7148};
+ angles[]={6.2571907,5.5085602,6.2372012};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=200;
+ type="DeconShower_02_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="Decon_Shower_DisableUserActions";
+ expression="if(_value isEqualTo true)then{_this setVariable ['bin_deconshower_disableAction',true]}else{_this setVariable ['bin_deconshower_disableAction',false]};";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="Decon_Shower";
+ expression="if(_value isEqualTo true)then{[_this,5.4,4,2,true] spawn bin_fnc_deconShowerAnimLarge;}else{[_this] spawn bin_fnc_deconShowerAnimStop};";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item36
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1333.9758,36.367825,8420.4121};
+ angles[]={6.2571907,5.5085602,6.2372169};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=203;
+ type="Tarp_01_Large_Black_F";
+ };
+ class Item37
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1331.0281,36.725937,8416.0752};
+ angles[]={6.2571907,6.2066813,6.2212639};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=213;
+ type="RoadCone_L_F";
+ };
+ class Item38
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1328.9407,36.831932,8417.9297};
+ angles[]={6.2571907,6.206655,0.0060001095};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=214;
+ type="RoadCone_L_F";
+ };
+ class Item39
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1338.5321,36.567329,8423.5557};
+ angles[]={6.2312322,6.2065196,6.2152901};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=215;
+ type="RoadCone_L_F";
+ };
+ class Item40
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1336.5398,36.797203,8425.5186};
+ angles[]={6.2452021,6.2065196,6.2152901};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=216;
+ type="RoadCone_L_F";
+ };
+ class Item41
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={1466.375,32.779751,8435.625};
+ angles[]={6.0761933,0,6.2312322};
+ };
+ name="btc_hc_2";
+ isPlayable=1;
+ id=244;
+ type="HeadlessClient_F";
+ };
+ class Item42
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={1459.625,33.818527,8439.5};
+ angles[]={6.1012206,0,6.2551947};
+ };
+ name="btc_hc_3";
+ isPlayable=1;
+ id=245;
+ type="HeadlessClient_F";
+ atlOffset=3.8146973e-06;
+ };
+ class Item43
+ {
+ dataType="Layer";
+ name="btc_veh_respawnable";
+ class Entities
+ {
+ items=2;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={1337.5861,34.969315,8377.7754};
+ angles[]={-0,6.2067566,6.2751918};
+ };
+ title="Add respawnable vehicles to this layer";
+ description="Add all vehicles that should automatically respawn to ""btc_veh_respawnable"" layer. If a vehicle should NOT automatically respawn, add it to the layer named ""btc_vehicles"".";
+ id=237;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1406.0586,38.288044,8482.6729};
+ angles[]={-0,6.0250988,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=156;
+ type="B_Heli_Transport_03_F";
+ };
+ };
+ id=246;
+ atlOffset=0.0096549988;
+ };
+ class Item44
+ {
+ dataType="Layer";
+ name="btc_vehicles";
+ class Entities
+ {
+ items=20;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={1274.6461,39.832409,8413.8184};
+ angles[]={6.0781093,6.2034287,5.960835};
+ };
+ title="Add vehicles to this layer";
+ description="Add all vehicles that should NOT automatically respawn to ""btc_vehicles"" layer. If a vehicle SHOULD automatically respawn, add it to the layer named ""btc_veh_respawnable"".";
+ id=233;
+ atlOffset=3.8146973e-06;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1341.7771,37.401474,8411.8818};
+ angles[]={6.2491984,5.5551944,6.2272439};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=19;
+ type="B_Truck_01_fuel_F";
+ };
+ class Item2
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1355.9331,37.328819,8425.4355};
+ angles[]={6.2591896,5.5169988,6.2571907};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=230;
+ type="B_Truck_01_medical_F";
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1346.7238,37.253326,8415.6406};
+ angles[]={6.2491999,5.5552425,6.2392135};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=18;
+ type="B_Truck_01_ammo_F";
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1288.4355,38.369633,8399.5127};
+ angles[]={0.039977662,0.8657921,6.2332263};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=160;
+ type="B_Truck_01_flatbed_F";
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1351.2485,37.915291,8419.7559};
+ angles[]={6.2731848,5.5551291,6.2392135};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=225;
+ type="B_Truck_01_flatbed_F";
+ atlOffset=3.8146973e-06;
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1337.3239,37.997643,8408.5225};
+ angles[]={6.2531939,5.5550871,6.2053437};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=20;
+ type="B_Truck_01_Repair_F";
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1297.6987,37.607124,8407.5918};
+ angles[]={0.041975394,0.86644864,6.2711902};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=158;
+ type="B_Truck_01_transport_F";
+ };
+ class Item8
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1278.1174,38.337296,8391.0635};
+ angles[]={6.1973968,0.86646402,6.2392135};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=161;
+ type="B_Truck_01_transport_F";
+ };
+ class Item9
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1263.0278,39.076939,8373.5313};
+ angles[]={0.015998369,0.87969261,6.2292376};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=168;
+ type="B_MRAP_01_hmg_F";
+ atlOffset=-3.8146973e-06;
+ };
+ class Item10
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1268.5111,39.313591,8368.4043};
+ angles[]={0.095706634,0.27739882,0.03798008};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=169;
+ type="B_MRAP_01_hmg_F";
+ };
+ class Item11
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1359.8517,37.740486,8431.5938};
+ angles[]={6.2631893,5.4802432,6.2232561};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=231;
+ type="B_APC_Tracked_01_CRV_F";
+ };
+ class Item12
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1306.7247,38.753654,8395.6992};
+ angles[]={0.077842705,5.5814886,0.045968667};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=164;
+ type="B_LSV_01_armed_F";
+ };
+ class Item13
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1293.3826,38.83392,8385.2012};
+ angles[]={0.075854406,5.5816431,0.061920606};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=165;
+ type="B_LSV_01_armed_F";
+ };
+ class Item14
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1288.0763,38.834457,8381.0938};
+ angles[]={0.071875811,5.581584,0.067895547};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=166;
+ type="B_LSV_01_armed_F";
+ };
+ class Item15
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1268.234,38.674942,8385.0527};
+ angles[]={6.1499786,1.3733871,6.1736259};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=178;
+ type="B_LSV_01_armed_F";
+ };
+ class Item16
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1439.1748,36.871048,8483.4697};
+ angles[]={-0,5.4994946,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=175;
+ type="B_Heli_Attack_01_dynamicLoadout_F";
+ };
+ class Item17
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1370.833,36.559578,8436.251};
+ angles[]={-0,5.6269097,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ textures="Beige";
+ };
+ id=243;
+ type="C_Offroad_01_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ammoBox";
+ expression="[_this,_value] call bis_fnc_initAmmoBox;";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="[[[[""FirstAidKit""],[4]],[[],[]],[[],[]],[[],[]]],false]";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="VehicleCustomization";
+ expression="if (local _this) then {([_this] + _value + [true]) call (uinamespace getvariable 'BIS_fnc_initVehicle')};";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=22;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor1";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor2";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item4
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor3";
+ };
+ };
+ class Item5
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item6
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBackpacks";
+ };
+ };
+ class Item7
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item8
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper1";
+ };
+ };
+ class Item9
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item10
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper2";
+ };
+ };
+ class Item11
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item12
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideConstruction";
+ };
+ };
+ class Item13
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item14
+ {
+ class data
+ {
+ singleType="STRING";
+ value="hidePolice";
+ };
+ };
+ class Item15
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item16
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideServices";
+ };
+ };
+ class Item17
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item18
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsStart";
+ };
+ };
+ class Item19
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item20
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsServicesStart";
+ };
+ };
+ class Item21
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item18
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1456.25,37.089218,8499.3887};
+ angles[]={-0,5.5428743,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=174;
+ type="B_Heli_Transport_01_camo_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_fastroping_equipFRIES";
+ expression="if (_value) then {[_this] call ace_fastroping_fnc_equipFRIES}";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item19
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1287.0236,40.065952,8362.3975};
+ angles[]={-0,5.6419249,6.1934276};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=170;
+ type="B_APC_Wheeled_01_cannon_F";
+ };
+ };
+ id=247;
+ atlOffset=1.1330376;
+ };
+ class Item45
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={1495.625,38.926804,8569.125};
+ angles[]={-0,2.968962,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=248;
+ type="Flag_US_F";
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/mission__Enoch.sqm b/hearts_and_minds.kunduz_valley/mission__Enoch.sqm
new file mode 100644
index 0000000..9af9013
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/mission__Enoch.sqm
@@ -0,0 +1,2584 @@
+version=54;
+class EditorData
+{
+ moveGridStep=0.125;
+ angleGridStep=0.2617994;
+ scaleGridStep=0.1;
+ autoGroupingDist=10;
+ toggles=581;
+ class ItemIDProvider
+ {
+ nextID=260;
+ };
+ class MarkerIDProvider
+ {
+ nextID=3;
+ };
+ class LayerIndexProvider
+ {
+ nextID=2;
+ };
+ class Camera
+ {
+ pos[]={7197.4136,319.86118,1018.6057};
+ dir[]={-0.76664788,-0.48228309,0.42388633};
+ up[]={-0.42210731,0.8759892,0.23338729};
+ aside[]={0.48387721,-5.1857205e-007,0.87514752};
+ };
+};
+binarizationWanted=0;
+addons[]=
+{
+ "A3_Ui_F",
+ "A3_Structures_F_Ind_Cargo",
+ "ace_cargo",
+ "A3_Structures_F_Mil_Helipads",
+ "A3_Structures_F_Mil_Flags",
+ "A3_Characters_F",
+ "ace_explosives",
+ "A3_Modules_F_Curator_Curator",
+ "A3_Characters_F_Enoch",
+ "A3_Characters_F_Mark",
+ "A3_Props_F_Enoch_Military_Decontamination",
+ "A3_Signs_F",
+ "A3_Air_F_Heli_Heli_Transport_03",
+ "ace_realisticnames",
+ "A3_Soft_F_Exp_Truck_01",
+ "A3_Soft_F_Enoch_Truck_01",
+ "A3_Armor_F_Exp_APC_Tracked_01",
+ "A3_Soft_F_Exp_MRAP_01",
+ "A3_Soft_F_Exp_LSV_01",
+ "A3_Armor_F_Exp_APC_Wheeled_01",
+ "A3_Soft_F_Offroad_01",
+ "A3_Air_F_Beta_Heli_Transport_01",
+ "A3_Air_F_Beta_Heli_Attack_01"
+};
+class AddonsMetaData
+{
+ class List
+ {
+ items=17;
+ class Item0
+ {
+ className="A3_Ui_F";
+ name="Arma 3 - User Interface";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item1
+ {
+ className="A3_Structures_F_Ind";
+ name="Arma 3 - Industrial Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item2
+ {
+ className="ace_cargo";
+ name="ACE3 - Cargo";
+ author="ACE-Team";
+ url="http://ace3mod.com/";
+ };
+ class Item3
+ {
+ className="A3_Structures_F_Mil";
+ name="Arma 3 - Military Buildings and Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item4
+ {
+ className="A3_Characters_F";
+ name="Arma 3 Alpha - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item5
+ {
+ className="ace_explosives";
+ name="ACE3 - Explosives";
+ author="ACE-Team";
+ url="http://ace3mod.com/";
+ };
+ class Item6
+ {
+ className="A3_Modules_F_Curator";
+ name="Arma 3 Zeus Update - Scripted Modules";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item7
+ {
+ className="A3_Characters_F_Enoch";
+ name="Arma 3 Contact Platform - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item8
+ {
+ className="A3_Characters_F_Mark";
+ name="Arma 3 Marksmen - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item9
+ {
+ className="A3_Props_F_Enoch";
+ name="Arma 3 Contact Platform - Decorative and Mission Objects";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item10
+ {
+ className="A3_Signs_F";
+ name="Arma 3 - Signs";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item11
+ {
+ className="A3_Air_F_Heli";
+ name="Arma 3 Helicopters - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item12
+ {
+ className="A3_Soft_F_Exp";
+ name="Arma 3 Apex - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item13
+ {
+ className="A3_Soft_F_Enoch";
+ name="Arma 3 Contact Platform - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item14
+ {
+ className="A3_Armor_F_Exp";
+ name="Arma 3 Apex - Armored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item15
+ {
+ className="A3_Soft_F";
+ name="Arma 3 Alpha - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item16
+ {
+ className="A3_Air_F_Beta";
+ name="Arma 3 Beta - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ };
+};
+randomSeed=2442963;
+class ScenarioData
+{
+ disabledAI=1;
+ class Header
+ {
+ gameType="Coop";
+ minPlayers=1;
+ maxPlayers=30;
+ };
+};
+class CustomAttributes
+{
+ class Category0
+ {
+ name="Multiplayer";
+ class Attribute0
+ {
+ property="RespawnButton";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="RespawnTemplates";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ class Category1
+ {
+ name="Scenario";
+ class Attribute0
+ {
+ property="cba_settings_hash";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#CBA_HASH#";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_respawn_savepredeathgear";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_medical_enablefor";
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_cargo_enable";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_repair_addspareparts";
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ nil=1;
+ singleType="ANY";
+ };
+ };
+ };
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="EnableDebugConsole";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+};
+class Mission
+{
+ class Intel
+ {
+ briefingName="=BTC= co 30 HEARTS AND MINDS";
+ overviewText="by Giallustio";
+ resistanceWest=0;
+ resistanceEast=1;
+ startWeather=0.29999998;
+ startWind=0.099999994;
+ startWaves=0.099999994;
+ forecastWeather=0.29999998;
+ forecastWind=0.099999994;
+ forecastWaves=0.099999994;
+ forecastLightnings=0.099999994;
+ rainForced=1;
+ lightningsForced=1;
+ wavesForced=1;
+ windForced=1;
+ year=2035;
+ month=6;
+ day=24;
+ hour=12;
+ minute=0;
+ startFogDecay=0.013;
+ forecastFogDecay=0.013;
+ };
+ class Entities
+ {
+ items=46;
+ class Item0
+ {
+ dataType="Marker";
+ position[]={7078.8252,275.73099,1076.777};
+ name="respawn_west";
+ text=$STR_BTC_HAM_INTRO_ARSENAL_REDEPLOY;
+ type="Empty";
+ id=0;
+ atlOffset=-3.0517578e-005;
+ };
+ class Item1
+ {
+ dataType="Marker";
+ position[]={7093.0591,273.832,1066.749};
+ name="btc_base";
+ type="flag_NATO";
+ id=1;
+ atlOffset=0.0002746582;
+ };
+ class Item2
+ {
+ dataType="Marker";
+ position[]={7134.3281,270.61099,1067.021};
+ name="btc_log_point";
+ text=$STR_BTC_HAM_MSQM_MRK_LOGPOINT;
+ type="mil_flag";
+ colorName="ColorGreen";
+ a=0.5;
+ b=0.5;
+ id=2;
+ atlOffset=-0.00021362305;
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7127.7729,271.90936,1072.0499};
+ angles[]={6.1874776,0.72975159,0.028790962};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_create_object";
+ disableSimulation=1;
+ };
+ id=13;
+ type="Land_CargoBox_V1_F";
+ atlOffset=-0.0032958984;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7135.5,270.80606,1071};
+ angles[]={0.0080009829,2.2298627,6.1716485};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ name="btc_create_object_point";
+ };
+ id=14;
+ type="Land_HelipadSquare_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isRepairFacility";
+ expression="if (_value != (if (isNumber (configOf _this >> ""ace_repair_canRepair"")) then {getNumber (configOf _this >> ""ace_repair_canRepair"")} else {0})) then {_this setVariable ['ace_isRepairFacility', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7081.1602,276.27856,1071.2151};
+ angles[]={0.01919602,0.72975159,6.127655};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_gear_object";
+ disableSimulation=1;
+ };
+ id=15;
+ type="Land_CargoBox_V1_F";
+ atlOffset=-0.048339844;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7024,280.97366,1081};
+ angles[]={0.070284568,2.2298608,6.1480141};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=17;
+ type="Land_HelipadSquare_F";
+ atlOffset=3.0517578e-005;
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7089.8691,278.24274,1065.3191};
+ angles[]={6.2735796,1.3358874,6.1401696};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=21;
+ type="Flag_NATO_F";
+ };
+ class Item8
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7054,279.31042,1061};
+ angles[]={0.017595299,2.2298608,6.219274};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=23;
+ type="Land_HelipadSquare_F";
+ atlOffset=3.0517578e-005;
+ };
+ class Item9
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.8555,275.66995,1069.363};
+ angles[]={0.01919602,3.8879185,6.133904};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""side_mission"",true]";
+ description=$STR_B_OFFICER_F0;
+ isPlayer=1;
+ isPlayable=1;
+ };
+ id=25;
+ type="B_officer_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=24;
+ };
+ class Item10
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7079.2837,275.80377,1074.7056};
+ angles[]={0.01919602,3.8606362,6.133904};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""interpreter"",true]";
+ description=$STR_BTC_HAM_MSQM_INTERPRETER;
+ isPlayable=1;
+ };
+ id=29;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=28;
+ };
+ class Item11
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.2969,275.67166,1073.6476};
+ angles[]={0.01919602,3.6710505,6.133904};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ description=$STR_ACE_Repair_AssignEngineerRole_role_advanced;
+ isPlayable=1;
+ };
+ id=31;
+ type="B_engineer_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isEngineer";
+ expression="if !(_value == ([0, 1] select (_this getUnitTrait 'engineer')) || {_value == -1}) then {_this setVariable ['ace_isEngineer', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=2;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=30;
+ };
+ class Item12
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={6924.2217,276.28888,943.07422};
+ angles[]={6.104322,0,6.2176785};
+ };
+ name="";
+ init="";
+ id=71;
+ type="ModuleCurator_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ModuleCurator_F_Owner";
+ expression="_this setVariable ['Owner',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#adminLogged";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ModuleCurator_F_Forced";
+ expression="_this setVariable ['Forced',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ class Attribute2
+ {
+ property="ModuleCurator_F_Name";
+ expression="_this setVariable ['Name',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="";
+ };
+ };
+ };
+ class Attribute3
+ {
+ property="ModuleInfo";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ class Attribute4
+ {
+ property="ModuleCurator_F_Addons";
+ expression="_this setVariable ['Addons',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=3;
+ };
+ };
+ };
+ nAttributes=5;
+ };
+ };
+ class Item13
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7067.7832,277.27866,1072.9111};
+ angles[]={0,2.3531542,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=90;
+ type="B_medic_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=89;
+ };
+ class Item14
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7069.1665,277.06027,1074.3215};
+ angles[]={0,2.3531542,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=92;
+ type="B_medic_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=91;
+ };
+ class Item15
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7073.6299,276.65915,1068.4349};
+ angles[]={0.006394445,0.75462294,6.1558795};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=180;
+ type="B_engineer_F";
+ atlOffset=-3.0517578e-005;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=93;
+ atlOffset=-3.0517578e-005;
+ };
+ class Item16
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7074.8853,276.5065,1067.1881};
+ angles[]={0.006394445,0.75462294,6.1558795};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=181;
+ type="B_engineer_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=95;
+ };
+ class Item17
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7075.9946,276.36502,1066.1133};
+ angles[]={0.006394445,0.75462294,6.1495872};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=182;
+ type="B_soldier_AR_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=97;
+ };
+ class Item18
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7077.25,276.20419,1064.8662};
+ angles[]={0.006394445,0.75462294,6.1495872};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=183;
+ type="B_soldier_AR_F";
+ atlOffset=-3.0517578e-005;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=99;
+ atlOffset=-3.0517578e-005;
+ };
+ class Item19
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7078.4614,276.04907,1063.666};
+ angles[]={0.006394445,0.75462294,6.1495872};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=184;
+ type="B_soldier_AR_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=101;
+ };
+ class Item20
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7079.7178,275.88303,1062.4194};
+ angles[]={6.2496004,0.75462294,6.1495867};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=185;
+ type="B_soldier_AT_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=103;
+ };
+ class Item21
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.8276,275.69772,1061.3444};
+ angles[]={6.2496004,0.75462294,6.1495867};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=186;
+ type="B_soldier_AT_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.02;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=105;
+ };
+ class Item22
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7082.083,275.50171,1060.0974};
+ angles[]={6.249599,0.75462294,6.1669106};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=187;
+ type="B_soldier_AA_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.05;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=107;
+ };
+ class Item23
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7083.2275,275.32861,1058.9235};
+ angles[]={6.249599,0.75462294,6.1669106};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=226;
+ type="B_soldier_UAV_F";
+ atlOffset=3.0517578e-005;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=109;
+ atlOffset=3.0517578e-005;
+ };
+ class Item24
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7084.4829,275.14014,1057.6764};
+ angles[]={6.249599,0.75462294,6.1669106};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=227;
+ type="B_soldier_UAV_F";
+ atlOffset=3.0517578e-005;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=111;
+ atlOffset=3.0517578e-005;
+ };
+ class Item25
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7072.3545,276.83194,1066.949};
+ angles[]={0.006394445,0.75462294,6.1558795};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=228;
+ type="B_W_Soldier_CBRN_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=113;
+ };
+ class Item26
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7073.6099,276.67917,1065.7021};
+ angles[]={0.006394445,0.75462294,6.1558795};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=229;
+ type="B_W_Soldier_CBRN_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.95999998;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=115;
+ };
+ class Item27
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7074.7197,276.5441,1064.6271};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=118;
+ type="B_Sharpshooter_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=117;
+ };
+ class Item28
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7075.9751,276.38507,1063.3802};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=120;
+ type="B_Sharpshooter_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=119;
+ };
+ class Item29
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7077.1875,276.21503,1062.1803};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=122;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=121;
+ };
+ class Item30
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7078.4429,276.00446,1060.9333};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=124;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=123;
+ };
+ class Item31
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7079.5527,275.81915,1059.8583};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=126;
+ type="B_Soldier_F";
+ atlOffset=3.0517578e-005;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=125;
+ atlOffset=3.0517578e-005;
+ };
+ class Item32
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.8076,275.60858,1058.6115};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=128;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=127;
+ };
+ class Item33
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7081.9526,275.42758,1057.4374};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=130;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=129;
+ };
+ class Item34
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7083.2075,275.23737,1056.1904};
+ angles[]={0,0.75462294,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=132;
+ type="B_Soldier_F";
+ atlOffset=3.0517578e-005;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=131;
+ atlOffset=3.0517578e-005;
+ };
+ class Item35
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={6888,271.82526,896};
+ angles[]={0,1.3358924,0};
+ };
+ name="btc_hc_1";
+ isPlayable=1;
+ id=153;
+ type="HeadlessClient_F";
+ atlOffset=0.83200073;
+ };
+ class Item36
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7150.4355,270.7717,1051.0248};
+ angles[]={6.1954093,0.63775539,6.2318373};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=200;
+ type="DeconShower_02_F";
+ atlOffset=-0.009185791;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="Decon_Shower";
+ expression="if(_value)then{[_this,5.4,4,2,true] spawn bin_fnc_deconShowerAnimLarge;};";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item37
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7150.25,267.28522,1051};
+ angles[]={6.1954083,0.63775539,6.2320337};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=203;
+ type="Tarp_01_Large_Black_F";
+ };
+ class Item38
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7145.0352,268.19464,1053.5084};
+ angles[]={6.2208681,1.3358874,6.2001739};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=213;
+ type="RoadCone_L_F";
+ atlOffset=-0.001373291;
+ };
+ class Item39
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7146.917,268.26727,1056.0151};
+ angles[]={6.1954083,1.3358874,6.2256513};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=214;
+ type="RoadCone_L_F";
+ atlOffset=-0.0036621094;
+ };
+ class Item40
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7153.7813,266.70932,1046.6049};
+ angles[]={6.0904093,1.3358874,6.2320347};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=215;
+ type="RoadCone_L_F";
+ atlOffset=-0.0035705566;
+ };
+ class Item41
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7155.8037,267.14102,1049.355};
+ angles[]={6.0904093,1.3358874,6.2320347};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=216;
+ type="RoadCone_L_F";
+ atlOffset=-0.0051269531;
+ };
+ class Item42
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={6856,272,896};
+ angles[]={0,1.3358924,0};
+ };
+ name="btc_hc_2";
+ isPlayable=1;
+ id=256;
+ type="HeadlessClient_F";
+ atlOffset=-4.1008301;
+ };
+ class Item43
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={6824,281.67798,896};
+ angles[]={5.9054394,1.3358924,5.9249415};
+ };
+ name="btc_hc_3";
+ isPlayable=1;
+ id=257;
+ type="HeadlessClient_F";
+ atlOffset=-0.85928345;
+ };
+ class Item44
+ {
+ dataType="Layer";
+ name="btc_veh_respawnable";
+ class Entities
+ {
+ items=2;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={7084.875,274.98788,1038};
+ angles[]={0.05115639,0,6.0072088};
+ };
+ title=$STR_BTC_HAM_MSQM_MRK_HELO;
+ description=$STR_BTC_HAM_MSQM_MRK_HELODESC;
+ id=254;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7105.269,275.83667,1053.0665};
+ angles[]={0,0.75957966,0};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=156;
+ type="B_Heli_Transport_03_F";
+ atlOffset=-0.31341553;
+ };
+ };
+ id=258;
+ atlOffset=0.10791016;
+ };
+ class Item45
+ {
+ dataType="Layer";
+ name="btc_vehicles";
+ class Entities
+ {
+ items=20;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={7099.875,270.4924,1099.625};
+ angles[]={0.10678962,0,6.1858959};
+ };
+ title=$STR_BTC_HAM_MSQM_MRK_VEH;
+ description=$STR_BTC_HAM_MSQM_MRK_VEHDESC;
+ id=252;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7119.8477,272.70474,1035.047};
+ angles[]={6.249588,0.68451816,6.1716585};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=246;
+ type="B_T_Truck_01_fuel_F";
+ atlOffset=-0.058990479;
+ };
+ class Item2
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7135.4209,270.89554,1023.1991};
+ angles[]={6.2448053,0.64624304,6.1323361};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=249;
+ type="B_T_Truck_01_medical_F";
+ atlOffset=-0.091003418;
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7124.3345,272.08392,1030.8234};
+ angles[]={6.2655926,0.68451816,6.1716585};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=247;
+ type="B_T_Truck_01_ammo_F";
+ atlOffset=-0.050994873;
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7129.0771,272.34521,1026.9546};
+ angles[]={6.2655749,0.68451816,6.1922359};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=248;
+ type="B_T_Truck_01_flatbed_F";
+ atlOffset=-0.050994873;
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7115.6528,273.66119,1038.8058};
+ angles[]={6.2543874,0.68451816,6.1684823};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=245;
+ type="B_T_Truck_01_Repair_F";
+ atlOffset=-0.10299683;
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7142.0708,270.33746,1020.1888};
+ angles[]={6.2448053,0.60960865,6.1669116};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=250;
+ type="B_T_APC_Tracked_01_CRV_F";
+ atlOffset=-0.092987061;
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7099.8633,274.62213,1084.2837};
+ angles[]={0.15241256,2.2783701,6.1637564};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=243;
+ type="B_T_Truck_01_flatbed_F";
+ atlOffset=-0.0012512207;
+ };
+ class Item8
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7088.9854,274.68829,1092.5779};
+ angles[]={0.092537358,2.2788241,6.1198573};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=241;
+ type="B_T_Truck_01_transport_F";
+ atlOffset=0.00048828125;
+ };
+ class Item9
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7064.6611,277.72958,1100.2162};
+ angles[]={0.13360496,1.6902118,6.1606107};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=233;
+ type="B_T_MRAP_01_hmg_F";
+ atlOffset=0.10321045;
+ };
+ class Item10
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7068.6914,275.73096,1106.2517};
+ angles[]={0.14145893,2.2931533,6.1558809};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=234;
+ type="B_T_MRAP_01_hmg_F";
+ atlOffset=-0.54574585;
+ };
+ class Item11
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.8252,274.54797,1103.3436};
+ angles[]={0.15554373,2.7873082,6.1386023};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=237;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.054992676;
+ };
+ class Item12
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7080.8096,277.03772,1083.1549};
+ angles[]={0.10520844,0.710733,6.1339073};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=238;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=0.070037842;
+ };
+ class Item13
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7085.7305,276.43085,1078.4639};
+ angles[]={0.067107908,0.710733,6.1214104};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=239;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.12496948;
+ };
+ class Item14
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7098.165,275.39944,1066.9797};
+ angles[]={0.0095993113,0.710733,6.1763887};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=240;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.092956543;
+ };
+ class Item15
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7069.064,278.51117,1087.5159};
+ angles[]={0.12100255,0.77119118,6.160605};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=232;
+ type="B_T_APC_Wheeled_01_cannon_F";
+ atlOffset=-0.0048522949;
+ };
+ class Item16
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7148.3696,268.43997,1015.9185};
+ angles[]={6.2575908,0.55949318,6.1448755};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ textures="Green";
+ };
+ id=255;
+ type="C_Offroad_01_F";
+ atlOffset=-0.0020141602;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ammoBox";
+ expression="[_this,_value] call bis_fnc_initAmmoBox;";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="[[[[""FirstAidKit""],[4]],[[],[]],[[],[]],[[],[]]],false]";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="VehicleCustomization";
+ expression="if (local _this) then {([_this] + _value + [true]) call (uinamespace getvariable 'BIS_fnc_initVehicle')};";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=22;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor1";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor2";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item4
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor3";
+ };
+ };
+ class Item5
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item6
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBackpacks";
+ };
+ };
+ class Item7
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item8
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper1";
+ };
+ };
+ class Item9
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item10
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper2";
+ };
+ };
+ class Item11
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item12
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideConstruction";
+ };
+ };
+ class Item13
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item14
+ {
+ class data
+ {
+ singleType="STRING";
+ value="hidePolice";
+ };
+ };
+ class Item15
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item16
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideServices";
+ };
+ };
+ class Item17
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item18
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsStart";
+ };
+ };
+ class Item19
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item20
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsServicesStart";
+ };
+ };
+ class Item21
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item17
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7052.8164,281.54712,1058.9121};
+ angles[]={0.03358667,0.84832954,6.2033553};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=174;
+ type="B_Heli_Transport_01_camo_F";
+ atlOffset=-0.035400391;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_fastroping_equipFRIES";
+ expression="if (_value) then {[_this] call ace_fastroping_fnc_equipFRIES}";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item18
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7023.2051,283.01917,1080.9238};
+ angles[]={0.070284568,0.84832954,6.1480141};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=175;
+ type="B_Heli_Attack_01_dynamicLoadout_F";
+ atlOffset=-0.012207031;
+ };
+ class Item19
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={7110.1313,273.8912,1076.689};
+ angles[]={0.028797932,2.2788241,6.2240534};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=244;
+ type="B_T_Truck_01_transport_F";
+ };
+ };
+ id=259;
+ atlOffset=-0.61547852;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/mission__Tanoa.sqm b/hearts_and_minds.kunduz_valley/mission__Tanoa.sqm
new file mode 100644
index 0000000..9d1a6ce
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/mission__Tanoa.sqm
@@ -0,0 +1,2602 @@
+version=54;
+class EditorData
+{
+ moveGridStep=0.5;
+ angleGridStep=0.2617994;
+ scaleGridStep=0.1;
+ autoGroupingDist=10;
+ toggles=581;
+ class ItemIDProvider
+ {
+ nextID=258;
+ };
+ class MarkerIDProvider
+ {
+ nextID=3;
+ };
+ class LayerIndexProvider
+ {
+ nextID=2;
+ };
+ class Camera
+ {
+ pos[]={4276.6519,86.843605,3845.5249};
+ dir[]={-0.038926367,-0.67886484,0.73331231};
+ up[]={-0.035985876,0.7342419,0.67794168};
+ aside[]={0.99865949,-5.3909753e-007,0.053010438};
+ };
+};
+binarizationWanted=0;
+addons[]=
+{
+ "A3_Ui_F",
+ "A3_Structures_F_Ind_Cargo",
+ "ace_cargo",
+ "A3_Structures_F_Mil_Helipads",
+ "A3_Structures_F_Mil_Flags",
+ "A3_Characters_F",
+ "ace_explosives",
+ "A3_Modules_F_Curator_Curator",
+ "A3_Characters_F_Enoch",
+ "A3_Characters_F_Mark",
+ "A3_Props_F_Enoch_Military_Decontamination",
+ "A3_Signs_F",
+ "A3_Air_F_Heli_Heli_Transport_03",
+ "ace_realisticnames",
+ "A3_Soft_F_Exp_Truck_01",
+ "A3_Soft_F_Enoch_Truck_01",
+ "A3_Armor_F_Exp_APC_Tracked_01",
+ "A3_Soft_F_Offroad_01",
+ "A3_Soft_F_Exp_MRAP_01",
+ "A3_Soft_F_Exp_LSV_01",
+ "A3_Armor_F_Exp_APC_Wheeled_01",
+ "A3_Air_F_Beta_Heli_Attack_01",
+ "A3_Air_F_Beta_Heli_Transport_01"
+};
+class AddonsMetaData
+{
+ class List
+ {
+ items=17;
+ class Item0
+ {
+ className="A3_Ui_F";
+ name="Arma 3 - User Interface";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item1
+ {
+ className="A3_Structures_F_Ind";
+ name="Arma 3 - Industrial Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item2
+ {
+ className="ace_cargo";
+ name="ACE3 - Cargo";
+ author="ACE-Team";
+ url="http://ace3mod.com/";
+ };
+ class Item3
+ {
+ className="A3_Structures_F_Mil";
+ name="Arma 3 - Military Buildings and Structures";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item4
+ {
+ className="A3_Characters_F";
+ name="Arma 3 Alpha - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item5
+ {
+ className="ace_explosives";
+ name="ACE3 - Explosives";
+ author="ACE-Team";
+ url="http://ace3mod.com/";
+ };
+ class Item6
+ {
+ className="A3_Modules_F_Curator";
+ name="Arma 3 Zeus Update - Scripted Modules";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item7
+ {
+ className="A3_Characters_F_Enoch";
+ name="Arma 3 Contact Platform - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item8
+ {
+ className="A3_Characters_F_Mark";
+ name="Arma 3 Marksmen - Characters and Clothing";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item9
+ {
+ className="A3_Props_F_Enoch";
+ name="Arma 3 Contact Platform - Decorative and Mission Objects";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item10
+ {
+ className="A3_Signs_F";
+ name="Arma 3 - Signs";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item11
+ {
+ className="A3_Air_F_Heli";
+ name="Arma 3 Helicopters - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item12
+ {
+ className="A3_Soft_F_Exp";
+ name="Arma 3 Apex - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item13
+ {
+ className="A3_Soft_F_Enoch";
+ name="Arma 3 Contact Platform - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item14
+ {
+ className="A3_Armor_F_Exp";
+ name="Arma 3 Apex - Armored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item15
+ {
+ className="A3_Soft_F";
+ name="Arma 3 Alpha - Unarmored Land Vehicles";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ class Item16
+ {
+ className="A3_Air_F_Beta";
+ name="Arma 3 Beta - Aircraft";
+ author="Bohemia Interactive";
+ url="https://www.arma3.com";
+ };
+ };
+};
+randomSeed=2442963;
+class ScenarioData
+{
+ disabledAI=1;
+ class Header
+ {
+ gameType="Coop";
+ minPlayers=1;
+ maxPlayers=30;
+ };
+};
+class CustomAttributes
+{
+ class Category0
+ {
+ name="Multiplayer";
+ class Attribute0
+ {
+ property="RespawnTemplates";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="RespawnButton";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ class Category1
+ {
+ name="Scenario";
+ class Attribute0
+ {
+ property="cba_settings_hash";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#CBA_HASH#";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_respawn_savepredeathgear";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_medical_enablefor";
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_cargo_enable";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="STRING";
+ value="ace_repair_addspareparts";
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=4;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ nil=1;
+ singleType="ANY";
+ };
+ };
+ };
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="EnableDebugConsole";
+ expression="true";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+};
+class Mission
+{
+ class Intel
+ {
+ briefingName="=BTC= co 30 HEARTS AND MINDS";
+ overviewText="by Giallustio";
+ resistanceWest=0;
+ resistanceEast=1;
+ startWeather=0.29999998;
+ startWind=0.099999994;
+ startWaves=0.099999994;
+ forecastWeather=0.29999998;
+ forecastWind=0.099999994;
+ forecastWaves=0.099999994;
+ forecastLightnings=0.099999994;
+ rainForced=1;
+ lightningsForced=1;
+ wavesForced=1;
+ windForced=1;
+ year=2035;
+ month=6;
+ day=24;
+ hour=12;
+ minute=0;
+ startFogDecay=0.013;
+ forecastFogDecay=0.013;
+ };
+ class Entities
+ {
+ items=46;
+ class Item0
+ {
+ dataType="Marker";
+ position[]={4211.2661,19.452999,4025.085};
+ name="respawn_west";
+ text=$STR_BTC_HAM_INTRO_ARSENAL_REDEPLOY;
+ type="Empty";
+ id=0;
+ atlOffset=-0.00034332275;
+ };
+ class Item1
+ {
+ dataType="Marker";
+ position[]={4219.5239,19.041,4009.7571};
+ name="btc_base";
+ type="flag_NATO";
+ id=1;
+ atlOffset=0.00015640259;
+ };
+ class Item2
+ {
+ dataType="Marker";
+ position[]={4223,18.247999,3979.25};
+ name="btc_log_point";
+ text=$STR_BTC_HAM_MSQM_MRK_LOGPOINT;
+ type="mil_flag";
+ colorName="ColorGreen";
+ a=0.5;
+ b=0.5;
+ id=2;
+ atlOffset=-3.4332275e-005;
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4222.4121,19.440477,3987.0181};
+ angles[]={6.2325621,2.080183,0.0053265258};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_create_object";
+ disableSimulation=1;
+ };
+ id=13;
+ type="Land_CargoBox_V1_F";
+ atlOffset=-0.0012397766;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4223,18.248034,3979.25};
+ angles[]={6.2113104,3.5802941,0.023993526};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ name="btc_create_object_point";
+ };
+ id=14;
+ type="Land_HelipadSquare_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isRepairFacility";
+ expression="if (_value != (if (isNumber (configOf _this >> ""ace_repair_canRepair"")) then {getNumber (configOf _this >> ""ace_repair_canRepair"")} else {0})) then {_this setVariable ['ace_isRepairFacility', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4210.9512,20.136942,4019.05};
+ angles[]={6.2698536,1.1926365,6.2618566};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="call{if (isServer) then { " \n " [this, 0] call ace_cargo_fnc_setSpace; " \n "};}";
+ name="btc_gear_object";
+ disableSimulation=1;
+ };
+ id=15;
+ type="Land_CargoBox_V1_F";
+ atlOffset=-0.019309998;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="allowDamage";
+ expression="_this allowdamage _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ace_cargo_size";
+ expression="[_this, _value] call ace_cargo_fnc_setSize;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=-1;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4338.7837,23.259531,3954.2544};
+ angles[]={0,4.9561291,0.023993526};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=17;
+ type="Land_HelipadSquare_F";
+ atlOffset=0.0087184906;
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4216.0317,23.122213,4009.9016};
+ angles[]={6.2671871,1.7987723,6.2511969};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=21;
+ type="Flag_NATO_F";
+ };
+ class Item8
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4303.2642,22.297966,3960.4495};
+ angles[]={6.272521,4.9561291,0.031988446};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=23;
+ type="Land_HelipadSquare_F";
+ atlOffset=0.0087184906;
+ };
+ class Item9
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4209.75,19.430765,4017.55};
+ angles[]={6.272521,4.3508034,6.259192};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""side_mission"",true]";
+ description=$STR_B_OFFICER_F0;
+ isPlayer=1;
+ isPlayable=1;
+ };
+ id=25;
+ type="B_officer_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=24;
+ };
+ class Item10
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4210.729,19.455681,4023.0322};
+ angles[]={6.2778587,4.3235211,6.2671871};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ init="this setVariable [""interpreter"",true]";
+ description=$STR_BTC_HAM_MSQM_INTERPRETER;
+ isPlayable=1;
+ };
+ id=29;
+ type="B_Soldier_F";
+ atlOffset=1.9073486e-006;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=28;
+ atlOffset=1.9073486e-006;
+ };
+ class Item11
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4211.1631,19.441271,4021.6331};
+ angles[]={6.2778587,4.1339355,6.2671871};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ skill=0.60000002;
+ description=$STR_ACE_Repair_AssignEngineerRole_role_advanced;
+ isPlayable=1;
+ };
+ id=31;
+ type="B_engineer_F";
+ atlOffset=1.9073486e-006;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_isEngineer";
+ expression="if !(_value == ([0, 1] select (_this getUnitTrait 'engineer')) || {_value == -1}) then {_this setVariable ['ace_isEngineer', _value, true]}";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=2;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=30;
+ atlOffset=1.9073486e-006;
+ };
+ class Item12
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={4159.5,14.44014,4017.5};
+ angles[]={0.023993526,0,0.47951955};
+ };
+ name="";
+ init="";
+ id=71;
+ type="ModuleCurator_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ModuleCurator_F_Owner";
+ expression="_this setVariable ['Owner',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="#adminLogged";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="ModuleCurator_F_Forced";
+ expression="_this setVariable ['Forced',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ class Attribute2
+ {
+ property="ModuleCurator_F_Name";
+ expression="_this setVariable ['Name',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="";
+ };
+ };
+ };
+ class Attribute3
+ {
+ property="ModuleInfo";
+ expression="false";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=1;
+ };
+ };
+ };
+ class Attribute4
+ {
+ property="ModuleCurator_F_Addons";
+ expression="_this setVariable ['Addons',_value,true];";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=3;
+ };
+ };
+ };
+ nAttributes=5;
+ };
+ };
+ class Item13
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4199.6377,19.668583,4026.562};
+ angles[]={0,2.8160391,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=90;
+ type="B_medic_F";
+ atlOffset=-1.9073486e-006;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=89;
+ atlOffset=-1.9073486e-006;
+ };
+ class Item14
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4201.5054,19.670515,4027.2063};
+ angles[]={0,2.8160391,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=92;
+ type="B_medic_F";
+ atlOffset=1.9073486e-006;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=91;
+ atlOffset=1.9073486e-006;
+ };
+ class Item15
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4202.8706,19.567921,4019.9463};
+ angles[]={6.2778587,1.2175078,6.2751846};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=180;
+ type="B_engineer_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=93;
+ };
+ class Item16
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4203.437,19.554443,4018.2698};
+ angles[]={6.2778587,1.2175078,6.2751846};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=181;
+ type="B_engineer_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=95;
+ };
+ class Item17
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4203.9497,19.540438,4016.8127};
+ angles[]={6.2778478,1.2175078,6.2645216};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=182;
+ type="B_soldier_AR_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=97;
+ };
+ class Item18
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4204.5161,19.518961,4015.1365};
+ angles[]={0,1.2175078,6.253861};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=183;
+ type="B_soldier_AR_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.01;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=99;
+ };
+ class Item19
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4205.064,19.502888,4013.5215};
+ angles[]={0,1.2175078,6.253861};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=184;
+ type="B_soldier_AR_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.99000001;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=101;
+ };
+ class Item20
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4205.6313,19.484369,4011.8452};
+ angles[]={6.2805333,1.2175078,6.253861};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=185;
+ type="B_soldier_AT_F";
+ atlOffset=-1.9073486e-006;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=103;
+ atlOffset=-1.9073486e-006;
+ };
+ class Item21
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4206.1445,19.465431,4010.3875};
+ angles[]={6.2805333,1.2175078,6.253861};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=186;
+ type="B_soldier_AT_F";
+ atlOffset=-1.9073486e-006;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.02;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=105;
+ atlOffset=-1.9073486e-006;
+ };
+ class Item22
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4206.7109,19.449001,4008.7114};
+ angles[]={6.2618566,1.2175078,6.2458687};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=187;
+ type="B_soldier_AA_F";
+ atlOffset=1.9073486e-006;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.05;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=107;
+ atlOffset=1.9073486e-006;
+ };
+ class Item23
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4207.2109,19.397018,4007.1497};
+ angles[]={6.2618566,1.2175078,6.2458687};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=226;
+ type="B_soldier_UAV_F";
+ atlOffset=1.9073486e-006;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1.03;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=109;
+ atlOffset=1.9073486e-006;
+ };
+ class Item24
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4207.7773,19.342335,4005.4734};
+ angles[]={6.2618566,1.2175078,6.253859};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=227;
+ type="B_soldier_UAV_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=111;
+ };
+ class Item25
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4201.0654,19.578306,4019.186};
+ angles[]={6.2778587,1.2175078,6.2751846};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=228;
+ type="B_W_Soldier_CBRN_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=113;
+ };
+ class Item26
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4201.6323,19.55757,4017.5098};
+ angles[]={6.2698579,1.2175078,0};
+ };
+ side="West";
+ flags=6;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=229;
+ type="B_W_Soldier_CBRN_F";
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="pitch";
+ expression="_this setpitch _value;";
+ class Value
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0.95999998;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ class Attributes
+ {
+ };
+ id=115;
+ };
+ class Item27
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4202.145,19.541439,4016.0522};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=118;
+ type="B_Sharpshooter_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=117;
+ };
+ class Item28
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4202.7119,19.541439,4014.3762};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=120;
+ type="B_Sharpshooter_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=119;
+ };
+ class Item29
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4203.2607,19.538475,4012.761};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=122;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=121;
+ };
+ class Item30
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4203.8271,19.546366,4011.0847};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=124;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=123;
+ };
+ class Item31
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4204.3403,19.534981,4009.6272};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=126;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=125;
+ };
+ class Item32
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4204.9063,19.500166,4007.9512};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=128;
+ type="B_Soldier_F";
+ atlOffset=1.9073486e-006;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=127;
+ atlOffset=1.9073486e-006;
+ };
+ class Item33
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4205.4067,19.428076,4006.3896};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=130;
+ type="B_Soldier_F";
+ };
+ };
+ class Attributes
+ {
+ };
+ id=129;
+ };
+ class Item34
+ {
+ dataType="Group";
+ side="West";
+ class Entities
+ {
+ items=1;
+ class Item0
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4205.9727,19.353239,4004.7134};
+ angles[]={0,1.2175078,0};
+ };
+ side="West";
+ flags=7;
+ class Attributes
+ {
+ isPlayable=1;
+ };
+ id=132;
+ type="B_Soldier_F";
+ atlOffset=-1.9073486e-006;
+ };
+ };
+ class Attributes
+ {
+ };
+ id=131;
+ atlOffset=-1.9073486e-006;
+ };
+ class Item35
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={4344,27.657982,4136};
+ angles[]={0.22036223,1.7987711,6.2378831};
+ };
+ name="btc_hc_1";
+ isPlayable=1;
+ id=153;
+ type="HeadlessClient_F";
+ };
+ class Item36
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4261.6221,23.831339,3877.7671};
+ angles[]={6.2591896,4.7112999,0.024003461};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=200;
+ type="DeconShower_02_F";
+ atlOffset=-0.011005402;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="Decon_Shower_DisableUserActions";
+ expression="if(_value)then{_this setVariable ['bin_deconshower_disableAction',true]};";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="Decon_Shower";
+ expression="if(_value)then{[_this,5.4,4,2,true] spawn bin_fnc_deconShowerAnimLarge;};";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item37
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4261.5,20.346003,3877.5};
+ angles[]={6.2591896,4.7112999,0.02399601};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=203;
+ type="Tarp_01_Large_Black_F";
+ };
+ class Item38
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4263.5,20.663441,3872.25};
+ angles[]={6.2805109,5.4094319,0.018663859};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=213;
+ type="RoadCone_L_F";
+ atlOffset=-6.1035156e-005;
+ };
+ class Item39
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4260,20.590109,3872.25};
+ angles[]={6.2751846,5.4094319,0.02399601};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=214;
+ type="RoadCone_L_F";
+ atlOffset=-0.00011634827;
+ };
+ class Item40
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4263.25,20.986116,3883};
+ angles[]={6.2671871,5.4094319,0.087773547};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=215;
+ type="RoadCone_L_F";
+ atlOffset=-0.0013942719;
+ };
+ class Item41
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4260.25,20.758129,3883.25};
+ angles[]={0.0053377044,5.4094319,0.06656827};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=216;
+ type="RoadCone_L_F";
+ atlOffset=-0.00078582764;
+ };
+ class Item42
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={4320,24.015329,4136};
+ angles[]={0.061256282,1.7987711,0.09570726};
+ };
+ name="btc_hc_2";
+ isPlayable=1;
+ id=256;
+ type="HeadlessClient_F";
+ };
+ class Item43
+ {
+ dataType="Logic";
+ class PositionInfo
+ {
+ position[]={4296,22.001394,4136};
+ angles[]={0.013332055,1.7987711,0.16644555};
+ };
+ name="btc_hc_3";
+ isPlayable=1;
+ id=257;
+ type="HeadlessClient_F";
+ };
+ class Item44
+ {
+ dataType="Layer";
+ name="btc_veh_respawnable";
+ class Entities
+ {
+ items=2;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={4354.5,22.813993,3985.5};
+ angles[]={0.050623242,0,0.0080009829};
+ };
+ title=$STR_BTC_HAM_MSQM_MRK_HELO;
+ description=$STR_BTC_HAM_MSQM_MRK_HELODESC;
+ id=254;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4324.4912,25.521086,3989.5818};
+ angles[]={6.2618566,5.0764017,0.013332055};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=156;
+ type="B_Heli_Transport_03_F";
+ atlOffset=-0.002538681;
+ };
+ };
+ id=256;
+ atlOffset=0.063152313;
+ };
+ class Item45
+ {
+ dataType="Layer";
+ name="btc_vehicles";
+ class Entities
+ {
+ items=20;
+ class Item0
+ {
+ dataType="Comment";
+ class PositionInfo
+ {
+ position[]={4227,19.340015,3931};
+ angles[]={0.0080009829,0,0.063913256};
+ };
+ title=$STR_BTC_HAM_MSQM_MRK_VEH;
+ description=$STR_BTC_HAM_MSQM_MRK_VEHDESC;
+ id=252;
+ };
+ class Item1
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4248.1382,22.161657,3930.3477};
+ angles[]={0.095706634,1.7390807,0.095706634};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=246;
+ type="B_T_Truck_01_fuel_F";
+ atlOffset=-0.039800644;
+ };
+ class Item2
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4245.4639,22.709036,3910.6943};
+ angles[]={0,1.7008055,0.034652505};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=249;
+ type="B_T_Truck_01_medical_F";
+ atlOffset=-0.013309479;
+ };
+ class Item3
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4246.8911,22.124918,3924.3018};
+ angles[]={0.039977662,1.7390807,0.12730782};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=247;
+ type="B_T_Truck_01_ammo_F";
+ atlOffset=-0.077253342;
+ };
+ class Item4
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4246.1084,22.954084,3918.2583};
+ angles[]={0.058599081,1.7390807,0.090419561};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=248;
+ type="B_T_Truck_01_flatbed_F";
+ atlOffset=-0.10356903;
+ };
+ class Item5
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4249.3608,22.590536,3935.8831};
+ angles[]={0.0053265258,1.7390807,0.029324362};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=245;
+ type="B_T_Truck_01_Repair_F";
+ atlOffset=-0.01051712;
+ };
+ class Item6
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4245.9893,23.198921,3903.3372};
+ angles[]={6.2805333,1.6641712,0.0026520467};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=250;
+ type="B_T_APC_Tracked_01_CRV_F";
+ atlOffset=-0.021877289;
+ };
+ class Item7
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4244.9482,21.994968,3888.4963};
+ angles[]={6.259192,1.6371639,0.010664274};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ textures="Green";
+ };
+ id=255;
+ type="C_Offroad_01_F";
+ atlOffset=0.017175674;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ammoBox";
+ expression="[_this,_value] call bis_fnc_initAmmoBox;";
+ class Value
+ {
+ class data
+ {
+ singleType="STRING";
+ value="[[[[""FirstAidKit""],[4]],[[],[]],[[],[]],[[],[]]],false]";
+ };
+ };
+ };
+ class Attribute1
+ {
+ property="VehicleCustomization";
+ expression="if (local _this) then {([_this] + _value + [true]) call (uinamespace getvariable 'BIS_fnc_initVehicle')};";
+ class Value
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=2;
+ class Item0
+ {
+ class data
+ {
+ singleType="ARRAY";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="ARRAY";
+ class value
+ {
+ items=22;
+ class Item0
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor1";
+ };
+ };
+ class Item1
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item2
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor2";
+ };
+ };
+ class Item3
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item4
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideDoor3";
+ };
+ };
+ class Item5
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item6
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBackpacks";
+ };
+ };
+ class Item7
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item8
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper1";
+ };
+ };
+ class Item9
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item10
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideBumper2";
+ };
+ };
+ class Item11
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item12
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideConstruction";
+ };
+ };
+ class Item13
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item14
+ {
+ class data
+ {
+ singleType="STRING";
+ value="hidePolice";
+ };
+ };
+ class Item15
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item16
+ {
+ class data
+ {
+ singleType="STRING";
+ value="HideServices";
+ };
+ };
+ class Item17
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=1;
+ };
+ };
+ class Item18
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsStart";
+ };
+ };
+ class Item19
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ class Item20
+ {
+ class data
+ {
+ singleType="STRING";
+ value="BeaconsServicesStart";
+ };
+ };
+ class Item21
+ {
+ class data
+ {
+ singleType="SCALAR";
+ value=0;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ nAttributes=2;
+ };
+ };
+ class Item8
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4250.3638,22.626858,3965.2366};
+ angles[]={0.087773547,0.7540167,0.050624419};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ };
+ id=243;
+ type="B_T_Truck_01_flatbed_F";
+ };
+ class Item9
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4265.3164,22.575714,3970.8711};
+ angles[]={6.2725158,3.2976959,0.063913256};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=241;
+ type="B_T_Truck_01_transport_F";
+ atlOffset=-0.049983978;
+ };
+ class Item10
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4245.1362,21.351154,3968.5237};
+ angles[]={0.029324362,0.6698088,0.12468291};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=244;
+ type="B_T_Truck_01_transport_F";
+ atlOffset=-0.039049149;
+ };
+ class Item11
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4259.5957,22.704597,3987.4392};
+ angles[]={0,3.8548572,0.082478598};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=233;
+ type="B_T_MRAP_01_hmg_F";
+ atlOffset=-0.01962471;
+ };
+ class Item12
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4255.0957,22.370762,3990.4468};
+ angles[]={6.2671871,3.7254124,0.058600098};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=234;
+ type="B_T_MRAP_01_hmg_F";
+ atlOffset=-0.012031555;
+ };
+ class Item13
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4249.1157,21.364624,3994.2046};
+ angles[]={0.0026520467,3.6889343,0.093063653};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=237;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.023923874;
+ };
+ class Item14
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4235.5518,21.07881,4001.5029};
+ angles[]={0.0026520467,3.5902662,0.010664274};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=238;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.016025543;
+ };
+ class Item15
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4240.5957,21.096165,3998.999};
+ angles[]={6.2698536,3.6248398,0.021328852};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=239;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.056703568;
+ };
+ class Item16
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4245.0928,21.241991,3996.6523};
+ angles[]={6.2698536,3.6488891,0.037314966};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=240;
+ type="B_T_LSV_01_armed_F";
+ atlOffset=-0.0080337524;
+ };
+ class Item17
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4264.5,22.915401,3982.5};
+ angles[]={6.2751846,3.9608302,0.087773547};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=232;
+ type="B_T_APC_Wheeled_01_cannon_F";
+ atlOffset=-0.0098495483;
+ };
+ class Item18
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4339.3516,25.185259,3954.3325};
+ angles[]={0,3.5745981,0.023993526};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=175;
+ type="B_Heli_Attack_01_dynamicLoadout_F";
+ atlOffset=-0.0016689301;
+ };
+ class Item19
+ {
+ dataType="Object";
+ class PositionInfo
+ {
+ position[]={4303.5229,24.441528,3962.5347};
+ angles[]={0.0053265258,3.5745981,0.015998369};
+ };
+ side="Empty";
+ flags=4;
+ class Attributes
+ {
+ skill=0.60000002;
+ };
+ id=174;
+ type="B_Heli_Transport_01_camo_F";
+ atlOffset=-0.00088119507;
+ class CustomAttributes
+ {
+ class Attribute0
+ {
+ property="ace_fastroping_equipFRIES";
+ expression="if (_value) then {[_this] call ace_fastroping_fnc_equipFRIES}";
+ class Value
+ {
+ class data
+ {
+ singleType="BOOL";
+ value=0;
+ };
+ };
+ };
+ nAttributes=1;
+ };
+ };
+ };
+ id=257;
+ atlOffset=-0.35071373;
+ };
+ };
+};
diff --git a/hearts_and_minds.kunduz_valley/stringtable.xml b/hearts_and_minds.kunduz_valley/stringtable.xml
new file mode 100644
index 0000000..28c1fed
--- /dev/null
+++ b/hearts_and_minds.kunduz_valley/stringtable.xml
@@ -0,0 +1,3216 @@
+
+
+
+
+
+ Hearts and Minds
+ Hearts and Minds
+ Hearts and Minds
+ Corações e Mentes
+ 心灵与智慧
+ Hearts and Minds
+ Hearts and Minds
+
+
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+ github.com/Vdauphin/HeartsAndMinds
+
+
+
+
+
+
+ Interpreter
+ Interprete
+ Dolmetscher
+ Intérprete
+ 翻译员
+ Interprète
+ Tlumočník
+
+
+ Logistic Point
+ Punto de Logística
+ Logistikpunkt
+ Ponto Logístico
+ 后勤点
+ Point logistique
+ Logistický bod
+
+
+ Add vehicles to this layer
+ 将载具添加到此图层
+ Přidejte vozidla do této vrstvy
+ Ajouter un véhicule au calque
+
+
+ Add all vehicles that should NOT automatically respawn to "btc_vehicles" layer. If a vehicle SHOULD automatically respawn, add it to the layer named "btc_veh_respawnable".
+ 将所有不可以自动重生的载具添加到"btc_vehicles"图层。如果一辆载具可以自动重生, 将其添加到"btc_veh_respawnable"图层。
+ Přidejte všechna vozidla, která by se NEMĚLA automaticky respawnovat, do vrstvy "btc_vehicles". Pokud by se vozidlo MĚLO automaticky respawnovat, přidejte ho do vrstvy s názvem "btc_veh_respawnable".
+ Ajouter tous les véhicules qui ne devraient PAS réapparaître automatiquement avec "btc_vehicles". Si un véhicule DOIT réapparaître automatiquement, ajouter-le au calque nommé "btc_veh_respawnable"
+
+
+ Add respawnable vehicles to this layer
+ 将可重生载具添加到此图层
+ Přidejte do této vrstvy respawnovatelná vozidla
+ Ajouter les véhicules qui réapparaitrons à ce calque
+
+
+ Add all vehicles that should automatically respawn to "btc_veh_respawnable" layer. If a vehicle should NOT automatically respawn, add it to the layer named "btc_vehicles".
+ 将所有可以自动重生的载具添加到"btc_veh_respawnable"图层。如果一辆载具不可以自动重生, 将其添加到"btc_vehicles"图层。
+ Přidejte všechna vozidla, která by se měla automaticky respawnovat, do vrstvy "btc_veh_respawnable". Pokud by se vozidlo NEMĚLO automaticky znovu objevit, přidejte ho do vrstvy s názvem "btc_vehicles"
+ Ajouter tous les véhicules qui devraient réapparaître automatiquement au calque "btc_veh_respawnable". Si un véhicule ne doit PAS réapparaître automatiquement, ajoutez-le au calque nommé "btc_vehicles".
+
+
+
+
+
+
+ Arsenal/Re-deploy
+ Arsenal/Re-deploy
+ Arsenal/Verlegen
+ Arsenal/Ressurgir
+ 军火库/重新部署
+ Arsenal/Re-déploiement
+ Arsenal/Opětovné nasazení
+
+
+ Rearm/Repair and Objects
+ Rearmado/Reparaciones y Objetos
+ Aufmunitionieren und Reparieren von Fahrzeugen
+ Municiamento e Reparação de Veículos
+ 弹药补给/车辆修理
+ Réarmement/Réparation et objets
+ Přezbrojení/oprava a Objekty
+
+
+ Only Respawnable
+ Solo Respawneable
+ Respawnt bei Zertörung
+ Único Respawnável
+ 可重生载具
+ Seul à réapparaître
+ Pouze Obnovitelné
+
+
+ Day %1. Base overview.
+ Day %1. Vista de la Base.
+ Day %1. Basisübersicht.
+ Day %1. Visão geral da base.
+ 第 %1 天. 基地总览.
+ Jour %1. Aperçu de la base.
+ Day %1. Základní přehled.
+
+
+
+
+
+
+ Headless and Database
+ Headless y Base de Datos
+ Headless Client und Datanbank
+ Cliente Headless e Banco de Dados
+ 无头客户端与数据库
+ Headless et base de données
+ Headless and Database
+
+
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> This mission support ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> This mission has a database system. Enemy units, towns, hideouts, cache, objects created or static weapons assembled by players or Zeus, vehicles, vehicle in vehicle, tag, slots position, players markers on global channel are saved. All admin can save mission progress at any time with his self interaction key.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> This mission support ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> Esta misión tiene un sistema de base de datos. Se guardan unidades enemigas, ciudades, escondites, caché, objetos creados por jugadores o Zeus, vehículos, marcadores de jugadores (no líneas) en el canal global. Todos los administradores pueden guardar el progreso de la misión en cualquier momento con su clave de auto interacción.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> This mission support ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> Diese Mission verfügt über ein eingenes Datenbanksystem, in welcher folgende Dinge gespeichert werden: feindliche Einheiten, Städte, Verstecke, feindliche Waffenlager, Fahrzeuge, vom Spieler oder vom Zeus erstelle Objecte und Marker (keine Linien) vom Spieler im Globalen-Channel. Jeder Admin kann zu jeder Zeit den Missionsfortschritt über das Eigen-Interaktionsmenü speichern.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> This mission support ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> Esta missão tem um sistema de banco de dados. Unidades inimigas, cidades, esconderijos, cache, objetos criados por jogadores ou Zeus, veículos, marcação de jogadores (sem linhas) no canal global são salvos. O administrador pode salvar o progresso da missão a qualquer momento usando botão de interação.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> 本任务支持ACE无头客户端。<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> 本任务内置数据库系统。敌方单位, 城镇, 藏匿点, 武器箱, 由玩家或宙斯创建的物体或组装的固定式武器, 载具, 被托运的载具, 涂鸦, 以及玩家在公共频道放置的地图标记将被存储。管理员可以随时通过自我互动菜单来保存任务进度。<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> Cette mission supporte le ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> La mission utilise une base de données. Unités ennemies, villes, planque, cache d'arme , objets créés ou armes statiques assemblées par des joueurs ou Zeus, véhicules, véhicule dans véhicule, tag, les marqueurs de joueurs sur le canal global sont enregistrés. Tous les administrateurs peuvent enregistrer la progression de la mission à tout moment avec sa touche d'auto-interaction.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+ <img image='\a3\ui_f\data\map\vehicleicons\iconvirtual_ca.paa' width='20' height='20'/> Tato mise podporuje ACE Headless.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_cp_transfer.jpg' width='355' height='200' /> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\download_ca.paa' width='20' height='20'/> Tato mise má databázový systém. Ukládají se nepřátelské jednotky, města, úkryty, skrýše, předměty vytvořené nebo statické zbraně sestavené hráči nebo Zeusem, vozidla, vozidlo ve vozidle, štítek, značky hráčů na globálním kanálu. Všichni administrátoři mohou kdykoli uložit postup mise pomocí vlastní interakce.<br/><br/> <img image='\a3\data_f_mark\Images\mark_popupImage_01_ca.paa' width='355' height='200' />
+
+
+
+
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Respawn:</marker><br/> When a vehicle is destroyed it will not respawn in base, you need to tow, use vehicle in vehicle or lift it back to base and repair it near the logistic point (Interact with the red box). Helicopter wrecks can only be lifted. <br/> The Chinook is the only exception, it will respawn after 30 seconds.<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Rearm:</marker><br/> You can also rearm them by using a rearm vehicle or spawning a rearm container.<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Respawn:</marker><br/> Cuando un vehículo es destruido no va a reaparecer en la base, es necesario remolcarlo o transportarlo de vuelta a la base y repararlo cerca del punto logístico (Interactuar con la caja roja). Los destrozos de helicópteros sólo pueden ser transportados por vía aérea.. <br/> El Chinook es la única excepción, reaparecerá después de 30 segundos..<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Rearm:</marker><br/> You can also rearm them by using a rearm vehicle or spawning a rearm container..<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Respawn:</marker><br/> Wenn ein Fahrzeug zersört wurde, wird dies nicht Respawnen. Es muss durch Abschleppen oder Anheben(Sling-Load) zum Logisik-Punkt gebracht und dort repariert werden (mit der roten Box interagieren). Wracks von Hubschraubern können nur angehoben werden (Sling-Load). <br/> Die einzigste Ausnahme hierbei ist der Chinook. Er respawnt nach 30 Sekunden.<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Aufmunitionieren:</marker><br/> Fahrzeuge können Aufmunitioniert werden, in dem man das entsprechende Kaliber am Logisik-Punk anfordert (mit der Roten Box interagieren: Fahzeug und Kaliber auswählen). Nun muss man nur noch die erstellte Munition zum Fahrzeug bringen und mit diesem interagieren um das aufmunitionieren zu beginnen.<br/>ANMERKUNG: You can also rearm them by using a rearm vehicle or spawning a rearm container.<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Respawn:</marker><br/> Quando um veículo é destruído ele não reaparecerá na base, você precisa rebocá-lo/levá-lo de volta à base e repará-lo perto do ponto logístico (Interagir com a caixa vermelha). Os destroços de helicóptero só podem ser levantados. <br/> O Chinook é a única exceção, ele reaparecerá depois de 30 segundos.<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Rearm:</marker><br/> You can also rearm them by using a rearm vehicle or spawning a rearm container..<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> 载具重生:</marker><br/> 当载具损毁时, 它不会在基地自动重生。你需要采用牵引、托运或吊挂的方式将其残骸运回基地, 并在后勤点对其进行维修(与后勤点的红色箱子进行互动)。直升机的残骸只能使用吊挂的方式运输。<br/> 支奴干(Chinook)是唯一的例外, 它会在损毁后30秒于基地重生。<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> 弹药补给:</marker><br/> 你也可以使用弹药补给载具或生成一个弹药补给箱来为载具补给弹药。<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Réapparition:</marker><br/> Lorsqu'un véhicule est détruit, il ne réapparaîtra pas dans la base, vous devez le remorquer, utiliser le véhicule dans le véhicule ou le ramener à la base et le réparer près du point logistique (Interagissez avec la boîte rouge). Les épaves d'hélicoptères peuvent seulement être héliportées. <br/> Le Chinook est la seule exception, il réapparaîtra après 30 secondes.<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Réarmement:</marker><br/> Vous pouvez aussi les réarmer via un véhicule de réarmement ou en faisant appaitre une caisse de réarmement.<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+ <marker name='blufor_base'><img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\destroy_ca.paa' width='20' height='20'/> Respawn:</marker><br/> Když je vozidlo zničeno, neobnoví se na základně, musíte jej odtáhnout, použít vozidlo ve vozidle nebo jej zvednout zpět na základnu a opravit v blízkosti logistického bodu (interakce s červeným rámečkem). Vraky vrtulníků lze pouze zvedat. <br/> Chinook je jedinou výjimkou, znovu se objeví po 30 sekundách.<br/><br/> <img image='\a3\data_f_tank\Images\Tank_contentBrowserPicture_1_co.paa' width='355' height='200' /> <br/><br/> <marker name='blufor_base'> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Rearm:</marker><br/> Můžete je také přezbrojit pomocí přezbrojeného vozidla nebo vytvořením muničního kontejneru.<br/><br/> <img image='\a3\data_f_jets\Images\dlcbrowser_jets_loadouts_ca.paa' width='355' height='200' />
+
+
+
+
+ Side Mission
+ Misiones Alternativas
+ Nebenaufgaben
+ Missão Secundária
+ 支线任务
+ Missions secondaires
+ Vedlejší mise
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Side missions are really useful to raise your reputation level.<br/> A side mission can be requested by the officer with his self interaction menu.<br/> If you don't want to complete a task, assigned it to you and abort it with the self interaction menu.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Las misiones secundarias son realmente útiles para elevar tu nivel de reputación.<br/> Una misión secundaria puede ser solicitada por el oficial con su menú de auto-interacción..<br/> Si no desea completar una tarea, siempre puede abortarla con el menú de auto-interacción.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Nebenaufgaben sind sehr nütlich um das Ansehen in der Bevölkerung zu erhöhen.<br/>Diese Aufgaben können vom Offizier über das Eigen-Interaktionsmenü angefordert werden.<br/>Kann man eine Mission aus verschiedenen Gründen nicht abgeschlossen werden, so kann der Offizier sie jederzeit über das Eigen-Interaktionsmenü abbrechen.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Missões secundárias são úteis para elevar o nível de reputação.<br/> Uma missão secundária pode ser solicitada pelo Oficial usando menu de interação pessoal.<br/> Se você não quiser concluir uma tarefa, poderá sempre abortá-la usando o menu de interação.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> 支线任务有利于提升声誉值。<br/> 军官(Officer)可以使用自我互动菜单申请支线任务。<br/> 军官(Officer)可以使用自我互动菜单随时取消支线任务。<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Les missions secondaires sont vraiment utiles pour élever votre niveau de réputation.<br/> Une mission secondaire peut être demandée par l'officier avec son menu ACE.<br/> Si vous ne souhaitez pas terminer une tâche, attribuez-la à vous et abandonnez-la avec le menu ACE.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\whiteboard_ca.paa' width='20' height='20'/> Vedlejší mise jsou opravdu užitečné pro zvýšení úrovně vaší reputace.<br/> Vedlejší mise může být vyžádaná důstojníkem pomocí nabídky vlastní interakce.<br/> Pokud nechcete dokončit úkol, přidělte si ho a zrušte jej pomocí nabídky vlastní interakce.<br/><br/> <img image='\a3\Missions_F_Beta\data\img\Challenges_overview_CA.paa' width='355' height='200' />
+
+
+
+
+ <img image='\a3\Ui_F_Curator\Data\CfgMarkers\kia_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Introduction:</marker><br/> By default, each player has a limited number of respawn tickets. On first join, you get the default number of tickets (20). After, each time you respawn, your number of tickets will decrease by one and a kill in action (KIA) marker will appear after 10 minutes.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_104_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Get new tickets:</marker><br/> Players can increase by one ticket if they retrieve their dead body back to base. Prisoners also increase by one ticket but to all currently connected players.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_118_co.paa' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\medical_gui\ui\bodybag.paa' width='20' height='20'/> <marker name='blufor_base'>Dead player body:</marker><br/> Any player can retrieve dead player body by:<br/> - <img image='\z\ace\addons\medical_treatment\ui\bodybag_ca.paa' width='13' height='13'/> Putting dead body in a body bag. Watch out if your vehicle get destroyed, all body bag will be lost!<br/> - Carry it to the logistic point<br/> - Interact with the logistic point<br/> - <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='13' height='13'/> Select "Get tickets from body bag or prisoner"<br/> The ticket from the body bag will go to the player owned the dead body (even if he is not connected). Dead body can also be directly processed. <br/><br/> <img image='\A3\EditorPreviews_F_Orange\Data\CfgVehicles\Land_Bodybag_01_black_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\captives\UI\handcuff_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Prisoners:</marker><br/> Prisoners <img image='\z\ace\addons\captives\UI\Surrender_ca.paa' width='13' height='13'/> follow the same process as dead player body without the need of body bag. The prisonner need to be alive but it could be unconcious.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_106_co.paa' width='355' height='200'/>
+ <img image='\a3\Ui_F_Curator\Data\CfgMarkers\kia_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Einführung:</marker><br/> Standardmäßig hat jeder Spieler eine begrenzte Anzahl von Respawn Tickets. Beim ersten Spawen erhält jeder Spieler standartmäßig 20 Tickets. Mit jedem Respawn wird ein Ticket abgezogen und eine Kill in Action (KIA) Markierung erscheint nach 10 Minuten.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_104_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Tickets auffüllen:</marker><br/> Spieler können ein Ticket dazu erhalten, wenn sie ihren Leiche zurück zur Basis bringen. Für jeden zur Basis gebrachten Gefangenen erhält jeder Spieler, welcher sich aktuell auf den Server befindet, ein Ticket dazu.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_118_co.paa' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\medical_gui\ui\bodybag.paa' width='20' height='20'/> <marker name='blufor_base'>Leiche eines Spielers:</marker><br/> Jeder Spieler kann einen toten Spieler bergen, in dem er:<br/> - <img image='\z\ace\addons\medical_treatment\ui\bodybag_ca.paa' width='13' height='13'/> die Leiche eines Spielers in einen Leichensack packt. Achtung! Wenn das Fahrzeug mit Leichensäcken zerstört wird, sind diese verloren!<br/> - Trage die Leichensäcke zum Logistik Punkt<br/> - Interagiere mit dem Logistikpunkt<br/> - <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='13' height='13'/> Wähle: "Erhalte ein Ticket durch Leichensack oder Gefangenen"<br/> Die Leiche des Spielers, welche im Leichensack war, erhält ein Ticket, auch wenn er aktuell nicht auf dem Server ist.<br/><br/> <img image='\A3\EditorPreviews_F_Orange\Data\CfgVehicles\Land_Bodybag_01_black_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\captives\UI\handcuff_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Prisoners:</marker><br/> Gefangene <img image='\z\ace\addons\captives\UI\Surrender_ca.paa' width='13' height='13'/> folge den gleichen Schritten wie bei Leichen von Spielern, nur ohne Leichensack. Gefangene müssen am Leben sein, können aber Ohnmächtig sein.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_106_co.paa' width='355' height='200'/>
+ <img image='\a3\Ui_F_Curator\Data\CfgMarkers\kia_ca.paa' width='20' height='20'/> <marker name='blufor_base'>介绍:</marker><br/> 默认情况下, 每名玩家都有受限的重生票数。首次进入服务器时, 你会获得默认的重生票数(20)。此后, 每次重生都会使你的重生票数减一, 且地图上将于10分钟后出现阵亡(KIA)标记。<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_104_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>获得新的重生票数:</marker><br/> 玩家可以通过将他们的尸体带回基地, 来获得一枚重生票数。带回囚犯也可以为全体在线玩家每人增加一枚重生票数。<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_118_co.paa' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\medical_gui\ui\bodybag.paa' width='20' height='20'/> <marker name='blufor_base'>阵亡玩家的尸体:</marker><br/> 玩家都可以通过以下方式回收尸体:<br/> - <img image='\z\ace\addons\medical_treatment\ui\bodybag_ca.paa' width='13' height='13'/> 将尸体放进尸体袋。小心, 如果你的载具被摧毁, 其中所有尸体袋都会丢失!<br/> - 将尸体搬运到后勤点<br/> - 与后勤点互动<br/> - <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='13' height='13'/> 选择"回收尸体袋或囚犯以获得重生票数"<br/> 获得的重生票数将会发放给该尸体对应的玩家(即使他不在线)。<br/><br/> <img image='\A3\EditorPreviews_F_Orange\Data\CfgVehicles\Land_Bodybag_01_black_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\captives\UI\handcuff_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Prisoners:</marker><br/> 囚犯 <img image='\z\ace\addons\captives\UI\Surrender_ca.paa' width='13' height='13'/> 遵循与回收玩家尸体相同的流程, 但无需尸体袋。被回收的囚犯必须活着, 但可以出于昏迷状态。<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_106_co.paa' width='355' height='200'/>
+ <img image='\a3\Ui_F_Curator\Data\CfgMarkers\kia_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Úvod:</marker><br/> Ve výchozím nastavení má každý hráč omezený počet respawn tiketů. Při prvním připojení získáte výchozí počet tiketů (20). Poté, co se znovu objevíte, se váš počet lístků sníží o jeden a po 10 minutách se objeví značka zabití v akci (KIA).<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_104_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Získejte nové vstupenky:</marker><br/> Hráči mohou zvýšit o jeden tiket, pokud získají své mrtvé tělo zpět na základnu. Vězni se také zvyšují o jeden tiket, ale všem aktuálně připojeným hráčům.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_118_co.paa' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\medical_gui\ui\bodybag.paa' width='20' height='20'/> <marker name='blufor_base'>Tělo mrtvého hráče:</marker><br/> Každý hráč může získat tělo mrtvého hráče:<br/> - <img image='\z\ace\addons\medical_treatment\ui\bodybag_ca.paa' width='13' height='13'/> Vkládání mrtvého těla do vaku na tělo. Dávejte pozor, pokud se vaše vozidlo zničí, všechno se ztratí!<br/> - Odneste to do logistického bodu.<br/> - Komunikujte s logistickým bodem<br/> - <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='13' height='13'/> Vyberte „Získejte lístky z vaku na tělo nebo vězně“<br/> Lístek z pytle na mrtvoly dostane mrtvé tělo hráče (i když není připojen).<br/><br/> <img image='\A3\EditorPreviews_F_Orange\Data\CfgVehicles\Land_Bodybag_01_black_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\captives\UI\handcuff_ca.paa' width='20' height='20'/> <marker name='blufor_base'> Vězni <img image='\z\ace\addons\captives\UI\Surrender_ca.paa' width='13' height='13'/> postupujte stejným způsobem jako tělo mrtvého hráče bez potřeby vaku na tělo. Vězeň musí být naživu, ale může být v bezvědomí.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_106_co.paa' width='355' height='200'/>
+ <img image='\a3\Ui_F_Curator\Data\CfgMarkers\kia_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Introduction:</marker><br/> Par défaut, chaque joueur dispose d’un nombre limité de tickets de réapparition. Lors de la première connexion, vous obtenez le nombre de tickets par défaut (20). Après, chaque fois que vous réapparaissez, votre nombre de tickets diminuera d’un et un marqueur kill in action (KIA) apparaîtra au bout de 10 minutes.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_104_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Obtenir de nouveaux tickets :</marker><br/> Les joueurs peuvent augmenter d’un ticket s’ils ramènent leur cadavre à la base. Les prisonniers augmentent également d’un ticket, mais pour tous les joueurs actuellement connectés.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_118_co.paa' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\medical_gui\ui\bodybag.paa' width='20' height='20'/> <marker name='blufor_base'>Cadavre de joueurs:</marker><br/> Tout joueur peut récupérer le corps du joueur mort par:<br/> - <img image='\z\ace\addons\medical_treatment\ui\bodybag_ca.paa' width='13' height='13'/> Mettre un cadavre dans un sac mortuaire. Attention si votre véhicule est détruit, tous les sacs mortuaires seront perdus !<br/> - Le porter au point logistique<br/> - Interagir avec le point logistique<br/> - <img image='\A3\Data_F_AoW\Logos\arma3_aow_logo_ca.paa' width='13' height='13'/> Sélectionnez "Obtenir des tickets auprès d’un sac mortuaire ou d’un prisonnier".<br/> Le ticket du sac mortuaire ira au joueur propriétaire du cadavre (même s’il n’est pas connecté).<br/><br/> <img image='\A3\EditorPreviews_F_Orange\Data\CfgVehicles\Land_Bodybag_01_black_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\captives\UI\handcuff_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Prisonniers:</marker><br/> Les prisonniers <img image='\z\ace\addons\captives\UI\Surrender_ca.paa' width='13' height='13'/> suivent le même processus que les corps de joueur mort sans le besoin de sac mortuaire. Les prisonniers doivent être en vie ou inconscient.<br/><br/> <img image='a3\Missions_F_AoW\Data\Img\Artwork\Landscape\showcase_aow_picture_106_co.paa' width='355' height='200'/>
+
+
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> In this mission a FOB is a forward spawn point, to create a FOB approach the red box at the logistic point and require a blue container.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_ft_owned.jpg' width='355' height='180'/> <br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Deploy:</marker> <br/> Move it where you want to deploy a new FOB and interact with it to set it up. Keep in mind that you can not deploy a FOB close to the main base (2.500m) and the terrain needs to be flat.<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dismantle:</marker> <br/> You can dismantle a FOB by interacting with the flag on the HQ roof.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa' width='20' height='20' /> <marker name='blufor_base'>Rallypoint:</marker><br/> You can also use the Zeus rallypoint backpack available in Arsenal but they have some limitation. After some times or after player disconnected, rallypoint will self-destruct.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> En esta misión un FOB es un punto de respawn avanzado, para crear un FOB se aproxima a la caja roja en el punto logístico y requiere un contenedor azul.<br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Deploy:</marker> <br/> Muévelo donde quieras desplegar un nuevo FOB e interactúa con él para configurarlo. Tenga en cuenta que no puede desplegar un FOB cerca de la base principal (2.500m) y el terreno debe ser plano.<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dismantle:</marker> <br/> Puede desmontar un FOB interactuando con la bandera en el techo del HQ.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> Eine FOB (Forward Operating Base / vorgeschobene Operationsbasis) dient in dieser Mission als Spawn-Punkt. Um eine FOB zu erstellen muss am Logistikpunkt ein ensprechnender Frachtcontainer(Blau) angefordert werden<br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Aufbau:</marker> <br/> Der Aufbau kann nur statfinden, wenn man sich mindestens 2,5km von der Basis entfernt hat und das Gelände relativ flach ist. Um den Aufbau zu beginnen: einfach mit dem Frachtcontainer interagieren und 'FOB aufbauen' auswählen.<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Abbau:</marker> <br/> Auf dem Dach der FOB kann man mit der Flagge interagieren um den Abbau zu beginnen.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>Sammelpunkt:</marker><br/> Nutzen Sie den im Arsenal erhältlichen Lager-Rucksack aus dem Zeus-DLC. Die Anzahl der Respawns bei den Sammelpunkten ist beschränkt.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> Nesta missão, uma FOB é um ponto de surgimento. Para criar uma FOB, aproxime-se da caixa vermelha no ponto logístico, solicite um container azul.<br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Deploy:</marker> <br/> A construção só pode acontecer se você se deslocar 2.500m da FOB principal e o terreno deve ser plano. Para começar a criar a nova FOB, basta interagir com o cônteiner e selecionar: "Build FOB" (Criar FOB).<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dismantle:</marker> <br/> No telhado da FOB, você pode interagir com a bandeira para iniciar a desmontagem da FOB.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB: </marker><br/> FOB 可作为前线复活点使用。要创建FOB, 请在后勤点申请蓝色货运集装箱。<br/><br/> <img image='\a3\data_f_warlords\Data\preview_ft_owned.jpg' width='355' height='180'/> <br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>部署: </marker> <br/> 将FOB集装箱移动至部署位置并与其互动即可建造FOB。请谨记: 只有在主基地2500米范围外的地形平坦区域才能建立FOB。<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>拆除: </marker> <br/> 你可以与指挥部(HQ)屋顶的旗杆互动, 以拆除FOB。<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa' width='20' height='20' /> <marker name='blufor_base'>集合点: </marker><br/> 你也可以使用军火库中的宙斯集合点背包, 但是它们有使用限制。在玩家离线一段时间后, 集合点将会自毁。<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> Dans cette mission, un FOB est un point d'apparition avancé, pour créer un FOB approchez la boîte rouge au point logistique et demandez un conteneur bleu.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_ft_owned.jpg' width='355' height='180'/> <br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Déploiement:</marker> <br/> Déplacez-le là où vous souhaitez déployer un nouveau FOB et interagissez avec lui pour le configurer. Gardez à l'esprit que vous ne pouvez pas déployer un FOB à proximité de la base principale (2 500 m) et que le terrain doit être plat.<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Démonter:</marker> <br/> Vous pouvez démonter un FOB en interagissant avec le drapeau sur le toit du QG.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa' width='20' height='20' /> <marker name='blufor_base'>Rallypoint:</marker><br/> Vous pouvez également utiliser le sac à dos Zeus rallypoint disponible dans l'Arsenal mais ils ont certaines limitations. Après quelque temps ou après que le joueur soit déconnecté, le point de ralliement s'autodétruira.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move1_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\move2_ca.paa' width='20' height='20' /> <marker name='blufor_base'>FOB:</marker><br/> V této misi je FOB dopředný spawn bod, k vytvoření FOB se přiblžte k červenému poli v logistickém bodu a vyžaduje modrý kontejner.<br/><br/> <img image='\a3\data_f_warlords\Data\preview_ft_owned.jpg' width='355' height='180'/> <br/><br/> - <img image='\A3\Ui_f\data\Map\Markers\NATO\b_hq.paa' width='20' height='20'/> <marker name='blufor_base'>Deploy:</marker> <br/> Přesuňte jej tam, kde chcete nasadit nový FOB, a interagujte s ním, abyste jej nastavili. Mějte na paměti, že nemůžete rozmístit FOB blízko hlavní základny (2500 m) a terén musí být rovný.<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Demontovat:</marker> <br/> FOB můžete demontovat interakcí na vlajce na střeše HQ.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\run_ca.paa' width='20' height='20' /> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa' width='20' height='20' /> <marker name='blufor_base'>Rallypoint:</marker><br/> Můžete také použít batoh Zeus rallypoint dostupný v Arsenalu, ale mají určitá omezení. Po nějaké době nebo po odpojení hráče se shromažďovací bod sám zničí.<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureRespawn_co.paa' width='355' height='180'/>
+
+
+
+
+ =BTC= Lift will not replace the A3 sling loading, you can use both.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Lifting an object is pretty simple. Get in a chopper as pilot, hover above the object and interact with the chopper to deploy ropes.<br/> When you are in the right position a new scroll wheel action will appear ('HOOK'). If you want you can open the HUD to facilitate the operation.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> To release an object open you self interaction menu and select 'CUT ROPES'.<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC= Lift will not replace the A3 sling loading, you can use both.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Levantar un objeto es muy sencillo. Métete en un helicóptero como piloto, sobrevuela el objeto e interactúa con el helicóptero para desplegar las cuerdas.<br/> Cuando esté en la posición correcta, aparecerá una nueva acción de la rueda de desplazamiento ('HOOK'). Si lo desea puede abrir el HUD para facilitar la operación.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> Para liberar un objeto, abra el menú de autointeracción y seleccione 'CORTAR CUERDAS'.<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC= Lift ersetzt nicht das A3 Sling-Load-System, du kannst beide nutzen.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Das heben von Lasten ist recht einfach. Nimm dir einen Hubschrauber, schwebe über dem Objekt und lass die Seile ab indem du mit dem Hubschrauber interagierst.<br/> Wenn du in der richtigen Postion bist, erscheint im Maus-Rad-Menü die Option 'EINHACKEN' mit der du die Fracht einhacken kannst. Wenn du willst kannst du auch ein HUD öffnen, welches dir deine Arbeit erleichtert.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> Um ein eingehacktes Objekt abzulassen, wähle im Maus-Rad-Menü die Option 'SEILE TRENNEN' aus.<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC= O elevador não substituirá o carregamento do A3 Sling, você pode usar ambos.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Levantar um objeto é bem simples. Entre em um helicóptero como piloto, passe o mouse sobre o objeto e interaja com o helicóptero para posicionar as cordas.<br/> Quando você estiver na posição correta e rolar a roda do mouse, aparecerá a ação "GANCHO". Se você quiser, pode abrir o HUD para facilitar a operação.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> Para liberar um objeto, abra o menu de interação deste objeto e selecione "CORTAR CORDAS".<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC=吊挂功能不会覆盖原版吊挂功能, 二者都可以使用。<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> 吊挂货物相当简单: 进入直升机飞行员座位, 于货物上方悬停, 与直升机互动并部署绳索。<br/> 当你处于正确位置时, 一个新的选项"安装挂钩"将会出现在鼠标滚轮的动作菜单中。你可也以打开HUD以方便操作。<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> 要释放一个货物, 使用自我互动菜单并选择"断开绳索"即可。<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC= Lift ne remplacera pas l'hélitreuillage Vanilla, vous pouvez utiliser les deux.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Soulever un objet est assez simple. Montez dans un hélicoptère en tant que pilote, survolez l'objet et interagissez avec l'hélicoptère pour déployer des cordes.<br/> Lorsque vous êtes dans la bonne position, une nouvelle action de molette de défilement apparaît («ACCROCHER»). Si vous le souhaitez, vous pouvez ouvrir le HUD pour faciliter l'opération.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> Pour libérer un objet, ouvrez le menu d'auto-interaction et sélectionnez «COUPER LES CORDES».<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+ =BTC= Lift nenahradí nakládání popruhu A3, můžete použít obojí.<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\container_ca.paa' width='20' height='20'/> <img image='\A3\air_f_beta\Heli_Transport_01\Data\UI\Map_Heli_Transport_01_base_CA.paa' width='20' height='20'/> Zvedání předmětu je velmi jednoduché. Nasedněte do vrtulníku jako pilot, vzneste se nad objekt a interagujte s vrtulníkem, abyste nasadili lana.<br/> Když jste ve správné pozici, objeví se nová akce rolovacího kolečka ('HOOK'). Pokud chcete, můžete otevřít HUD pro usnadnění operace.<br/> <img image='\z\ace\addons\logistics_wirecutter\ui\wirecutter_ca.paa' width='20' height='20'/> Chcete-li uvolnit objekt, otevřete nabídku vlastní interakce a vyberte 'CUT ROPES'.<br/><br/> <img image='\a3\Missions_F_Heli\data\img\Showcase_SlingLoading_overview_CA.paa' width='355' height='200' />
+
+
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> At the logistic point you can require new objects (like ammo, fortifications, supplies for the side missions...) and repair destroyed vehicles.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> En el punto logístico puede requerir nuevos objetos (como municiones, fortificaciones, suministros para las misiones secundarias...) y reparar vehículos destruidos.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Am Logistikpunkt kann man neue Objekte (wie zB. Munition, Baumaterial, Nachschubgüter für Nebenaufgaben...) anfordern und zerstörte Fahrzeuge reparieren.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> No ponto logístico, você pode solicitar novos objetos (como munição, fortificações, suprimentos para as missões secundárias ...) e reparar veículos destruídos.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> 后勤点可以生成新的物件(如弹药、防御工事、用于支线任务的救援物资等), 也可以维修受损载具。<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> Au point logistique, vous pouvez avoir besoin de nouveaux objets (comme des munitions, des fortifications, des fournitures pour les missions secondaires ...) et réparer les véhicules détruits.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\repair_ca.paa' width='20' height='20'/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\rearm_ca.paa' width='20' height='20'/> V logistickém bodě můžete vyžadovat nové předměty (jako je munice, opevnění, zásoby pro vedlejší mise...) a opravovat zničená vozidla.<br/><br/> <img image='A3\Missions_F_Tank\data\img\Showcase_TankDestroyers.paa' width='355' height='200' />
+
+
+
+
+ <img image='\z\ace\addons\cargo\UI\Icon_Module_Cargo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Cargo System:</marker><br/> Use ACE 3 Cargo system. <br/><br/> <img image='\z\ace\addons\attach\UI\attach_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Towing system:</marker><br/> To tow a vehicle interact with the tower and select the option 'Towing'.<br/>After that, place the tower vehicle in front of it and select 'Attach Tow Rope' in the interaction menu.<br/> If the two vehicles are too far away or the vehicle can't tow that load (Car can't tow truck or tank), the option will be disabled.<br/> To unhook interact with one of the two vehicles and select the option 'UNHOOK'.<br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\VehicleCargoIconOn2_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Vehicle in vehicle system:</marker><br/> BI Vehicle in Vehicle (ViV) system is extended to allow load of any vehicle in a vehicle. To move ViV use the towing system. To unload, move in driver seat of the tower vehicle and select in scroll menu "unload all objects".<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureVehicleInVehicle_co.paa' width='355' height='200' /><br/><br/> <img image='\z\ace\addons\dragging\UI\icons\box_carry.paa' width='20' height='20'/> <marker name='blufor_base'>Place option:</marker><br/> With this option you can move heavy objects to build small outpost or base.<br/> When you select the option an hint will show all the keys required to move the object.
+ <img image='\z\ace\addons\cargo\UI\Icon_Module_Cargo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>货运系统:</marker><br/> 使用ACE3货运系统。<br/><br/> <img image='\z\ace\addons\attach\UI\attach_ca.paa' width='20' height='20'/> <marker name='blufor_base'>牵引系统:</marker><br/> 如需牵引一辆载具, 与牵引车(前车)互动并选择"牵引"。<br/>然后, 将牵引车置于被牵引车(后车)前方, 并在互动菜单中选择"连接牵引绳"。<br/> 如果两辆车的距离过远, 或前车无法牵引这一载荷(比如汽车(Car)无法牵引卡车(Truck)或坦克(Tank)), 则该选项不可用。<br/> 如需取消牵引, 与两车之一互动并选择"取消牵引"。<br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\VehicleCargoIconOn2_ca.paa' width='20' height='20'/> <marker name='blufor_base'>托运系统:</marker><br/> 本任务扩展了BI内置的托运(ViV)系统, 使其支持托运任何类型的载具。通过和牵引系统相同的方式来使用载具托运功能。如需取消托运, 进入托运车辆(前车)的驾驶员座位, 选择滚轮菜单中的"卸载货物"。<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureVehicleInVehicle_co.paa' width='355' height='200' /><br/><br/> <img image='\z\ace\addons\dragging\UI\icons\box_carry.paa' width='20' height='20'/> <marker name='blufor_base'>物体放置:</marker><br/> 您可以使用该选项来移动重物, 从而建造一个小的前哨或基地。<br/> 选择该选项后, 移动对象所需键位的提示将会出现。
+ <img image='\z\ace\addons\cargo\UI\Icon_Module_Cargo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Système de cargaison:</marker><br/> Utilisez le système ACE 3 Cargo. <br/><br/> <img image='\z\ace\addons\attach\UI\attach_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Système de remorquage:</marker><br/> Pour remorquer un véhicule, interagissez avec le remorqueur et sélectionnez l'option «Remorquage».<br/>Ensuite, placez le véhicule remorqueur devant lui et sélectionnez «Attacher la corde de remorquage» dans le menu d'interaction.<br/> Si les deux véhicules sont trop éloignés ou si le véhicule ne peut pas remorquer cette charge (la voiture ne peut pas remorquer un camion ou un char), l'option sera désactivée.<br/> Pour décrocher, interagissez avec l'un des deux véhicules et sélectionnez l'option «DÉCROCHER».<br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\VehicleCargoIconOn2_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Vehicle in vehicle system:</marker><br/> Le système BI Vehicle in Vehicle (ViV) est étendu pour permettre le chargement de n'importe quel véhicule dans un véhicule. Pour déplacer ViV, utilisez le système de remorquage. Pour décharger, placez-vous dans le siège conducteur du véhicule de remorquge et sélectionnez dans le menu déroulant «décharger tous les objets».<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureVehicleInVehicle_co.paa' width='355' height='200' /><br/><br/> <img image='\z\ace\addons\dragging\UI\icons\box_carry.paa' width='20' height='20'/> <marker name='blufor_base'>Place option:</marker><br/> Avec cette option, vous pouvez déplacer des objets lourds pour construire un petit avant-poste ou une base.<br/> Lorsque vous sélectionnez l'option, un indice affichera toutes les touches nécessaires pour déplacer l'objet.
+ <img image='\z\ace\addons\cargo\UI\Icon_Module_Cargo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Cargo System:</marker><br/> Použijte ACE 3 Cargo systém. <br/><br/> <img image='\z\ace\addons\attach\UI\attach_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Tažné zařízení:</marker><br/> Chcete-li táhnout vozidlo, interagujte s vozidlem a vyberte možnost 'Vlečení'.<br/>Poté umístěte vozidlo před něj a v interaktivní nabídce vyberte 'Připojit tažné lano'.<br/> Pokud jsou dvě vozidla příliš daleko nebo vozidlo nemůže táhnout tento náklad (Auto nemůže táhnout nákladní automobil nebo nádrž), tato možnost bude deaktivována.<br/> Chcete-li vyvěsit, interagujte s jedním ze dvou vozidel a vyberte možnost 'UNHOOK'.<br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\VehicleToggles\VehicleCargoIconOn2_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Systém vozidla ve vozidle:</marker><br/> Systém BI Vehicle in Vehicle (ViV) je rozšířen tak, aby umožňoval naložení jakéhokoli vozidla ve vozidle. K pohybu ViV použijte tažný systém. Chcete-li vyložit, přesuňte se na sedadlo řidiče hlavního vozidla a v rolovací nabídce vyberte "vyložit všechny předměty".<br/><br/> <img image='\A3\Data_F_Exp\Images\FeatureVehicleInVehicle_co.paa' width='355' height='200' /><br/><br/> <img image='\z\ace\addons\dragging\UI\icons\box_carry.paa' width='20' height='20'/> <marker name='blufor_base'>Možnost umístění:</marker><br/> Pomocí této možnosti můžete přesouvat těžké předměty a budovat malou základnu nebo základnu.<br/> Když vyberete možnost, nápověda zobrazí všechny klávesy potřebné k přesunutí objektu.
+
+
+
+
+ The hideouts are a place where the Oplitas organize their movements.<br/>They send reinforcements from here and can attack the closest city.<br/>If you notice a lot of activity in an area, probably there is an hideout closeby.<br/>If you want to defeat the Oplitas, you need to destroy all their hideouts.<br/>Here an example of an hideout:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>To destroy an hideout just place a satchel near the ammo box, it's close to the flag, and blow it off!
+ Los escondites son un lugar donde los Oplitas organizan sus movimientos.<br/>Enviarán refuerzos desde aquí y podrán atacar la ciudad más cercana.<br/>Si usted nota mucha actividad en un área, probablemente hay un escondite cerca.Si quieres derrotar a los Oplitas, tienes que destruir todos sus escondites.<br/>Aquí un ejemplo de un escondite:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>Para destruir un escondite sólo tienes que colocar una explosivo tipo satchel cerca de la caja de municiones, cerca de la bandera, y volarla!
+ In den Verstecken planen und organisieren die Oplitas ihre Einstäze und Bewegungen.<br/>Von hier wird Verstärkung auf umliegende Gebiete verteilt. Ebenso ist ein Angriff auf die nächste Stadt von hier aus möglich.<br/>Sollten Sie eine erhöhte feindliche Aktivität in der Gegend festestellen, so befindet sich möglicherweise ein Versteck in der Nähe.<br/>Wenn Sie die Oplitas besiegen wollen, so müssen Sie alle Verstecke zerstören.<br/>Hier ein kleines Beispiel für ein Versteck:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>Das Versteck kann zerstört werden in dem man eine Sprengladung in der Nähe der Munitionskiste oder der Flagge zündet!
+ Os esconderijos são um lugar onde as inimigos organizam seus movimentos.<br/>Daqui eles enviam reforços e podem atacar as cidades mais próximas.<br/>Se você notar muita atividade em uma área, provavelmente há um esconderijo por perto.<br/>Se você quiser derrotar o inimigo, terá que destruir todos os esconderijos.<br/>Veja um exemplo de um esconderijo:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>Para destruir um esconderijo, basta colocar uma bolsa de explosivos perto da caixa de munição (que fica perto da bandeira) e explodí-lo!
+ 藏匿点是Oplitas组织活动的地方。<br/>他们从这里派遣增援, 进攻附近的城市。<br/>如果你在某区域注意到了大量民兵活动, 那么藏匿点可能就在附近。<br/>如果你想要打败Oplitas, 你需要摧毁所有的藏匿点。<br/>这是一张藏匿点的示意图:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>要摧毁藏匿点, 只需在靠近旗帜的弹药箱上放置一个炸药包, 然后炸掉它!
+ Les planques sont un lieu où les Oplitas organisent leurs déplacements.<br/>Ils envoient des renforts d'ici et peuvent attaquer la ville la plus proche.<br/>Si vous remarquez beaucoup d'activité dans une zone, il y a probablement une planque à proximité.<br/>Si vous voulez vaincre les Oplitas, vous devez détruire toutes leurs planques.<br/>Ici l'exemple d'une planque:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>Pour détruire une planque, placez simplement une sacoche près de la boîte de munitions, elle est proche du drapeau, et faites-la exploser!
+ Úkryty jsou místem, kde Oplitové organizují svůj pohyb.<br/>Posílají odtud posily a mohou zaútočit na nejbližší město.<br/>Pokud si všimnete velkého ruchu v oblasti, pravděpodobně je poblíž úkryt.<br/>Pokud chcete porazit Oplitas, musíte zničit všechny jejich úkryty.<br/>Zde je příklad úkrytu:<br/><br/><img image='core\img\hideout.jpg' width='306' height='256'/><br/><br/>Chcete-li zničit skrýš, stačí umístit brašnu blízko krabice s municí, je blízko vlajky, a odstřelit ji!
+
+
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\mine_ca.paa' width='20' height='20'/> <marker name='blufor_base'>IED:</marker><br/> Any object could be an IED or a fake IED.<br/> <img image='\A3\EditorPreviews_F\Data\CfgVehicles\IEDLandSmall_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detection:</marker><br/> Approach IED carefully (DO NOT rotate while you are walking: prefer walk, stop, rotate, walk again etc). Turn On your mine detector (VMH3 or VMMH3) and search for a charge in a circle of 2 meter around.<br/> <img image='\z\ace\addons\minedetector\data\equip\w_vmh3_ca.paa' width='70' height='100'/> <br/><br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Defuse:</marker><br/> If you are an engineer and have a defusal kit, you can disarm it. You can also blow them off with high caliber and explosive satchels.<br/> <img image='\z\ace\addons\explosives\Data\UI\Pliers.paa' width='50' height='50'/> <br/><br/> <img image='\A3\armor_f_beta\APC_Tracked_01\Data\UI\APC_Tracked_01_CRV_ca.paa' width='30' height='20'/> <marker name='blufor_base'>Clean up:</marker><br/> You can remove wreck or object around IED or fake IED by driving a Nemmera in their direction. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\B_APC_Tracked_01_CRV_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Cualquier objeto puede ser un artefacto explosivo improvisado, acérquese a él con cuidado (NO rote mientras camina: prefiera caminar, detenerse, rotar, volver a caminar, etc.). Encienda su detector de minas (VMH3 o VMMH3) y busque una carga en un círculo de 2 metros alrededor.<br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> Si usted es ingeniero y tiene un kit de desactivación, puede desarmarlo.<br/> También puedes volarlos con explosivos y fuego de alto calibre.
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Jedes Objekt kann eine IED sein, seien sie ensprechen Vorsichtig und machen Sie keine hastigen Bewegungen (NICHT drehen wenn man läuft: besser gehen, stop, drehen, gehen und so weiter). Schalten Sie ihren Minendetektor (VMH3 oder VMMH3) ein und suchen sie in eim 2m Radius nach der Ladung.<br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> Wenn Sie ein Ingenieur sind und ein Entschärfungskit dabei habe, können Sie die Sprengladung entschärfen.<br/> Es is ebenfalls möglich die IED mithilfe von hohen Kalibern oder Sprengladungen zu entfernen (kontrollierte Explosion).
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Qualquer objeto pode ser um IED, aproxime-o com cuidado (NÃO vire-se enquanto estiver andando: ande, pare, olhe, ande de novo, etc.). Ative o seu detector de minas (VMH3 ou VMMH3) e procure uma carga em um círculo de 2 metros ao redor.<br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> Se você é um engenheiro e possui um kit de desarme, você pode desarmá-lo.<br/> Também é possível destruir o IED usando grosso calibre ou explosivos (explosão controlada).
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\mine_ca.paa' width='20' height='20'/> <marker name='blufor_base'>简易爆炸装置(IED):</marker><br/> 任何物体都有可能是IED, 或者是假IED。<br/> <img image='\A3\EditorPreviews_F\Data\CfgVehicles\IEDLandSmall_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>探测:</marker><br/> 任何物体都可能是一个简易爆炸装置(IED), 小心地接近它(切勿在行走的同时转身, 而应当"走-停下-转身-继续走")。打开你的探雷器(VMH3或VMMH3), 在2米范围内寻找炸弹。<br/> <img image='\z\ace\addons\minedetector\data\equip\w_vmh3_ca.paa' width='70' height='100'/> <br/><br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> <marker name='blufor_base'>拆除:</marker><br/> 如果你是工程师并且携带了拆弹工具, 你就可以拆除它。你也可以使用大口径子弹或者炸药包来引爆它。<br/> <img image='\z\ace\addons\explosives\Data\UI\Pliers.paa' width='50' height='50'/> <br/><br/> <img image='\A3\armor_f_beta\APC_Tracked_01\Data\UI\APC_Tracked_01_CRV_ca.paa' width='30' height='20'/> <marker name='blufor_base'>清理:</marker><br/> 你可以通过驾驶豹式装甲车(Nemmera)朝向IED或假IED, 来移除它们周围的残骸或物体。<img image='\A3\EditorPreviews_F\Data\CfgVehicles\B_APC_Tracked_01_CRV_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\mine_ca.paa' width='20' height='20'/> <marker name='blufor_base'>EEI:</marker><br/> Tout objet peut être un EEI ou un faux EEI.<br/> <img image='\A3\EditorPreviews_F\Data\CfgVehicles\IEDLandSmall_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Détection:</marker><br/> Approchez-vous prudemment du EEI (NE faites PAS pivoter pendant que vous marchez: préférez marcher, arrêter, tourner, marcher à nouveau, etc.). Allumez votre détecteur de mines (VMH3 ou VMMH3) et recherchez une charge dans un cercle de 2 mètres autour.<br/> <img image='\z\ace\addons\minedetector\data\equip\w_vmh3_ca.paa' width='70' height='100'/> <br/><br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Désarmer:</marker><br/> Si vous êtes ingénieur et que vous possédez un kit de désamorçage, vous pouvez le désarmer. Vous pouvez également les faire sauter avec des armes de gros calibres et des charges explosives.<br/> <img image='\z\ace\addons\explosives\Data\UI\Pliers.paa' width='50' height='50'/> <br/><br/> <img image='\A3\armor_f_beta\APC_Tracked_01\Data\UI\APC_Tracked_01_CRV_ca.paa' width='30' height='20'/> <marker name='blufor_base'>Nettoyer:</marker><br/> Vous pouvez retirer une épave ou un objet autour d'EEI ou de faux EEI avec un Nemmera en avançant dans leur direction. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\B_APC_Tracked_01_CRV_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\mine_ca.paa' width='20' height='20'/> <marker name='blufor_base'>IED:</marker><br/> Jakýkoli předmět může být IED nebo falešné IED.<br/> <img image='\A3\EditorPreviews_F\Data\CfgVehicles\IEDLandSmall_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detekce:</marker><br/> Přistupujte k IED opatrně (NEOTÁČEJTE se při chůzi: raději jděte, zastavte se, otočte se, znovu jděte atd.). Zapněte svůj detektor min (VMH3 nebo VMMH3) a hledejte náboj v kruhu 2 metry kolem.<br/> <img image='\z\ace\addons\minedetector\data\equip\w_vmh3_ca.paa' width='70' height='100'/> <br/><br/> <img image='\z\ace\addons\explosives\UI\Defuse_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Zneškodnit:</marker><br/> Pokud jste inženýr a máte zneškoďnovací sadu, můžete ji odzbrojit. Můžete je také odpálit pomocí vysoce kvalitních a výbušných brašen.<br/> <img image='\z\ace\addons\explosives\Data\UI\Pliers.paa' width='50' height='50'/> <br/><br/> <img image='\A3\armor_f_beta\APC_Tracked_01\Data\UI\APC_Tracked_01_CRV_ca.paa' width='30' height='20'/> <marker name='blufor_base'>Clean up:</marker><br/> Vrak nebo předmět kolem IED nebo falešného IED můžete odstranit tím, že pojedete v Nemmera v jejich směru.<img image='\A3\EditorPreviews_F\Data\CfgVehicles\B_APC_Tracked_01_CRV_F.jpg' width='355' height='200'/>
+
+
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> Intel can be retrieved in the following ways:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Searching dead bodies<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Interrogate prisoner<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Talking to civilians<br/>- <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Searching house for camera<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Keep in mind that only the interpreter can talk to civilians and they can lie if your reputation level is low.<br/><br/> When you find an intel from a dead body or interrogate a prisoner, a marker will appear in the map. Remember, prisoner have a random number of intel more or less interesting.<br/> There are two types of intel:<br/> - Red question mark (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>) and pictures under diary log map menu: ammo cache intel<br/> - Red exclamation mark (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): hideout intel<br/><br/><br/> When you destroy an hideout or an ammo cache, all the markers related to it will be deleted.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> La Inteligencia se puede recuperar de las siguientes maneras:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Registrando cadáveres<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Interrogando prisioneros<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Conversando con Civiles<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Tenga en cuenta que sólo el intérprete puede hablar con civiles y ellos pueden mentir si su nivel de reputación es bajo.<br/><br/> Cuando encuentres una información de un cadáver o interrogues a un prisionero, aparecerá un marcador en el mapa. Recuerda, los prisioneros tienen un número aleatorio de información más o menos interesante.<br/> Hay 2 tipos de marcas:<br/> - Signo de interrogacion rojo (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>): intel sobre cache de municion<br/> - Signo de exclamacion rojo (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): intel sobre escondite<br/><br/><br/> Cuando destruyes un escondite o una caché de munición, todos los marcadores relacionados con él se borrarán.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> Informationen kann man auf verschiedene Arten erhalten:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Durchsuchen von toten Personen<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Verhören von Gefangenen<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Mit Zivilisten reden<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Nur der Dolmetscher kann sich mit Zivilisten unterhalten. Wenn ihr Ansehen bei der Bevölkerunge niedrig ist, so kann es auch mal vorkommen das manche Zivilisten sie belügen.<br/><br/> Wenn Sie Information erhalten, erscheint eine Markierung auf der Karte. Zur Erinnerung: Gefangene habe mal mehr und mal weniger interessante Informationen.<br/> Es gibt zwei Arten von Markierungen:<br/> - Ein rotes Fragezeichen (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>): Information über ein Waffenlager <br/> - Ein rotes Ausrufezeichen (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): Information über ein Versteck <br/><br/><br/> Wenn Sie ein Versteck oder ein Waffenlager zersört haben, so werden alle relevanten Markierungen automatisch gelöscht.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> Informações podem ser obtidas de diferentes maneiras:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Procurando nos corpos dos mortos<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Interrogando prisioneiros<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Falando com civis<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Somente o intérprete pode conversar com os civis. Se a reputação entre a população é baixa, pode acontecer de alguns civis passarem informações mentirosas.<br/><br/> Quando você encontrar uma informação em um cadáver ou interrogando um prisioneiro, uma marcação aparecerá no mapa. Lembre-se, os prisioneiros possuem um número aleatório de informações que são mais ou menos importante.<br/> Existem dois tipos de marcação:<br/> - Interrogação em Vermelho (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>): Informações sobre depósito de armas<br/> - Exclamação em Vermelho (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): Informações sobre um esconderijo<br/><br/><br/> Quando você destroí um esconderijo ou depósito de munição, o marcador será excluído.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> 可以通过以下方式获取情报:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> 搜查尸体<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> 审问俘虏<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> 询问平民<br/>- <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> 在房屋内寻找照相机<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> 请谨记, 只有翻译员可以与平民交谈, 而且如果你的声誉低, 平民可能会说谎。<br/><br/> 当你通过搜查尸体或审问俘虏得到情报时, 地图上会出现标记。记住, 俘虏所持情报的数量和价值都是随机的。<br/> 情报有两类:<br/> - 红色问号标记 (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>) 和地图界面日志菜单中的图片: 武器箱情报<br/> - 红色叹号标记 (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): 藏匿点情报<br/><br/><br/> 当你摧毁了藏匿点或武器箱时, 与之相关的所有标记将被删除。<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> Les intel peuvent être récupérés des manières suivantes:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Recherche de cadavres<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Interroger des prisonniers<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Parler aux civils<br/>- <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Rechercher une caméra dans les maisons <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Gardez à l'esprit que seul l'interprète peut parler aux civils et qu'ils peuvent mentir si votre réputation est faible.<br/><br/> Lorsque vous trouvez une information sur un cadavre ou interrogez un prisonnier, un marqueur apparaît sur la carte. Rappelez-vous, les prisonniers ont un nombre aléatoire d'informations plus ou moins intéressantes.<br/> Il existe deux types d'informations:<br/> - Point d'interrogation rouge (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>) et images dans le menu de la carte du journal: cache d'arme intel<br/> - Point d'exclamation rouge (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): information sur les planques<br/><br/><br/> Lorsque vous détruisez une planque ou un cache d'arme, tous les marqueurs qui y sont liés seront supprimés.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\map_ca.paa' width='20' height='20'/> Intel lze získat následujícími způsoby:<br/><br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Hledání mrtvých těl<br/> - <img image='\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\instructor_ca.paa' width='13' height='13'/> Vyslechněte vězně<br/> - <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='13' height='13'/> Mluvit s civilisty<br/>- <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\search_ca.paa' width='13' height='13'/> Hledání kamer v domu<br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Mějte na paměti, že s civilisty může mluvit pouze tlumočník a ti mohou lhát, pokud je vaše reputace nízká.<br/><br/> Když najdete zprávu z mrtvého těla nebo vyslechnete vězně, na mapě se objeví značka. Pamatujte, že vězeň má náhodný počet více či méně zajímavých informací.<br/> Existují dva typy intel:<br/> - Červený otazník (<img image='\A3\ui_f\data\map\markers\handdrawn\unknown_CA.paa' width='13' height='13' color='#ff0000'/>) a obrázky pod deníkem menu mapy: mezipaměť munice intel<br/> - Červený vykřičník (<img image='\A3\ui_f\data\map\markers\handdrawn\warning_CA.paa' width='13' height='13' color='#ff0000'/>): úkryt intel<br/><br/><br/> Když zničíte skrýš nebo mezipaměť munice, všechny související značky budou smazány.<br/><br/> <img image='\a3\data_f_argo\Logos\arma3_argo_artwork.jpg' width=362' height='512 />
+
+
+
+
+ Reputation
+ Reputacion
+ Ansehen
+ Reputação
+ 声誉
+ Réputation
+ Reputace
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>System:</marker><br/> At the beginning you have a very low reputation level, so civilians won't help you in revealing important information about the Oplitas, they will likely lie instead. Reputation can be ask to civilian. <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_picture_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Good actions:</marker><br/> Helping the local population by fighting the Oplitas, disarming IED's, heal civilians, put civilians killed by players in grave near church or chapel (50 m), give banana, remove tag with spraypaint, remove tag with spraypaint red, succeed side mission and destroy, cache/hideout will rise your reputation. <br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_4_co.paa' width='355' height='200' /> <br/><br/> <img image='\a3\Ui_f\data\GUI\Cfg\Debriefing\endDefault_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Bad actions:</marker><br/> Bad actions cause bad effects: killing civilians/animals surrounded or captive enemy, mutilating alive/dead civilians/animals, firing near civilians for no reason, firing to civilian car, remove wheels, remove banana, damaging/destroying buildings, breaking door lock, losing player's vehicles and player respawns will decrease your reputation. Aborting a side mission does not affect reputation. <br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_3_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_artwork.jpg' width='362' height='512' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> La reputación se puede solicitar a los civiles<br/> Las malas acciones causan malos efectos sobre la reputacion.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Ayudar a la población local luchando contra los Oplitas y desarmando los artefactos explosivos improvisados aumentará tu reputación; matar civiles, mutilar civiles vivos/muertos, disparar cerca de civiles sin razón alguna, disparar a vehículos civiles, dañar/destruir edificios, perder vehículos, respawns de jugadores disminuirá tu reputación. Al principio tienes un nivel de reputación muy bajo, por lo que los civiles no te ayudarán a revelar información importante sobre los Oplitas, es probable que mientan en su lugar.<br/> Abortar una misión secundaria no afecta a la reputación.
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> Ihr Ansehen bei der Bevölkerung können Sie bei Zivilisten erfragen <br/> Schlechte bzw. böse Handlungen habe zur Folge das ihr Ansehen sinkt. <br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Das Unterstützen der lokalen Bevölkerung, das Entschärfen von IEDs und der aktive Kampf gegen die Oplitas wird sich positiv auf ihr Ansehen auswirken. Negative Aktionen wie zb. das Töten oder verstümmeln von Zivlisten, das grundlose Abfeueren einer Waffe in der Nähe von Zivilisten, das Zerstören oder Beschädigen von Gebäuden, der Angriff auf zivile Fahrzeuge, der Verlust von Fahrzeugen im Allgemeinen oder das Respawnen haben hingegen einen nicht so guten Effekt. Zu Beginn ist Ihr Ansehen nur recht gering, weshalb es sein kann das Zivlisten eher zruückhaltend mit Informationen sind. In manchen Fällen werden die Zivilisten Sie auch einfach belügen.<br/> Das Abbrechen von Nebenaufgaben hat keine Auswirkung auf Ihr Ansehen.
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\talk_ca.paa' width='20' height='20'/> A Reputação entre a população é obtida por meio dos civis <br/> Ações ruins ou más fazem a reputação diminuir. <br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Ajudar a população local combatendo os inimigos e desarmando os IED's aumentará sua reputação. Matar civis, mutilar civis vivos/mortos, atirar perto de civis sem motivo, atirar nos veículos civis, danificar/destruir prédios, perder veículos civis, respawns de jogadores diminuirão a reputação. No começo, o nível de reputação é muito baixo, então, os civis não irão ajudá-lo a revelar informações importantes sobre os inimigos ou provavelmente irão mentir.<br/> Cancelar tarefas secundárias não afeta a reputação.
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>系统:</marker><br/> 在任务开始时, 你只有很低的声誉, 所以平民不会向你展示关于Oplitas的重要信息, 他们更倾向于说谎。可以通过询问平民来获知声誉状况。<br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_picture_ca.paa' width='20' height='20'/> <marker name='blufor_base'>善举:</marker><br/> 帮助当地居民反抗Oplitas, 拆除IED, 救助平民, 把香蕉送给平民, 使用红色喷漆去除涂鸦, 完成支线任务和摧毁武器箱/藏匿点将会提升你的声誉。<br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_4_co.paa' width='355' height='200' /> <br/><br/> <img image='\a3\Ui_f\data\GUI\Cfg\Debriefing\endDefault_ca.paa' width='20' height='20'/> <marker name='blufor_base'>恶行:</marker><br/> 恶行将会酿成恶果: 击杀或残害平民/动物, 毫无理由地向平民身边射击, 攻击平民车辆, 拆卸平民车辆的轮胎, 拿走平民的香蕉, 毁坏或摧毁建筑物, 损失我方载具和玩家重生均会降低声誉。中止支线任务不会影响声誉。<br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_3_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_artwork.jpg' width='362' height='512' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Système:</marker><br/> Au début, vous avez un niveau de réputation très bas, donc les civils ne vous aideront pas à révéler des informations importantes sur les Oplitas, ils mentiront probablement à la place. La réputation peut être demandée à des civils. <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_picture_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Bonnes actions:</marker><br/> Aider la population locale en combattant les Oplitas, en désarmant les engins piégés, en soignant les civils, donner une banane, en retirant le tag avec de la peinture rouge en spray, en réussissant la mission secondaire et en détruisant la cache d'arme / planque augmentera votre réputation. <br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_4_co.paa' width='355' height='200' /> <br/><br/> <img image='\a3\Ui_f\data\GUI\Cfg\Debriefing\endDefault_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Mauvaises actions:</marker><br/> Les mauvaises actions provoquent de mauvais effets: tuer des civils / animaux, mutiler des civils / animaux vivants / morts, tirer à proximité de civils sans raison, tirer sur une voiture civile, retirer les roues, retirer une banane, endommager / détruire des bâtiments, casser les serrures des portes, perdre les véhicules des joueurs et la réapparition des joueurs diminuera votre réputation. L'annulation d'une mission secondaire n'affecte pas la réputation. <br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_3_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_artwork.jpg' width='362' height='512' />
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>System:</marker><br/> Na začátku máte velmi nízkou úroveň reputace, takže vám civilisté nepomohou prozradit důležité informace o Oplitas, ale pravděpodobně budou místo toho lhát. Reputaci lze požádat civilisty.<br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_picture_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dobré akce:</marker><br/> Pomoc místnímu obyvatelstvu bojem s Oplitas, odzbrojením IED, léčením civilistů, darováním banánu, odstraněním štítku sprejem, odstraněním štítku červeným sprejem, úspěšnou vedlejší misí a zničením cache/úkrytu zvýší vaši reputaci.<br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_4_co.paa' width='355' height='200' /> <br/><br/> <img image='\a3\Ui_f\data\GUI\Cfg\Debriefing\endDefault_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Bad actions:</marker><br/> Špatné akce mají špatné účinky: zabíjení civilistů/zvířat, mrzačení živých/mrtvých civilistů/zvířat, střelba v blízkosti civilistů bez důvodu, střelba do civilního auta, odstranění kol, odstranění banánu, poškození/zničení budov, rozbití zámku dveří, ztráta hráčských vozidel a respawny hráčů sníží vaši reputaci. Zrušení vedlejší mise nemá vliv na pověst. <br/><br/> <img image='\a3\missions_f_orange\Data\Img\AAN\aan_3_3_co.paa' width='355' height='200'/> <br/><br/> <img image='\A3\Data_F_Orange\Logos\arma3_orange_artwork.jpg' width='362' height='512' />
+
+
+
+
+ Any player can give orders to civilians.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> To do this, just open your self interaction menu and select 'ORDERS' or use one of the shortcuts. Shortcuts can changed under 'configure' >> 'controls' >> 'configure addons' >> 'Hearts and Minds: Mission' (drop down menu).<br/> Your options are:<br/> - STOP<br/> - GET DOWN<br/> - GO AWAY<br/><br/> If you want to give an order to just one unit, interact with it (ace object interaction).<br/> You can also use a horn to ask civilians to stop their movement from a vehicle. Turning ON beacons or siren will continuously ask civilians to let you pass first. Combining beacons and siren will increase the range of effectiveness.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> You can also drop leaflets to ask all civilians in a circle of 200m to evacuate to a religious building (if not available a safe area) with a AR-2 drone.<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ Cualquier jugador puede dar órdenes a civiles.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Para ello, sólo tienes que abrir el menú de auto-interacción y seleccionar `ORDENES' o utilizar uno de los accesos directos. Los accesos directos pueden cambiarse en 'configuración'. >> 'controls' >> 'configure addons' >> 'Hearts and Minds: Mission' (menu desplegable).<br/> Tus opciones son:<br/> - ALTO<br/> - AGACHATE<br/> - FUERA DE AQUI<br/><br/> Si quieres dar una orden a una sola unidad, interactúa con ella (ace object interaction).<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> También puede tirar panfletos para pedir a todos los civiles en un círculo de 200 metros que evacuen a un edificio religioso (si no está disponible un área segura) con un drone<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ Jeder Spieler kann einem Zivlisten Anweisungen geben.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Dies geht recht einfach in dem man das Eigen-Interaktionsmenü öffnet und dann 'BEFEHLE(ZIVILISTEN)' auswählt. Oder in dem man Kurztasten nutzt. Diese können unter 'Konfigurieren' >> 'Steuerung' >> 'Modifikationen anpassen' >> Hearts and Minds: Mission' (Drop-Down-Menü) geändert werden.<br/><br/> Folgende Optionen stehen zur Verfügung:<br/> - STOPP!<br/> - AUF DEN BODEN!<br/> - GEH WEG!<br/><br/> Wenn Sie einen Befehl an eine bestimmte Person geben wollen, so können Sie auch direkt mir dieser Interagieren (ACE Objekt-Interaction).<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Sie können mithilfe einer Drohne Broschüren abwerfen, um die Zivilisten im Umkreis von ca. 200 m aufzufordern, sich in dem nächsten religiösen Gebäude einzufinden (sollte kein Gebäude vorhanden sein, so wird ein sicherer Bereich festgelegt).<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ Qualquer jogador pode dar instruções a um civil.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Para fazer isso, basta abrir o menu de interação do civil e selecionar a opção "ORDENS" ou usar tecla de atalho. Atalhos podem ser alterados no menu "CONFIGURAÇÃO" >> "CONTROLES" >> "CONFIGURAR COMPLEMENTOS (ADDONS)" >> Corações e Mentes: Missão (Menu suspenso).<br/><br/> As seguintes opções estão disponíveis: <br/> - PARE!<br/> - DEITADO!<br/> - VÁ EMBORA!<br/><br/> Se você quiser dar uma ordem para apenas uma unidade, interaja com ela (interação do objeto ACE).<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Você pode usar um drone para soltar panfletos solicitando que civis, dentro de um raio de 200m, se abriguem em um prédio religioso mais próximo (se não houver prédio, uma área segura será definida).<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ 任何玩家都可以向平民发出指令。<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> 如要向平民发出指令, 只需打开自我互动菜单并选择"命令平民", 或使用已设定的快捷键即可。快捷键可以在"设置" >> "控制设定" >> "模组设定选项" >> "Hearts and Minds: Mission"(下拉菜单) 中进行变更。<br/> 可以使用的命令如下:<br/> - 站住<br/> - 趴下<br/> - 走开<br/><br/> 如果你希望只对某个单位发出指令, 与该单位进行互动即可(ACE物体互动)。<br/> 你也可以在载具中使用喇叭让平民停止移动。开启警灯或警报器会不断地告诉平民让你优先通行。同时使用警灯和警报器可以提升效果范围。<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> 你也可以使用 AR-2 无人机投放传单, 要求200米范围内的平民疏散至最近的宗教建筑避难(若无宗教建筑, 则前往安全区域)。<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ Tous les joueurs peuvent donner des ordres aux civils.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> pour ce faire, ouvrez simplement votre menu d'auto-interaction et sélectionnez «COMMANDES» ou utilisez l'un des raccourcis. Les raccourcis peuvent être modifiés sous «configurer» >> 'contrôles' >> 'configure addons' >> 'Hearts and Minds: Mission' (drop down menu).<br/> Les options sont:<br/> - HALTE<br/> - A TERRE<br/> - PARTEZ<br/><br/> Si vous voulez donner l'ordre à un seul civil, alors utilisez l'interaction ACE sur celui-ci.<br/> Vous pouvez aussi utiliser un klaxon pour demander aux civils de se stopper depuis un véhicule. En activant les gyrophares ou une sirène, les civiles vont vous céder le passage. Le rayon d'efficacité augmente en combinant les gyrophares et la sirène.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Vous pouvez également déposer des tracts pour demander à tous les civils dans un cercle de 200m d'évacuer vers un édifice religieux (sinon dans une zone de sécurité) avec un drone AR-2.<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+ Každý hráč může dávat rozkazy civilistům.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\interact_ca.paa' width='20' height='20'/> Chcete-li to provést, stačí otevřít nabídku vlastní interakce a vybrat 'Občanské řády' nebo použít jednu ze zkratek. Zkratky lze změnit dejte 'ESC' pak 'NASTAVENÍ' >> 'OVLÁDÁNÍ' >> 'KONFIGUROVAT ADDONY' >> 'Hearts and Minds: Mission' (drop down menu).<br/> Vaše možnosti jsou:<br/> - STOP<br/> - K ZEMI<br/> - ODEJÍT<br/><br/> Pokud chcete dát rozkaz pouze jedné jednotce, interagujte s ní (součást ace objektu).<br/> Můžete také použít klakson a požádat civilisty, aby zastavili svůj pohyb z vozidla. Zapnutím majáků nebo sirény budete neustále žádat civilisty, aby vás nechali projít jako první. Kombinace majáků a sirén zvýší rozsah účinnosti.<br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> Můžete také zahodit letáky a požádat všechny civilisty v okruhu 200 m, aby se pomocí dronu AR-2 evakuovali do náboženské budovy (pokud není k dispozici bezpečná oblast).<br/><br/> <img image='\a3\missions_f_orange\Data\Img\orange_leaflets_overview_ca.paa' width='355' height='200'/>
+
+
+
+
+ Traffic
+ Trafico
+ Straßenverkehr
+ Trânsito
+ 交通
+ Circulation
+ Provoz
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Civilians are travelling by vehicle across cities. If your reputation is higher than normal, you can ask for a lift to a location chosen on the map. If you bump into a Oplitas patrol, don't worry, the civilian driver will do their best to hide you in the car.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Los civiles viajan en vehículo a través de las ciudades. Si tu reputación es más alta de lo normal, puedes pedir que te lleven a un lugar elegido en el mapa. Si te encuentras con una patrulla de Oplitas, no te preocupes, el conductor civil hará todo lo posible para esconderte en el coche.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Zivlisten sind mit Fahrzeugen in den Städten unterwegs. Wenn Sie ein hohes Ansehen in der Bevölkerung genießen, so sind Zivlisten auch gerne mal dazu bereit Sie mitzunehmen (nutzen sie die Karte um den Zivlisten zu zeigen wo sie hinwollen). Sollten Sie dabei durch Zufall auf Feinde stoßen, so wird der Zivilist sein Bestes geben um sie im Fahrzeug zu verstecken.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Civis estarão viajando de veículo pelo mapa, entre uma cidade e outra. Se sua reputação com a população local for alta, eles estarão dispostos a levá-lo a qualuqer lugar do mapa (use o mapa para mostrar onde você quer ir). Se vocês encontrarem uma patrulha inimiga, o civil fará todo possível para te esconder no veículo.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> 平民会在城市间开车穿梭。如果你的声誉够高, 平民会乐意载你一程(用地图指出你要去的地方)。如果你在途中遭遇了Oplitas巡逻队, 不要担心, 平民会尽其所能地把你藏在车里。<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Les civils se déplacent de ville en ville en véhicule. Si votre réputation est supérieure à "normal", vous pouvez lui demander de vous servir de taxi. Si en cours de route des ennemis sont présents, ne paniquez pas, votre conducteur fera en sorte de vous cacher du mieux possible.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <img image='\A3\soft_f_gamma\van_01\Data\UI\map_van_01_box_CA.paa' width='20' height='20'/> Civilisté cestují autem napříč městy. Pokud je vaše reputace vyšší než obvykle, můžete požádat o odvoz na místo vybrané na mapě. Pokud narazíte na hlídku Oplitasu, nebojte se, civilní řidič udělá maximum, aby vás ukryl v autě.<br/><br/> <img image='\A3\Data_F_Argo\Images\AssetMaldenTerrain_co.paa' width='355' height='200'/>
+
+
+
+
+ Chemical Warfare
+ Chemische Kriegsführung
+ 化学战
+ Guerre chimique
+ Chemická válka
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Chemical agent:</marker><br/> A chemical agent can be found in the battlefield at cache location for example. When an object is contaminated, the chemical agent propagates to people around (in a circle of 3m). Those people will be hurt constantly and get pain until they died or found a decontaminating shower (available at the logistic point) to clean up their body. When they are contaminated, they can propagate it to other people around (in a circle of 2m) or vehicle if they get inside. Keep in mind, dead body stay contaminated but body bag will isolate it. Also, a contaminated object loaded as cargo will contaminate the container or vehicle. <img image='\a3\Data_F_Enoch\Images\CBRNObjects_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Protection:</marker><br/> Use CBRN gear (uniform, respirator mask and breather backpack) for full protection from the contamination effect. But, don't forget to take a shower for more than 5s before removing your CBRN gear. Be aware, even with a CBRN equipment you can propagate the agent to people or vehicle, you are just protected from the effect. <img image='\a3\Data_F_Enoch\Images\CBRNSuit_ca.paa' width='355' height='200'/> <br/><br/> Simple mask and simple uniform can reduce from 65% to 80% the probability to take damage. The pain from breathing while contaminated can be avoid with a simple mask. <img image='\A3\Data_F_Orange\Images\Respirator_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Decontaminate:</marker><br/> You can use a small shower to decontaminate units only. Use the big shower for objects, vehicles and objects loaded as cargo. To activate them, just stay under the shower. <img image='\A3\EditorPreviews_F_Enoch\Data\CfgVehicles\DeconShower_01_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detection:</marker><br/> You can analyze an object, vehicle or man with ED-1E drone to determine if it is contaminated (Note: The drone will never be contaminated.). You can also check if you are in a contaminated area by using a chemical detector (THREAT from 0.1 to 0.9: contaminated objects are around, THREAT at 1: you are in the propagating range (you will be contaminated)). <img image='\a3\Data_F_Enoch\Images\ChemicalDetector_ca.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Chemische Wirk- bzw. Kampfstoffe:</marker><br/> Chemische Wirk- bzw. Kampfstoffe werden immer mal wieder im Einsatz, zum Beispiel bei den Waffenkisten, gefunden. Wenn ein Objekt kontaminiert ist, dann verbreitet sich der chemische Wirkstoff auf Personen in der näheren Umgebung (in ein Umkreis von ca. 3m). Personen, welche sich ungeschützt einem solchen Objekt nähern, werden kontaminiert und erleiden Schaden, bis Sie sterben. Man kann sich mir Hilfe einer Dekontaminationsdusche (am Logistikpunkt erhältlich) von diesem Effekt befreien. Die Kontaminierung von Personen kann untereinander weitergegeben werden, wenn man nicht aufpasst (in einem Umkreis von ca. 2m). Das gilt auch für die Innenräume von Fahrzeugen. Denken Sie daran, dass Leichen kontaminiert bleiben, die Leichensäcke diese jedoch isolieren. Kontaminierte Objekte können beim Verladen auch den Container und das Fahrzeug verseuchen. <img image='\a3\Data_F_Enoch\Images\CBRNObjects_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Schutz:</marker><br/> Verwenden Sie CBRN-Ausrüstung (auch ABC-Ausrüstung genannt, bestehend aus Uniform, Maske und Atemgerät), um sich vor Kontamination zu schützen. Vor dem ablegen der CBRN-Ausrüstung ist es wichtig, mindestens 5 Sekunden zu duschen, um sämtliche Verseuchungen zu entfernen. Beachten Sie, dass die CBRN-Ausrüstung nur Sie selbst vor den chemischen Kampfstoffen schütz. Sie können weiterhin andere Personen und Fahrzeuge kontaminieren. <img image='\a3\Data_F_Enoch\Images\CBRNSuit_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dekontaminierung:</marker><br/> Mit der kleinen Dekontaminationsdusche können Sie nur Personen dekontaminieren. Verwenden Sie die große Dusche für Objekte, Fahrzeuge und den Ladenraum von Fahrzeugen (oder Containern). Um die Duschen zu aktivieren, stellen Sie sich einfach darunter. <img image='\A3\EditorPreviews_F_Enoch\Data\CfgVehicles\DeconShower_01_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Erkennung:</marker><br/> Sie können ein Objekt, Fahrzeug oder eine Person mit einer ED-1E-Drohne analysieren, um festzustellen, ob es kontaminiert ist (Hinweis: Die Drohne wird niemals von einer Kontamination betroffen sein). Ebenso können Sie einen Chemischen Detektor nutzen um feststellen wie stark der nähere Bereich um Sie herum kontaminiert ist. (THREAT von 0.1 bis 0.9: kontaminierte Gegenstände sind in der Nähe, THREAT von 1: Sie befinden sich in einen verseuchten Bereich (Sie sind somit selbst kontaminiert)). <img image='\a3\Data_F_Enoch\Images\ChemicalDetector_ca.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa' width='20' height='20'/> <marker name='blufor_base'>化学试剂:</marker><br/> 化学试剂会在战场上的武器箱等位置出现。当一个物体受到污染时, 这种化学试剂会传播它到周围的人身上(3米范围内)。感染者将持续受到伤害并感到疼痛, 直至死亡, 或找到一个净化淋浴(位于在后勤点)来清理他们的身体。当这些人受到污染时, 他们会将污染传播给周围的其他人(2米范围内)或车辆(如果他们进入车辆的话)。记住, 尸体将保持受到污染的状态, 但尸体袋可以将其隔离。此外, 作为货物装载受污染物体将会污染集装箱或车辆。<img image='\a3\Data_F_Enoch\Images\CBRNObjects_ca.paa' width='355' height='200'/><br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>防护措施:</marker><br/> 使用CBRN(生化核辐)装备(服装、口罩、面具和呼吸器背包)可以保护您完全免受污染影响。但是, 在取下CBRN装备之前, 不要忘记进行至少5秒的净化淋浴。请注意, 即使穿戴了CBRN装备, 您也会向人员或车辆传播化学试剂, 只有你免受污染影响。普通的面具和制服会将受到伤害的可能性减免60%至80%。<img image='\a3\Data_F_Enoch\Images\CBRNSuit_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa' width='20' height='20'/> <marker name='blufor_base'>清除污染:</marker><br/> 小型淋浴器只能用来净化单兵单位。使用大型淋浴器来清洗物品、车辆和货物。要激活净化过程, 只需待在淋浴下即可。<img image='\A3\EditorPreviews_F_Enoch\Data\CfgVehicles\DeconShower_01_F.jpg' width='355' height='200'/><br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>检测:</marker><br/> 你可以使用 ED-1E 无人机分析物体、车辆或人, 以测定其是否受到污染(注: 该无人机永远不会受到污染)。您也可以使用化学探测器检测您是否处于污染区域内(威胁度介于0.1至0.9之间: 附近存在受污染物体, 威胁度等于1: 您处于传播区域内(您将受到污染))。<img image='\a3\Data_F_Enoch\Images\ChemicalDetector_ca.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Agent chimique:</marker><br/> Un agent chimique peut être trouvé sur le champ de bataille à l'emplacement d'une cache d'arme, par exemple. Lorsqu'un objet est contaminé, l'agent chimique se propage aux personnes autour (dans un cercle de 3 m). Ces personnes seront constamment blessées jusqu'à ce qu'elles meurent ou trouvent une douche décontaminante (disponible au point logistique) pour nettoyer leur corps. Lorsqu'ils sont contaminés, ils peuvent le propager à d'autres personnes autour (dans un cercle de 2 m) ou à un véhicule s'ils pénètrent à l'intérieur. Gardez à l'esprit que les cadavres restent contaminés, mais le sac mortuaire l'isolera. De plus, un objet contaminé placé dans la cargaison d'un conteneur ou d'un véhicule le contaminera. <img image='\a3\Data_F_Enoch\Images\CBRNObjects_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Protection:</marker><br/> Utilisez un équipement CBRN (uniforme, masque respiratoire et sac à dos) pour une protection complète contre l'effet de contamination. Mais n'oubliez pas de prendre une douche pendant plus de 5 secondes avant de retirer votre équipement CBRN. Sachez que même avec un équipement CBRN, vous pouvez propager l'agent à des personnes ou à un véhicule, vous êtes simplement protégé de l'effet. <img image='\a3\Data_F_Enoch\Images\CBRNSuit_ca.paa' width='355' height='200'/> <br/><br/> Un masque simple et un uniforme simple peuvent réduire de 65% à 80% la probabilité de subir des dommages.<img image='\A3\Data_F_Orange\Images\Respirator_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Décontaminer:</marker><br/> Vous pouvez utiliser une petite douche uniquement pour décontaminer les unités. Utilisez la grande douche pour les objets, les véhicules et les objets chargés comme cargaison. Pour les activer, il suffit de rester sous la douche. <img image='\A3\EditorPreviews_F_Enoch\Data\CfgVehicles\DeconShower_01_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Détection:</marker><br/> Vous pouvez analyser un objet, un véhicule ou un homme avec un drone ED-1E pour déterminer s'il est contaminé (Remarque: le drone ne sera jamais contaminé.). Vous pouvez également vérifier si vous vous trouvez dans une zone contaminée en utilisant un détecteur chimique (THREAT de 0,1 à 0,9: les objets contaminés sont aux alentours, THREAT à 1: vous êtes dans la plage de propagation (vous serez contaminé)). <img image='\a3\Data_F_Enoch\Images\ChemicalDetector_ca.paa' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\danger_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Chemický detektor:</marker><br/> Chemický prostředek lze nalézt například na bojišti v místě mezipaměti. Když je předmět kontaminován, chemický prostředek se šíří k lidem v okolí (v okruhu 3 m). Tito lidé budou neustále zraněni a budou pociťovat bolest, dokud nezemřou nebo nenajdou dekontaminační sprchu (k dispozici na logistickém místě), aby si očistili tělo. Když jsou kontaminováni, mohou to šířit na další lidi v okolí (v okruhu 2 m) nebo vozidlo, pokud se dostanou dovnitř. Mějte na paměti, že mrtvé tělo zůstane kontaminované, ale vak na tělo ho izoluje. Kontejner nebo vozidlo také kontaminuje kontaminovaný předmět naložený jako náklad.<img image='\a3\Data_F_Enoch\Images\CBRNObjects_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Ochrana:</marker><br/> Pro plnou ochranu před účinkem kontaminace používejte CBRN vybavení (uniformu, respirátorovou masku a dýchací batoh). Nezapomeňte se však před odstraněním CBRN vybavení sprchovat déle než 5 sekund. Uvědomte si, že i pomocí CBRN zařízení můžete šířit agenta mezi lidmi nebo vozidly, jste pouze chráněni před účinkem.<img image='\a3\Data_F_Enoch\Images\CBRNSuit_ca.paa' width='355' height='200'/> <br/><br/> Jednoduchá maska a jednoduchá uniforma mohou snížit pravděpodobnost poškození z 65 % na 80 %. Bolest z dýchání při kontaminaci lze předejít jednoduchou maskou.<img image='\A3\Data_F_Orange\Images\Respirator_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\box_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Dekontaminovat:</marker><br/> K dekontaminaci jednotek můžete použít pouze malou sprchu. Použijte velkou sprchu pro předměty, vozidla a předměty naložené jako náklad. Chcete-li je aktivovat, stačí zůstat pod sprchou.<img image='\A3\EditorPreviews_F_Enoch\Data\CfgVehicles\DeconShower_01_F.jpg' width='355' height='200'/> <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detekce:</marker><br/> Pomocí dronu ED-1E můžete analyzovat objekt, vozidlo nebo člověka, abyste zjistili, zda je kontaminován (Poznámka: Dron nebude nikdy kontaminován.). Můžete také zkontrolovat, zda se nacházíte v kontaminované oblasti pomocí chemického detektoru (HROZBA od 0,1 do 0,9: kontaminované předměty jsou kolem, HROZBA na 1: jste v oblasti šíření (budete kontaminováni)). <img image='\a3\Data_F_Enoch\Images\ChemicalDetector_ca.paa' width='355' height='200'/>
+
+
+
+
+ Spectrum devices
+ Spectrum Gerät
+ 频谱探测仪
+ Appareils à spectre
+ Spektrální zařízení
+
+
+ <img image='\A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Electromagnetic field:</marker><br/> There are two types of electromagnetic field from UAV or electromagnetic pulse (EMP). UAV emit electromagnetic field from 390MHz to 500MHz due to device transmission. Electromagnetic pulse are used as weapon to create electronic failure to vehicles. The range of frequency is from 78MHz to 89MHz and is powerfull enough to turn off light, engine and avionic devices. <img image='\A3\Data_F_Mark\Images\watermarkInfo_page14_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Protection:</marker><br/> Electromagnetic field from UAV are safe but EMP have a range of 500m where vehicles with engine turn ON will be affected. <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detection:</marker><br/> You can detect the origin of electromagnetic field with spectrum devices. The amplitude of the peak depend on the distance and angle between the emiter and the antenna. The maximum range is 1000m. <img image='\a3\Data_F_Enoch\Images\SpectrumDevice_ca.paa' width='355' height='200'/>
+ <img image='\A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Elektromagnetisches Feld:</marker><br/> Es gibt zwei Arten von elektromagnetischen Strahlungen: von UAV's oder Elektromagnetischen Impulsen (EMP). UAV strahlen im Bereich von 390MHz bis 500MHz. Elektromagnetischer Impuls wird als Waffe genutzt und erzeugt Impulse, welche elektrische Komponenten beschädigen. Die Frequenz von EMP strahlt im Bereich von 78MHz bis 89MHz und ist stark genug, Licht, Motoren und Fluggeräte zu stören. <img image='\A3\Data_F_Mark\Images\watermarkInfo_page14_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Schutz:</marker><br/> Strahlung von UAVs stellen keine Gefahr da, aber EMPs beschädigen Fahrzeuge mit eingeschaltetem Motor im Umkreis von 500 Metern. <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Erkennung:</marker><br/> Du kannst die Quelle von Strahlung mit dem Spectrum Gerät erkennen. Die Ausschläge der Messung sind abhängig von der Distanz und dem Winkel zwischen der Quelle und der Antenne des Spectrum Gerätes. Die maximale Entfernung beträgt 1000 Meter. <img image='\a3\Data_F_Enoch\Images\SpectrumDevice_ca.paa' width='355' height='200'/>
+ <img image='\A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>电磁场:</marker><br/> UAV 和电磁脉冲装置(EMP)会产生两种不同的电磁场。为了传输信号, UAV 会发出频率在 390MHz 到 500MHz 之间的电磁场。电磁脉冲装置是一种能使载具上的电子设备失效的武器。它的频率范围在 78MHz 到 89MHz 之间, 其能量足以使电灯、引擎和航空电子设备实效。<img image='\A3\Data_F_Mark\Images\watermarkInfo_page14_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>防护:</marker><br/> UAV 产生的电磁场是安全的, 但电磁脉冲装置将会影响500米范围内引擎开启的载具。<br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>探测:</marker><br/> 你可以使用频谱探测仪来探测电磁场的源头。波形的峰值取决于发射器与天线之间的距离和角度。最大探测距离为1000米。<img image='\a3\Data_F_Enoch\Images\SpectrumDevice_ca.paa' width='355' height='200'/>
+ <img image='\A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Champ électromagnétique:</marker><br/>Il existe deux types de champ électromagnétique provenant d'un UAV ou d'une impulsion électromagnétique (EMP). Les drones émettent un champ électromagnétique de 390 MHz à 500 MHz en raison de la transmission de l'appareil. Les impulsions électromagnétiques sont utilisées comme arme pour créer une défaillance électronique des véhicules. La gamme de fréquences va de 78 MHz à 89 MHz et est suffisamment puissante pour éteindre la lumière, le moteur et les appareils avioniques. <img image='\A3\Data_F_Mark\Images\watermarkInfo_page14_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Protection:</marker><br/>Les champs électromagnétiques des drones sont inoffensifs, mais les EMP affectent le moteur des véhicules dans un rayon de 500 m. <br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Détection:</marker><br/> Vous pouvez détecter l'origine du champ électromagnétique avec des appareils spectraux. L'amplitude du pic dépend de la distance et de l'angle entre l'émetteur et l'antenne. La portée maximale est de 1000 m. <img image='\a3\Data_F_Enoch\Images\SpectrumDevice_ca.paa' width='355' height='200'/>
+ <img image='\A3\Data_F_Enoch\Logos\arma3_enoch_logo_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Elektromagnetické pole:</marker><br/> Existují dva typy elektromagnetického pole z UAV nebo elektromagnetického pulzu (EMP). UAV emituje elektromagnetické pole od 390MHz do 500MHz kvůli přenosu zařízení. Elektromagnetický impuls se používá jako zbraň k vytvoření elektronického selhání vozidel. Frekvenční rozsah je od 78MHz do 89MHz a je dostatečně výkonný pro vypnutí světla, motoru a avionických zařízení. <img image='\A3\Data_F_Mark\Images\watermarkInfo_page14_ca.paa' width='355' height='200'/> <br/><br/> <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Ochrana:</marker><br/> Elektromagnetické pole z UAV je bezpečné, ale EMP má dosah 500 m, kde budou ovlivněna vozidla se zapnutým motorem.<br/><br/> <img image='\z\ace\addons\minedetector\ui\icon_mineDetectorOn.paa' width='20' height='20'/> <marker name='blufor_base'>Detekce:</marker><br/> Pomocí spektrálních zařízení můžete zjistit původ elektromagnetického pole. Amplituda vrcholu závisí na vzdálenosti a úhlu mezi vysílačem a anténou. Maximální dosah je 1000m. <img image='\a3\Data_F_Enoch\Images\SpectrumDevice_ca.paa' width='355' height='200'/>
+
+
+
+
+ Door locked
+ Verschlossene Türen
+ Porte verrouillée
+ 上锁的门
+ Zamčené dveře
+
+
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>House doors:</marker><br/> Civilian house door can be close. Depend on reputation level, civilian will lock their door and stay inside. Under low, all doors are locked, above normal, all door are unlocked. <br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Break locked door:</marker><br/> You can still enter by breaking door lock with a wirecutter. <img image='\z\ace\addons\logistics_wirecutter\ui\item_wirecutter_ca.paa' width='355' height='200'/> <br/><br/> Or by using explosive. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\Claymore_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Haustüren:</marker><br/> Türen von Häusern können geschlossen sein. Abhängig von der Reputation werden Zivilisten sich in ihren Häusern aufhalten und die Türen verschließen. Wenn Reputation ist unter Niedrig, alle Türen sind verschlossen, wenn über Normal, alle Türen sind offen. <br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Verschlossene Türen aufbrechen:</marker><br/> Du kannst verschlossene Türen mit dem Kabelschneider öffnen. <img image='\z\ace\addons\logistics_wirecutter\ui\item_wirecutter_ca.paa' width='355' height='200'/> Oder aufgesprengt werden. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\Claymore_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>屋门:</marker><br/> 平民居住的房屋可能会锁门。基于声誉水平, 平民将会锁上他们的屋门并待在屋里。在声誉低时, 所有屋门均会上锁, 在声誉一般时, 所有屋门均不会上锁。<br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' width='20' height='20'/> <marker name='blufor_base'>撬锁:</marker><br/> 你仍然可以使用剪线钳来撬锁, 从而进入房屋。<img image='\z\ace\addons\logistics_wirecutter\ui\item_wirecutter_ca.paa' width='355' height='200'/> 也可以使用炸药破门。 <img image='\A3\EditorPreviews_F\Data\CfgVehicles\Claymore_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>House doors:</marker><br/> Dveře civilního domu lze zavřít. V závislosti na úrovni reputace civilista zamkne dveře a zůstane uvnitř. Při nízkém jsou všechny dveře zamčené, nad normálem jsou všechny dveře odemčené. <br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Rozbijte zamčené dveře:</marker><br/> Stále můžete vstoupit rozbitím zámku dveří velkými kleštěmi. <img image='\z\ace\addons\logistics_wirecutter\ui\item_wirecutter_ca.paa' width='355' height='200'/> Nebo pomocí výbušniny. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\Claymore_F.jpg' width='355' height='200'/>
+ <img image='\A3\ui_f\data\igui\cfg\simpleTasks\types\meet_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Portes:</marker><br/> Les portes des maisons civiles peuvent être fermées. Selon le niveau de réputation, le civil verrouillera sa porte et restera à l’intérieur. En réputation basse, toutes les portes sont verrouillées, au-dessus de normale, toutes les portes sont déverrouillées. <br/><br/> <img image='\A3\Ui_f\data\IGUI\Cfg\Actions\open_door_ca.paa' width='20' height='20'/> <marker name='blufor_base'>Porte verrouillée:</marker><br/> Vous pouvez toujours entrer en cassant la serrure avec une pince coupante. <img image='\z\ace\addons\logistics_wirecutter\ui\item_wirecutter_ca.paa' width='355' height='200'/> <br/><br/> Ou en utilisant des explosifs. <img image='\A3\EditorPreviews_F\Data\CfgVehicles\Claymore_F.jpg' width='355' height='200'/>
+
+
+
+
+
+
+ << Time options >>
+ << Zeiteinstellungen >>
+ << Configurações de Tempo >>
+ << 时间设置 >>
+ << Options de temps >>
+ << Časové možnosti >>
+
+
+
+
+ << Server management >>
+ << Gestion du serveur >>
+
+
+ Load the savegame (if available)
+ Spielstand wird geladen (wenn verfügbar)
+ Carregar o savegame (se disponível)
+ 载入存档 (如果可用)
+ Chargez la sauvegarde (si disponible)
+ Načtěte uloženou hru (pokud je k dispozici)
+
+
+ Auto savegame when all players disconnected
+ Spiel wird automatisch Gespeichert, wenn alle Spieler das Spiel verlassen
+ 所有玩家离线后自动存档
+ Sauvegarde automatique lorsque tous les joueurs sont déconnectés
+ Automatické ukládání hry, když se všichni hráči odpojí
+
+
+ Auto restart/shutdown server (Must define in server.cfg: serverCommandPassword = "btc_password")
+ Automatischer Neustart / herunterfahren des Servers (In der server.cfg: serverCommandPassword = "btc_password")
+ 自动重启/关闭服务器(必须在server.cfg中定义: serverCommandPassword = "btc_password")
+ Redémarrage / arrêt automatique du serveur (Doit être défini dans server.cfg: serverCommandPassword = "btc_password")
+ Automatické restartování/vypnutí serveru (Musí definovat v server.cfg: serverCommandPassword = "btc_password")
+
+
+ Shutdown
+ Herunterfahren
+ 关闭
+ Arrêt
+ Vypnout
+
+
+ Save and restart
+ Speichern und neustarten
+ 保存并重启
+ Enregistrer et redémarrer
+ Uložit a restartovat
+
+
+ Save and shutdown
+ Speichern und herunterfahren
+ 保存并关闭
+ Enregistrer et arrêter le serveur
+ Uložit a vypnout
+
+
+ Time before auto restart/shutdown server
+ Zeit, bevor Server automatisch neugestartet / heruntergefahren wird
+ 自动重启/关闭服务器前的时间
+ Temps avant le redémarrage / arrêt automatique du serveur
+ Čas před automatickým restartem/vypnutím serveru
+
+
+ Hour of auto restart/shutdown server
+ Heure de l'auto restart/arrêt du serveur
+
+
+
+
+ << Faction options >>
+ << Fraktion Einstellungen >>
+ << Configurações de Facção >>
+ << 阵营设置 >>
+ << Option de faction >>
+ << Možnosti frakce >>
+
+
+ Enemy type:
+ Feindliche Einheiten:
+ Tipos de Inimigos:
+ 敌方类型:
+ Type d'ennemies:
+ Typ nepřítele:
+
+
+ Anti-Air infantry:
+ feindl. Fliegerabwehrtruppen:
+ Forças de defesa aérea inimigas:
+ 敌方防空部队:
+ Infanterie anti-aérienne:
+ Protiletecká pěchota:
+
+
+ Enemy uses Tank:
+ feindl. Panzer:
+ Tanques inimigos:
+ 敌方装甲部队:
+ L'ennemi utilise des Tank:
+ Nepřítel používá Tank:
+
+
+ Civil type:
+ Zivile Einheiten:
+ Tipos de Civis:
+ 平民类型:
+ Type de civil:
+ Civilní typ:
+
+
+ Civil vehicle type:
+ Fahrzeuge der Zivilen Einheite:
+ Tipos de Veículos Civis:
+ 平民载具类型:
+ Type de véhicule civil:
+ Typ civilního vozidla:
+
+
+
+
+ << Spawn options >>
+ Spawn Einstellungen:
+ << 重生设置 >>
+ << Opções de Spawn >>
+ << Options de spawn >>
+ << Spawn možnosti >>
+
+
+ Density of occupied city:
+ Density of occupied city:
+ 被敌军占领城市的密度:
+ Densité de villes occupées:
+ Hustota obsazeného města:
+
+
+ Enemy density:
+ Feinddichte:
+ 敌军密度:
+ Densidade inimiga:
+ Densité des énnemies:
+ Hustota nepřátel:
+
+
+ Enemy static density:
+ 敌军固定式武器密度:
+ Densité des armes statiques ennemies:
+ Statická hustota nepřítele:
+
+
+ Civilian density:
+ Zivilistendichte:
+ 平民密度:
+ Densidade civil:
+ Densité des civil:
+ Civilní hustota:
+
+
+ Animal density:
+ 动物密度:
+ Densité des animaux:
+ Hustota zvířat:
+
+
+ Density of military in house:
+ Feinddichte in Gebäuden:
+ 建筑物中的敌军密度:
+ Densidade de militares em construções:
+ Densité des ennemies dans les maisons:
+ Hustota armády v domě:
+
+
+ Add armed vehicles in Hideout:
+ Gepanzerte Fahrzeuge bei den Verstecken:
+ Veículos blindados no esconderijo:
+ 藏匿点包含装甲载具:
+ Ajouter des véhicules armés dans les planques:
+ Přidejte ozbrojená vozidla do úkrytu:
+
+
+ Add armed vehicles in Side mission/Cache:
+ Gepanzerte Fahrzeuge bei den Nebenmissionen/ Waffenlagern:
+ Adicione veículos blindados/arsenal em missões secundárias:
+ 支线任务/武器箱包含装甲载具:
+ Ajouter des véhicules armés dans les missions secondaires / les caches d'armes:
+ Přidejte ozbrojená vozidla do vedlejší mise/mezipaměti:
+
+
+ Maximum number of military patrol:
+ Maximale Anzahl feindl. Patrouillen:
+ 敌方巡逻队数量上限:
+ Número máximo de patrulhas militares:
+ Nombre maximum de patrouilles militaires:
+ Maximální počet vojenských hlídek:
+
+
+ Maximum number of civilian patrol:
+ Maximale Anzahl an ziviler Fahrzeuge:
+ 民用车辆数量上限:
+ Número máximo de patrulhas civis:
+ Nombre maximum de patrouilles civiles:
+ Maximální počet civilních hlídek:
+
+
+
+
+ << IED options >>
+ << IED Einstellungen >>
+ << Opções de IED >>
+ << IED 设置 >>
+ << Options des EEI >>
+ << Možnosti IED >>
+
+
+ IEDs ratio:
+ IED Wahrscheinlichkeit:
+ Probabilidade de IED:
+ IED生成几率:
+ Ratio des EEI:
+ Pravděpodobnost IED:
+
+
+ IEDs spotting difficulty
+ IED Erkennung
+ Dificuldade de Detecção de IED
+ IED识别难度:
+ Difficulté de détection des EEI
+ Obtížnost rozpoznání IED
+
+
+ Very easy
+ Sehr leicht
+ Muito Fácil
+ 非常容易
+ Très facile
+ Velmi snadné
+
+
+ Easy
+ Leicht
+ Fácil
+ 容易
+ Facile
+ Snadný
+
+
+ Drone bomber:
+ Feindl. Drohnen mit Bomben:
+ Drone Bombardeiro:
+ 敌方炸弹无人机:
+ Drone bombardier:
+ Dronový bombardér:
+
+
+ IEDs type of placement:
+ IED Art der Platzierung
+ IED放置位置
+ Type de placement des EEI:
+ Typ umístění IED:
+
+
+ Power of IED explosion:
+ Puissance de l'explosion:
+
+
+ Middle
+ Straßenmitte
+ 道路中间
+ Millieux
+ Střední
+
+
+ Roadside
+ Straßenrand
+ 道路两旁
+ Bord de route
+ U silnice
+
+
+
+
+ << Hideout/Cache options >>
+ << Verstecke/Waffenlager Einstellungen >>
+ << Opções de Esconderijo/Armazenamento >>
+ << 藏匿点/武器箱 设置 >>
+ << Options des Planques/Caches d'armes >>
+ << Nastavení úkrytů/zbrojnice >>
+
+
+ Hideout numbers:
+ Anzahl der Verstecke:
+ Números de Esconderijos:
+ 藏匿点数量:
+ Nombre de planque:
+ Počet úkrytů:
+
+
+ Info cache distance:
+ Distanzangabe für ein Waffenlager(Startwert):
+ Distância para um depósito de armas (valor inicial):
+ 首个武器箱情报的初始距离:
+ Information sur la distance de la cache d'arme:
+ Vzdálenost informací: (počáteční hodnota):
+
+
+ Cache info ratio:
+ Verkürzungschritt je gefundener Information:
+ Taxa de informação de esconderijo:
+ 每次获得武器箱情报, 使其地图标记范围减小的距离:
+ Ratio de trouver une information sur les caches d'armes:
+ Cache info ratio:
+
+
+ Intel from dead bodies chance:
+ Chance auf Informationen von toten Gegnern:
+ Possibilidade de informação em corpos mortos:
+ 敌军尸体携带情报的几率:
+ Chance de trouver des intel sur les corps:
+ Šance na informace od mrtvých protivníků:
+
+
+ Density of intel in house:
+ 房屋内的情报密度:
+ Hustota intelu v domě:
+ Densité du renseignements dans les maisons :
+
+
+
+
+ << Respawn options >>
+ << Respawn Optionen >>
+ << 重生选项 >>
+ << Options de réapparition >>
+ << Respawn možnosti >>
+
+
+ Respawn locations available:
+ Respawn ist möglich bei:
+ 可用的重生位置
+ Emplacements de réapparition disponibles:
+ Dostupná místa obnovení:
+
+
+ Enable respawn menu access from outside the base:
+ Enable respawn menu access from outside the base:
+ Enable respawn menu access from outside the base:
+ Enable respawn menu access from outside the base:
+ Enable respawn menu access from outside the base:
+
+
+ Add a 1 min timeout for accessing the respawn menu on vehicle and player:
+ Add a 1 min timeout for accessing the respawn menu on vehicle and player:
+ Add a 1 min timeout for accessing the respawn menu on vehicle and player:
+ Add a 1 min timeout for accessing the respawn menu on vehicle and player:
+ Add a 1 min timeout for accessing the respawn menu on vehicle and player:
+
+
+ FOB and Rallypoint
+ FOB und Ralleypoints
+ FOB 和 集合点
+ FOB et Rallypoint
+ FOB and Rallypoint
+
+
+ FOB
+ FOB
+ FOB
+ FOB
+ FOB
+
+
+ FOB, Rallypoint and Helo
+ FOB, Ralleypoints und Helo
+ FOB、集合点和可重生载具
+ FOB, Rallypoint et Helo
+ FOB, Rallypoint and Helo
+
+
+ FOB and Helo
+ FOB und Helo
+ FOB and Helo
+ FOB et Helo
+ FOB and Helo
+
+
+ FOB, Rallypoint and Transport helicopter
+ FOB, Rallypoints und Transporthubschrauber
+ FOB、集合点和运输直升机
+ FOB, Rallypoint, Hélicoptère de transport
+ FOB, Rallypoint a Transportní vrtulník
+
+
+ FOB and Transport helicopter
+ FOB und Transporthubschrauber
+ FOB and Transport helicopter
+ FOB et Hélicoptère de transport
+ FOB a Transportní vrtulník
+
+
+ FOB, Rallypoint, Transport helicopter and Transport vehicle
+ FOB, Rallypoints, Transporthubschrauber und Transportfahrzeuge
+ FOB、集合点、运输直升机和运输车辆
+ FOB, Rallypoint, Hélicoptère de transport, Véhicule de transport
+ FOB, Rallypoint, Transportní vrtulník a Transportní vozidlo
+
+
+ FOB, Transport helicopter and Transport vehicle
+ FOB, Transporthubschrauber und Transportfahrzeuge
+ FOB, Transport helicopter and Transport vehicle
+ FOB, Hélicoptère de transport, Véhicule de transport
+ FOB, Transportní vrtulník a Transportní vozidlo
+
+
+ FOB, Rallypoint, Transport helicopter, Transport vehicle and Leader
+ FOB, Rallypoint, Transporthubschrauber, Transportfahrzeuge and Gruppenführer
+ FOB、集合点、运输直升机、运输车辆和小队长
+ FOB, Rallypoint, Hélicoptère de transport, Véhicule de transport et Leader
+ FOB, Rallypoint, Transportní vrtulník, Transportní vozidlo a Leader
+
+
+ FOB, Transport helicopter, Transport vehicle and Player
+ FOB, Transport helicopter, Transport vehicle and Player
+ FOB, Transport helicopter, Transport vehicle and Player
+ FOB, Hélicoptère de transport, Véhicule de transport et Joueur
+ FOB, Transportní vrtulník, Transportní vozidlo a Player
+
+
+ Time before rallypoint self-destruction:
+ Zeit, bevor sich Ralleypoints selbst zerstören:?
+ 集合点自毁时间:
+ Temps avant l'autodestruction du point de ralliement:
+ Doba před sebezničením shromažďovacího bodu:
+
+
+ FOB, Helo, Transport helicopter, Transport vehicle and Player
+ FOB, Helo, Hélicoptère de transport, Véhicule de transport et Joueur
+
+
+ Helo, Transport helicopter, Transport vehicle and Player
+ Helo, Hélicoptère de transport, Véhicule de transport et Joueur
+
+
+ Transport helicopter, Transport vehicle and Player
+ Hélicoptère de transport, Véhicule de transport et Joueur
+
+
+ Transport vehicle and Player
+ Véhicule de transport et Joueur
+
+
+ Player
+ Joueur
+
+
+ Re-deploy FOB/vehicles
+ Wiedereinstieg FOB/Fahrzeugen
+ 重新部署至FOB/载具
+ Se redéployer sur FOB/vehicles
+ Znovu nasadit FOB/vozidla
+
+
+ Number of tickets at mission start:
+ Anzahl der Tickets bei Missionsstart
+ 任务开始时的重生票数:
+ Počet životu na začátku mise:
+ Nombre de ticket au début de la mission :
+
+
+ Number of tickets lost per death:
+ Nombre de ticket perdu par mort :
+
+
+ Tickets are share between:
+ Tickets werden aufgeteilt zwischen?
+ 重生票数在以下玩家间共享:
+ Životy se dělí mezi:
+ Les tickets sont partagés entre :
+
+
+ Players of the same faction
+ Spieler der gleichen Fraktion
+ 相同阵营的玩家
+ Hráči stejné frakce
+ Joueurs de la même faction
+
+
+ Attribute tickets from prisoners to (Enable only if tickets are not share):
+ Nombre de ticket que rapporte un prisonier (Activer cette option seulement si les tickets ne sont pas partagés) :
+
+
+ All connected players
+ A tous les joueurs connectés
+
+
+ To the player interacting with the logistic point
+ Au joueur interagissant avec le point logistique
+
+
+ To connected player with 0 ticket left
+ Au joueur connecté avec un solde de 0 ticket
+
+
+ To connected player with the lowest ticket number (0 included)
+ Au joueur avec le plus faible solde de ticket (0 inclus)
+
+
+ Not share
+ Nicht aufteilen.
+ 不共享
+ Nesdílet
+ Non partagé
+
+
+ Time before showing marker of dead player's body:
+ Zeit, bevor eine Markierung auf einem toten Spieler erstellt wird:
+ 显示阵亡玩家尸体标记前的时间:
+ Čas před zobrazením značky těla mrtvého hráče:
+ Temps avant de montrer le marqueur du corps du joueur mort :
+
+
+ ACE Arsenal available on respawn after been killed:
+ ACE Arsenal verfügbar bei Respawn, nachdem man getötet wurde:
+ ACE军火库在玩家死亡重生后可用:
+ Arsenal ACE disponible après avoir était tué:
+ ACE Arsenal dostupný při respawnu po zabití:
+
+
+ Each slot is share between players
+ Les slots sont partagés entre tous les joueurs
+
+
+
+
+ << A3 Skill options >>
+ << A3 Skill options >>
+ << Opções de Habilidade A3 >>
+ << AI技能设置 >>
+ << A3 options de compétences >>
+ << AI Možnosti dovedností >>
+
+
+ AimingAccuracy
+ Zielgenauigkeit
+ Precisão
+ 精准度(AimingAccuracy)
+ Précision
+ Přesnost zaměřování
+
+
+ AimingShake
+ Verwackeln beim Zielen
+ Habilidade de Pontaria
+ 瞄准抖动(AimingShake)
+ Tremblement de visée
+ Třes zaměřování
+
+
+ AimingSpeed
+ Zielgeschwindigkeit
+ Velocidade de Pontaria
+ 瞄准速度(AimingSpeed)
+ Vitesse de visée
+ Rychlost zaměřování
+
+
+ SpotDistance
+ Aufklärungsentfernung
+ Distância de Reconhecimento
+ 目标识别距离(SpotDistance)
+ Distance de repérage
+ SpotDistance
+
+
+ SpotTime
+ Aufklärungsgeschwindigkeit
+ Velocidade de Reconhecimento
+ 目标识别时间(SpotTime)
+ Temps de détection
+ SpotTime
+
+
+ Courage
+ Mut
+ Coragem
+ 勇气(Courage)
+ Courage
+ odvaha
+
+
+ ReloadSpeed
+ Nachladegeschwindigkeit
+ Velocidade de Recarga
+ 装填时间(ReloadSpeed)
+ Vitesse de rechargement
+ Rychlost přebíjení
+
+
+
+
+ << Gameplay options >>
+ << Spieleinstellungen >>
+ << Opções de jogabilidade >>
+ << 游戏设置 >>
+ << Options de gameplay >>
+ << Možnosti hry >>
+
+
+ Extend battlefield to sea:
+ Kämpfe aufs Wasser ausweiten:
+ Ampliar campo de batalha para o mar:
+ 将战区扩展至海上:
+ Étendre le secteur de guerre sur la mer:
+ Rozšířit bojiště na moře:
+
+
+ Chemical warfare:
+ Chemische Kriegsführung:
+ 化学战:
+ Guerre chimique:
+ Chemická válka:
+
+
+ Chemical side missions:
+ Missions secondaires chimiques :
+
+
+ Chemical weapon cache probability:
+ Probabilité de cache d'armes chimiques :
+
+
+ Spectrum devices:
+ Appareils à spectre:
+ Spektrální zařízení:
+
+
+ Side mission cycle:
+ Autom. nächste Nebenmission starten:
+ Ciclo de missão secundária:
+ 自动生成支线任务:
+ Cycle de mission secondaire:
+ Cyklus vedlejší mise:
+
+
+
+
+ << Arsenal options >>
+ << Arsenal Einstellungen >>
+ << 军火库设置 >>
+ << Opções do Arsenal >>
+ << Options de l'Arsenal >>
+ << Možnosti Arsenalu >>
+
+
+ Type of the arsenal:
+ Art des Arsenals:
+ Tipo de Arsenal:
+ 军火库类型:
+ Type de l'arsenal:
+ Typ arzenálu:
+
+
+ BIS - Vanilla
+ BIS - Vanilla
+ BIS - Vanilla
+ BIS - 原版
+ BIS - Vanilla
+ BIS - Vanilla
+
+
+ ACE 3
+ ACE 3
+ ACE 3
+ ACE 3
+ ACE 3
+ ACE 3
+
+
+ BIS - Vanilla and ACE 3
+ BIS - Vanilla und ACE 3
+ BIS - Vanilla e ACE 3
+ BIS - 原版 和 ACE 3
+ BIS - Vanilla et ACE 3
+ BIS - Vanilla and ACE 3
+
+
+ ACE 3 (scroll wheel action)
+ ACE 3 (Maus-Rad-Menü)
+ ACE 3 (rolando botão do meio do mouse)
+ ACE 3 (鼠标滚轮动作菜单)
+ ACE 3 (action sur la roulette de souris)
+ ACE 3 (funkce rolovacího kolečka)
+
+
+ BIS - Vanilla and ACE 3 (scroll wheel action)
+ BIS - Vanilla und ACE 3 (Maus-Rad-Menü)
+ BIS - Vanilla e ACE 3 (rolando botão do meio do mouse)
+ BIS - 原版 和 ACE 3 (鼠标滚轮动作菜单)
+ BIS - Vanilla et ACE 3 (action sur la roulette de souris)
+ BIS - Vanilla and ACE 3 (funkce rolovacího kolečka)
+
+
+ Restrict arsenal (See /define_mod.sqf):
+ Arsenal beschränken (Siehe /define_mod.sqf):
+ 军火库限制 (见 /define_mod.sqf):
+ Restringir arsenal (Veja /define_mod.sqf):
+ Arsenal restreint (Voir /define_mod.sqf)
+ Omezit arzenál (viz /define_mod.sqf):
+
+
+ Remove only (works only with ACE3-Arsenal)
+ Nur entfernen (funktioniert nur beim ACE3-Arsenal)
+ 仅移除 (仅对ACE3军火库生效)
+ Apenas remover (funciona apenas com o ACE3-Arsenal)
+ Blacklist (fonctionne seulement avec ACE3-Arsenal)
+ Pouze odebrat (funguje pouze s ACE3-Arsenal)
+
+
+ Predefined loadouts (See /define_mod.sqf)
+ Vorgefertigte Loadouts (Siehe /define_mod.sqf)
+ 预设装备 (见 /define_mod.sqf)
+ Loadouts prédefinidos (Veja /define_mod.sqf)
+ Équipements pré-définie (Voir /define_mod.sqf)
+ Předdefinovaná zatížení (viz /define_mod.sqf)
+
+
+ Remove all weapons
+ nur Waffen entfernen
+ 移除所有武器
+ Enlever toutes les armes
+ Odstraňte všechny zbraně
+
+
+ Filter on player role (works only with ACE3-Arsenal)
+ Nach der Rolle des Spielers beschränken (geht nur mit dem ACE3-Arsenal)
+ 根据玩家角色限制 (仅对ACE3军火库生效)
+ Filtrar à função do jogador (funciona apenas com o ACE3-Arsenal)
+ Filtrer en fonction du rôle du joueur (fonctionne seulement avec ACE3-Arsenal)
+ Filtr na roli hráče (funguje pouze s ACE3-Arsenal)
+
+
+ Activate garage for admin:
+ Virtuelle Garage für den Admin:
+ Garagem virtual para o administrador:
+ 为管理员启用虚拟车库
+ Activer le garage pour les admins:
+ Aktivovat garáž pro správce:
+
+
+
+
+ << Other options >>
+ << Sonstige Einstellungen >>
+ << Outras Opções >>
+ << 其他设置 >>
+ << Autres options >>
+ << Jiné možnosti >>
+
+
+ Reputation at start:
+ Ansehen zu Beginn:
+ Reputação inicial:
+ 初始声誉:
+ Réputation de départ:
+ Reputace na začátku:
+
+
+ Show reputation change above of:
+ Zeige Änderungen des Ansehens, wenn über:
+ 显示声誉变化, 当声誉变化大于:
+ Afficher un changement de réputation au-dessus de:
+ Zobrazit změnu reputace výše:
+
+
+ Spawn city radius offset:
+ Radius zum Spawnen von Einheiten:
+ Raio de surgimento de unidades na cidade:
+ 城市激活半径:
+ Décalage du rayon d'apparition des villes:
+ Posunutí poloměru města spawn:
+
+
+ 300 m (Default: Altis, Tanoa)
+ 300 m (Standard: Altis, Tanoa)
+ 300 m (Padrão: Altis, Tanoa)
+ 300米 (默认值: Altis, Tanoa):
+ 300 m (Default: Altis, Tanoa)
+ 300 m (Default: Altis, Tanoa)
+
+
+ Disable city activation when a plane or helicopter (>190Km/h) is flying above:
+ Das Spawnen von Einheiten deaktivieren, wenn ein Flugzeug oder Helikopter (>190Km/h) drüber fliegt:
+ Desativar o surgimento de unidades na cidade quando uma aeronave ou helicóptero estiver sobrevoando em velocidade (>190km/h):
+ 当飞机或直升机(>190Km/h)飞掠城市上空时, 不激活城市:
+ Désactiver l'activation de la ville lorsqu'un avion ou un hélicoptère vole à (>190Km/h) au-dessus d'une zone:
+ Zakázat aktivaci města, když letadlo nebo vrtulník (>190Km/h) a více:
+
+
+ City will be free if number of enemies is equal or lower than:
+ Städte gelten als befreit, wenn Anzahl von Feinden ist kleiner oder gleich:
+ 城镇将会被解放, 当敌军数量小于或等于:
+ Město bude volné, pokud bude počet nepřátel stejný nebo nižší než:
+ La ville sera libre si le nombre d’ennemis est égal ou inférieur à :
+
+
+ Allow the use of flag:
+ Erlaube die Nutzung von Flaggen:
+ 允许悬挂旗帜
+ Povolit použití vlajky:
+ Autoriser l’utilisation du drapeau :
+
+
+ On vehicle
+ An Fahrzeugen
+ 仅限载具
+ na vozidle
+ Sur les véhicules
+
+
+ On vehicle and team leader
+ Sur les véhicules et le team leader
+
+
+ On vehicle and players
+ An Fahrzeugen und Spielern
+ 载具和玩家
+ Na vozidle a hráčích
+ Sur les véhicules et les joueurs
+
+
+ Debug:
+ Debug:
+ Limpar:
+ 调试:
+ Debug:
+ Ladit:
+
+
+ Log only
+ Nur Logs
+ Somente Registros
+ 仅记录
+ Log uniquement
+ Pouze protokol
+
+
+
+
+
+
+ Objectives must be accomplished.
+ Ziele müssen erreicht werden.
+ 必须完成的目标。
+ Les objectifs doivent être atteints.
+ Cíle musí být splněny.
+
+
+ Main objectives
+ Hauptziele
+ 主要目标
+ Objectifs principaux
+ Hlavní úkol
+
+
+ Defeat the Oplitas
+ Derrotar a los Oplitas
+ Besiege die Oplitas
+ Derrote os Inimigos
+ 打败Oplitas
+ Vaincre les Oplitas
+ Porazte Oplitas
+
+
+ Defeat the Oplitas once and for all
+ Derrotar a los Oplitas de una vez por todas
+ Besiegen Sie die Oplitas ein für allemal
+ Derrote todos os inimigos de uma vez por todas
+ 彻底地打败敌军
+ Battez les Oplitas une fois pour toutes
+ Porazte Oplitas jednou provždy
+
+
+ Oplitas have been finally defeated! Mission accomplished!
+ Las Oplitas han sido finalmente derrotados! Misión cumplida!
+ Die Oplitas wurde endgültig besiegt! Mission erfüllt!
+ Todos os inimigos foram derrotados! Missão cumprida!
+ 敌军终于被打败了! 任务完成!
+ L'Oplitas a finalement été vaincu! Mission accomplie!
+ Oplitas byli konečně poraženi! Mise splněna!
+
+
+
+
+ Destroy all the hideouts of the Oplitas
+ Destruye todos los escondites de los Oplitas
+ Zerstören Sie sämtliche Verstecke der Oplitas
+ Destrua todos os esconderijos dos inimigos
+ 摧毁所有Oplitas藏匿点
+ Détruire toutes les planques de l'Oplitas
+ Zničte všechny úkryty Oplitas
+
+
+ Destroy all the hideouts
+ Destruye todos los escondites
+ Alle Verstecke zerstören
+ Destrua todos os esconderijos
+ 摧毁所有藏匿点
+ Détruire toutes les planques
+ Zničte všechny skrýše
+
+
+
+
+ Seize the last Oplitas positions
+ Toma las últimas posiciones de Oplitas
+ Erobern Sie die letzten Stellungen
+ Conquiste as últimas posições inimigas
+ 夺取最后一个Oplitas据点
+ Conquérir les dernières positions Oplitas
+ Obsaďte poslední pozice Oplitas
+
+
+
+
+
+
+ Capture commander in concealed convoy
+ Capturar al comandante en convoy ocult
+ Offizier gefangen nehmen
+ Capturar Oficial dentro do comboio camuflado
+ 抓捕敌方军官
+ Capturer l'officier voyageant dans le convoi
+ Zajmout velitele v ukrytém konvoji
+
+
+ Capture an officer travelling in a concealed convoy, then bring him to the base for interrogation. He is responsible for terrorizing local population!
+ Capturar a un oficial que viaja en un convoy oculto y luego llevarlo a la base para interrogarlo. ¡Él es el responsable de aterrorizar a la población local!
+ Ein feindlicher Offizier ist in einem getarnten Konvoi unterwegs. Finden und bringen Sie ihn in die Basis für weitere Befragungen. Er ist einer der Hauptverantwortlichen für die Terrorisierung der lokalen Bevölkerung!
+ Um Oficial está viajando em um comboio camuflado. Encontre e traga-o para base para interrogatório. Ele é um dos principais responsáveis por aterrorizar a população local!
+ 一名敌军军官已经伪装起来, 随同车队进行转移。找到他并把他带回基地, 进行进一步的审问。他是当地恐怖主义活动的主要责任人之一!
+ Capturez un officier voyageant dans un convoi, puis amenez-le à la base pour l'interroger. Il terrorise la population locale
+ Zachyťte důstojníka cestujícího ve skrytém konvoji a poté ho přiveďte na základnu k výslechu. Je zodpovědný za terorizaci místního obyvatelstva!
+
+
+ Surrender the officer.
+ Nehmen Sie den Offizier gefangen.
+ 迫使这名军官投降。
+ Capturé l'officier.
+ Zajmout důstojníka.
+
+
+ Surrender the officer
+ Offizier gefangen nehmen
+ 迫使军官投降
+ Capturé l'officier
+ zajmout důstojníka
+
+
+ Handcuff the officer.
+ Legen Sie dem Offizier Handschellen an.
+ 给这名军官戴上手铐。
+ Menotté l'officier.
+ Spoutejte důstojníka.
+
+
+ Handcuff the officer
+ Offizier gefangen nehmen
+ 铐住军官
+ Menotté l'officier
+ Spoutejte důstojníka
+
+
+
+
+ Destroy checkpoints in %1
+ Destruir los puestos de control en %1
+ Kontrollpunkte zerstören in %1
+ Destruir ponto de verificação em %1
+ 摧毁位于 %1 地区的检查站
+ Détruisez les points de contrôle dans %1
+ Zničte kontrolní body v %1
+
+
+ Checkpoints have been located in %1. Local population is asking for your help to destroy ammo box in all checkpoints!
+ Los puntos de control se han localizado en %1. La población local está pidiendo su ayuda para destruir la caja de municiones en todos los puntos de control!
+ Kontrollpunkt wurden in der Nähe von %1 gesichtet. Die lokale Bevölkerung bittet Sie darum, alle Munitionskisten und den jeweiligen Kontrollpunkt zu beseitigen!
+ Os pontos de verificação foram localizados em %1. A população local está pedindo sua ajuda para destruidir todas as caixas de munições em todos os pontos de verificação!
+ %1 地区发现了检查站。当地居民请求您摧毁所有检查站里的武器箱!
+ Les points de contrôle ont été localisés dans %1. La population locale demande votre aide pour détruire la boîte de munitions dans tous les points de contrôle!
+ Kontrolní body byly umístěny v %1. Místní obyvatelstvo žádá o vaši pomoc při zničení bedny s municí ve všech kontrolních bodech!
+
+
+ Destroy this checkpoint by destroying this object.
+ Beseitigen Sie den Kontrollpunkt, indem Sie alle Objekte zerstören.
+ 通过摧毁这一物件来摧毁该检查点。
+ Détruisez ce point de contrôle en détruisant cet objet.
+ Zničte tento kontrolní bod zničením tohoto objektu.
+
+
+ Destroy this checkpoint
+ Kontrollpunkt beseitigen
+ 摧毁该检查点
+ Détruisez ce point de contrôle
+ Zničte tento kontrolní bod
+
+
+
+
+ Medical emergency call on sea
+ Emergencia médica en el mar
+ Medizinischer Notruf auf hoher See
+ Chamada de emergência médica em alto mar
+ 海上紧急医疗求助
+ Appel d'urgence médicale en mer
+ Lékařské nouzové volání na moři
+
+
+ A civilian is calling for a medic in %1, treat and wait for patient stabilization.
+ Un civil está llamando a un médico en %1, tratar y esperar la estabilización del paciente.
+ Ein Zivilist aus %1 hat einen Notruf abgesetzt. Behandeln Sie ihn umd warten Sie darauf, dass sich sein Zustand stabilisiert.
+ Um civil fez uma chamada médica em %1. Trate-o e aguarde a estabilização dele.
+ %1 地区的一位平民正在呼叫医疗支援, 治疗并护理患者, 直至其伤势稳定。
+ Un civil appelle un médecin dans %1, soignez et attendez la stabilisation du patient.
+ Civilista volá zdravotníka v %1, ošetřete a počkejte na stabilizaci pacienta.
+
+
+
+
+ Civil need help
+ Civil necesita ayuda
+ Zivilist braucht Hilfe
+ Um civil precisa de ajuda
+ 平民求助
+ Un civil a besoins de votre aide
+ Civil potřebuje pomoc
+
+
+ Medical emergency call in %1
+ Llamada de emergencia médica en %1
+ Medizinischer Notruf aus %1
+ Chamada de emergência médica em %1
+ 位于 %1 地区的紧急医疗求助
+ Appel d'urgence médicale dans %1
+ Lékařské tísňové volání v %1
+
+
+ A civilian is calling for a medic in %1, treat and wait for patient stabilization
+ Un civil está llamando a un médico en %1, tratar y esperar la estabilización del paciente
+ Ein Zivilist aus %1 hat einen Notruf abgesetzt. Behandeln Sie ihn umd warten Sie darauf, dass sich sein Zustand stabilisiert
+ Um civil fez uma chamada médica em %1. Trate-o e aguarde a estabilização dele.
+ %1 地区的一位平民正在呼叫医疗支援, 治疗并护理患者, 直至其伤势稳定。
+ Un civil appelle un médecin dans %1, soignez et attendez la stabilisation du patient
+ Civilista volá zdravotníka v %1, ošetřete a počkejte na stabilizaci pacienta
+
+
+
+
+ Convoy has left the starting point!
+ ¡El convoy ha dejado el punto de partida!
+ Der Konvoi ist losgefahren!
+ O comboio deixou o ponto de partida!
+ 车队已经离开起点!
+ Le convoi a quitté le point de départ !
+ Konvoj opustil výchozí bod!
+
+
+ Convoy End
+ Fin del Convoy
+ Konvoi Ende
+ Fim do Comboio
+ 车队终点
+ Fin du convoi
+ Konec konvoje
+
+
+ Destroy Oplitas convoy attacking %1
+ Destruir el convoy de Oplitas atacando %1
+ Bewaffneter Konvoi unterwegs nach %1
+ Destrua o comboio armado inimigo %1
+ 摧毁进攻 %1 地区的Oplitas车队
+ Détruire le convoi d'Oplitas attaquant %1
+ Zničte konvoj Oplitas útočící na %1
+
+
+ An armed Oplitas convoy is going to attack %1. Local population is asking for your help to destroy it before it gets there!
+ Un convoy armado de Oplitas va a atacar %1. La población local está pidiendo su ayuda para destruirlo antes de que llegue allí!
+ Ein bewaffneter Konvoi der Oplitas will %1 angreifen. Schützen Sie die Bevölkerung in dem Sie den Konvoi zerstören bevor er dort ankommt
+ Um comboio armado inimigo vai atacar %1. Proteja a população local dentruindo o comboio antes que ele chegue
+ 一队Oplitas武装车队将要攻打 %1。当地居民请求在其抵达之前将其摧毁!
+ Un convoi armé d'Oplitas va attaquer %1. La population locale demande votre aide pour la détruire avant qu'elle n'arrive !
+ Braňte terminál, dokud nebude střela hacknuta!
+
+
+
+
+ Defend the terminal until the missile is hacked!
+ Defiende la terminal hasta que el misil sea hacekado!
+ Verteidigt das Terminal, bis die Rakete gehackt erfolgreich gehackt ist!
+ Defenda o terminal até que o míssil seja hackeado!
+ 保护终端, 直到导弹系统被成功入侵!
+ Défendez le terminal jusqu'à ce que le missile soit piraté !
+ Braňte terminál, dokud nebude střela hacknuta!
+
+
+ Start Hacking
+ Comenzar el hackeo
+ Hack starten
+ Comece a Hackear
+ 开始入侵
+ Commencer le piratage
+ Začněte hackovat
+
+
+ Hack missile near %1
+ Hackear misil cerca de %1
+ Rakete hacken in der Nähe von %1
+ Hackeie o míssil em %1
+ 入侵 %1 地区的导弹控制终端
+ Piratez le missile à proximité de %1
+ Hacknout raketu poblíž %1
+
+
+ Hack a prototype missile with a terminal available in %1. Defend your position until the process is done!
+ Hackear un misil prototipo con un terminal disponible en %1. Defiende tu posición hasta que el proceso haya terminado!
+ Hacke eine Prototyp-Rakete mit einem in %1 verfügbaren Terminal. Verteidige deine Position, bis der Prozess abgeschlossen ist!
+ Hackei o terminal de protótipo de míssil em %1. Defenda sua posição até que o processo seja concluído!
+ 在 %1 地区对一枚带有控制终端的导弹原型进行黑客入侵。守住你的位置, 直到入侵完成!
+ Piratez un prototype de missile avec un terminal disponible dans %1. Défendez votre position jusqu'à ce que le processus soit terminé !
+ Hackněte prototyp střely s terminálem dostupným v %1. Braňte svou pozici, dokud nebude proces dokončen!
+
+
+ Use the terminal to launch the hack.
+ Benutzen Sie das Terminal, um den Hack zu starten.
+ 使用该终端开始黑客入侵。
+ Utilisez le terminal pour lancer le hack.
+ Ke spuštění hacku použijte terminál.
+
+
+ Start the Hack
+ Hack starten
+ 进行黑客入侵
+ Lancez le piratage
+ Spusťte Hack
+
+
+ Defend the terminal
+ Verteidigen Sie das Terminal
+ 保护终端
+ Défendre le terminal
+ Braňte terminál
+
+
+
+
+ Liberate hostage near %1
+ Liberar rehén cerca de %1
+ Geisel befreien: %1
+ Liberte o refém próximo a %1
+ 解救 %1 附近的人质
+ Libérer un otage près de %1
+ Osvoboďte rukojmí poblíž %1
+
+
+ Liberate a civilian hostage in %1. The Local population is asking for your help!
+ Liberar a un rehén civil en %1. La población local está pidiendo su ayuda!
+ Befreien Sie eine Geisel in %1 aus den Händen der Terroristen. Die lokale Bevölkerung bittet um Ihre Hilfe!
+ Liberte o civil refém em %1 das mãos dos terroristas. A população local está pedindo sua ajuda!
+ 解救 %1 地区的人质。当地居民正在请求你的帮助!
+ Libérez un otage civil dans %1. La population locale demande votre aide !
+ Osvoboďte civilní rukojmí v %1. Místní obyvatelstvo vás žádá o pomoc!
+
+
+
+
+ Minefield near %1
+ Campo minado cerca de %1
+ Minenfeld in der Nähe von %1
+ Campo minado perto de %1
+ 清除 %1 附近的雷区
+ Champ de mines à proximité de %1
+ Minové pole poblíž %1
+
+
+ There is a minefield near %1, clear it!
+ Hay un campo minado cerca de %1, ¡despejenlo!
+ Es gibt ein Minenfeld in der Nähe von %1, räumen Sie es!
+ Campo minado próximo a %1. Limpe-os!
+ %1 附近有雷区, 把它们清除掉!
+ Il y a un champ de mines près de %1, nettoyez-le !
+ V blízkosti %1 je minové pole, vyčistěte ho!
+
+
+
+
+ Rescue downed pilot near %1
+ Rescate de piloto caído cerca de %1
+ Abgestürzter Piloten in der Nähe %1
+ Resgate de piloto abatido perto de %1
+ 在 %1 附近搜救坠机飞行员
+ Sauvetage d'un pilote abattu près de %1
+ Záchrana sestřeleného pilota poblíž %1
+
+
+ MAYDAY-MAYDAY, a pilot crashed his helicopter near %1. Command is asking for your help to rescue and bring him back to base!
+ MAYDAY-MAYDAY, un piloto estrelló su helicóptero cerca de %1. ¡El Comando está pidiendo su ayuda para rescatarlo y traerlo de vuelta a la base!
+ MAYDAY-MAYDAY, ein Pilot stürzte mit seinem Helikopter in der Nähe von %1 ab. Sie haben den Befehl ihn zu retten und sicher zur Basis zurückzubringen!
+ MAYDAY-MAYDAY, um piloto caiu com seu helicóptero próximo a %1. O comando solicitou sua ajuda para resgatá-lo e trazê-lo de volta a base!
+ MAYDAY-MAYDAY, 一架直升机在 %1 附近坠毁。指挥部正在请求你的帮助。前去搜救这名飞行员, 并将其带回基地!
+ MAYDAY-MAYDAY, un pilote a écrasé son hélicoptère près de %1. Le commandement demande votre aide pour secourir et le ramener à la base !
+ MAYDAY-MAYDAY, pilot havaroval se svým vrtulníkem poblíž %1. Velení žádá o vaši pomoc při jeho záchraně a přivedení zpět na základnu!
+
+
+ Find the pilot of the helicopter. It should be around the helicopter wreck.
+ Finden Sie den Piloten. Er sollte sich um Umfeld des Helikopterwracks befinden.
+ 找到该直升机的飞行员。他应该在直升机残骸附近。
+ Trouvez le pilote de l'hélicoptère. Il devrait être autour de l'épave de l'hélicoptère.
+ Najděte pilota vrtulníku. Mělo by to být kolem vraku vrtulníku.
+
+
+ Find the pilot
+ Finde den Piloten
+ 找到飞行员
+ Trouvez le pilote
+ Najděte pilota
+
+
+ Get him back to base at the logistic point.
+ Bringen Sie ihn zum Logistikpunkt zurück.
+ 将他带回基地后勤点。
+ Ramenez-le à la base au point logistique.
+ Dostaňte ho zpět na základnu v logistickém bodě.
+
+
+ Get him back
+ Hol ihn zurück
+ 将他带回
+ Ramenez-le
+ Vraťte ho
+
+
+ %1 has been killed. Place %1 in a body bag.
+ %1 wurde getötet. Bergen Sie seine Leiche mithilfe eines Leichsacks.
+ %1 已经阵亡。将 %1 装进尸体袋。
+ %1 a été tué. Placez %1 dans un sac mortuaire.
+ %1 byl zabit. Umístěte %1 do vaku na tělo.
+
+
+ Place the pilot in a body bag
+ Toten Piloten bergen
+ 将该飞行员装进尸体袋
+ Placer le pilote dans un sac mortuaire
+ Umístěte pilota do vaku na tělo
+
+
+ Bring %1 body bag to the logistic point.
+ Geben Sie den in einem Leichensack verpackten Leichnam von %1 beim Logistikpunkt ab.
+ 将装有 %1 的尸体袋带回后勤点。
+ Apportez le sac mortuaire %1 au point logistique.
+ Přineste %1 vak na tělo do logistického bodu.
+
+
+ Bring the body bag to base
+ Bringen Sie den Leichnam zur Basis
+ 将尸体袋带回基地
+ Apportez le sac mortuaire à la base
+ Přineste vak na tělo na základnu
+
+
+
+
+ Supply %1
+ Suministrar %1
+ Versorgung nach %1 bringen
+ Envie Suprimentos para %1
+ 在 %1 发放救援物资
+ Ravitailler %1
+ Supply %1
+
+
+ The citizens of %1 are on the brink starving and thirsty to death, bring them food and potable water present in the supply container at the logistic point!
+ Los ciudadanos de %1 están al borde de la muerte de hambre, ¡tráiganles algunos suministros presentes en el punto logístico!
+ Die Bewohner der Stadt %1 sind am verdusten und verhungern. Versorgen Sie die Bürger mit den nötigen Nahrungsmitteln. Den benötigten Nachschubcontainer finden sie am Versorgungspunkt.
+ O população de %1 estão passando fome! Forneça suprimentos! Os suprimentos podem ser solicitados no ponto logístico.
+ %1 的居民正在挨饿, 在后勤点生成一些救援物资并带给他们!
+ Les citoyens de %1 sont sur le point de mourir de faim et de soif, apportez-leur la nourriture et l'eau potable présentes dans le conteneur de ravitaillement au point logistique !
+ Obyvatelé %1 jsou na pokraji smrti hladem a žízní, přineste jim jídlo a pitnou vodu v zásobovacím kontejneru na logistickém místě!
+
+
+ Move to the supply location with supplies available at the logistic point.
+ Begeben Sie sich mir der Versorgungslieferung (erhältlich am Versorgungspunkt) zum Einsatzgebiet.
+ 在后勤点申请救援物资, 并将其运送至补给区域。
+ Déplacez-vous vers le lieu d'approvisionnement avec les fournitures disponibles au point logistique.
+ Přesuňte se na místo zásobování se zásobami dostupnými na logistickém místě.
+
+
+ Move with supplies
+ Versorgungslieferung
+ 运送物资
+ Déplacez-vous avec des fournitures
+ Pohybujte se zásobami
+
+
+ Unload supplies available inside the supplies container.
+ Entladen Sie alle Nachschubgüter aus der Versorgungslieferung.
+ 从集装箱中卸载救援物资。
+ Déchargez les fournitures disponibles dans le conteneur de fournitures.
+ Vyložte veškeré doplňované zboží ze zásobníku.
+
+
+ Unload supplies
+ Nachschubgüter ausladen
+ 卸载救援物资
+ Décharger les fournitures
+ Vyložte zásoby
+
+
+
+
+ Destroy tower in %1
+ Destruir torre de radio en %1
+ Funkturm zerstören: %1
+ Destrua a torre de rádio em %1
+ 摧毁 %1 地区的信号塔
+ Détruire la tour dans %1
+ Zničte věž v %1
+
+
+ A Oplitas communications tower has been located in %1. Local population is asking for your help to destroy it! (Use one M183 explosive satchel)
+ En %1 se ha ubicado una torre de comunicaciones de Oplitas. La población local está pidiendo tu ayuda para destruirlo! (Use un explosivo satchel M183)
+ Ein Funkturm der Oplitas befindet sich in %1. Die lokale Bevölkerung bittet darum diesen zu zerstören! (Nutzen Sie die M183 Sprengladungen)
+ A torre de comunicação inimiga foi localizada em %1. A população local está pedindo sua ajuda para destruí-las. (Use a mochila de explosivos M183)
+ %1 地区发现了一座 Oplitas 通讯信号塔。当地居民请求您将其摧毁。(使用一个M183炸药包)
+ Une tour de communication Oplitas a été localisée dans %1. La population locale demande votre aide pour le détruire ! (Utilisez une sacoche explosive M183)
+ Komunikační věž Oplitas byla umístěna v %1. Místní obyvatelstvo žádá o vaši pomoc při jeho zničení! (Použijte jednu výbušnou brašnu M183)
+
+
+
+
+ Generator
+ Generador
+ Generator
+ Gerador
+ 发电机
+ Générateur
+ Generator
+
+
+ Destroy underwater generator in %1
+ Destruir el generador subacuático en %1
+ Zerstöre den Unterwassergenerator in %1
+ Destrua o gerador subaquático em %1
+ 摧毁 %1 地区的水下发电机
+ Détruire le générateur sous-marin dans %1
+ Zničte podvodní generátor v %1
+
+
+ An underwater generator has been located in %1. Local population is asking for your help to destroy it!
+ Se ha localizado un generador submarino en %1. La población local está pidiendo tu ayuda para destruirlo!
+ Ein Unterwassergenerator wurde in der Nähe von %1 aufgeklärt. Die zivile Bevölkerung bittet um die Zerstörung des Aggregats!
+ O gerador subaquático foi localizado em %1. A população local está pedindo sua ajuda para destruí-lo!
+ %1 地区发现了一部水下发电机。当地居民请求您将其摧毁。
+ Un générateur sous-marin a été localisé dans %1. La population locale demande votre aide pour le détruire !
+ V %1 byl umístěn podvodní generátor. Místní obyvatelstvo žádá o vaši pomoc při jeho zničení!
+
+
+
+
+ Vehicle needs assistance near %1
+ Vehículo necesita asistencia cerca de %1
+ Fahrzeug braucht Unterstützung in der Nähe von %1
+ Veículos necessitando de assistência em %1
+ %1 附近的载具需要援助
+ Un véhicule a besoin d'assistance à proximité de %1
+ Vozidlo potřebuje asistenci poblíž %1
+
+
+ A vehicle damaged by an IED needs assistance near %1! Repair it!
+ Un vehículo dañado por IED necesita asistencia cerca de %1! ¡Repárelo!
+ Ein Fahrzeug wurde durch eine IED beschädigt und braucht nun Unterstützung in der Nähe von %1! Repariere Sie es!
+ Um veículo foi danificado por um IED precisa de reparo em %1! Conserte-o!
+ 一辆被IED损坏的载具在 %1 附近等待援助! 修好它!
+ Un véhicule endommagé par un EEI a besoin d'une assistance à proximité de %1 ! Répare-le !
+ Vozidlo poškozené IED potřebuje asistenci blízko %1! Opravte to!
+
+
+
+
+ Free %1
+ Liberar %1
+ Befreie %1
+ Liberte %1
+ 解放 %1
+ Liberer %1
+ Free %1
+
+
+ %1 has been conquered by the Oplitas! The Local population is being terrorized, they are asking for help!
+ %1 ha sido conquistado por los Oplitas! La población local está siendo aterrorizada, están pidiendo ayuda!
+ %1 wurde von der Oplitas erobert! Die lokale Bevölkerung wird terrorisiert, greifen Sie ein!
+ Os inimigos estão conquistando a cidade %1. A população local está sendo aterrorizada. Ajude-os!
+ %1 已被Oplitas占领! 当地居民受到恐吓, 他们正在请求帮助!
+ La ville de %1 a été conquise par les Oplitas ! La population locale est terrorisée, elle demande de l'aide !
+ %1 bylo dobyto Oplitas! Místní obyvatelstvo je terorizováno, žádají o pomoc!
+
+
+
+
+ Assassinate %1
+ Eliminiere %1
+ 刺杀 %1
+ Assassiner %1
+ Eliminovat %1
+
+
+ Assassinate %1 in %2, then bring his dog tag to the base for identification. He is responsible for terrorizing the local population!
+ Eliminieren Sie %1 in %2 und sichern Sie seine Hundemarke zur Identifizierung. Er ist der Hauptverantwortliche für den Terror in der Region!
+ 在 %2 地区刺杀 %1, 然后将他的狗牌带回基地以进行身份鉴定。他是当地恐怖主义活动的主要责任人之一!
+ Assassiner %1 dans la ville de %2, puis apportez sa plaque d'identité à la base pour identification. Il est terrorise la population locale!
+ Zavražděte %1 v %2, pak přineste jeho psí známku na základnu k identifikaci. Je zodpovědný za terorizaci místního obyvatelstva!
+
+
+ Kill %1
+ Töte %1
+ 杀死 %1
+ Tuez %1
+ Zabijte %1
+
+
+ Kill %1 in %2.
+ Töten Sie %1 in %2.
+ 在 %2 地区杀死 %1。
+ Tuez %1 dans la ville de %2.
+ Zabijte %1 v %2.
+
+
+ Take dog tag
+ Hundemarke aufnehmen
+ 拿取狗牌
+ Prendre la plaque d'identité
+ Vezměte si psí známku
+
+
+ Take dog tag of %1.
+ Nehmen Sie die Hundemarke von %1 an sich.
+ 拿取 %1 的狗牌。
+ Prendre la plaque d'identité sur %1.
+ Vezměte psí známku %1.
+
+
+ Bring dog tag to base
+ Bringen Sie die Hundemarke in die Basis
+ 将狗牌带回基地
+ Apportez la plaque d'identité à la base
+ Přineste psí známku na základnu
+
+
+ Bring %1 dog tag to the logistic point.
+ Geben Sie die Hundemarke beim Logistikpunkt in der Basis ab.
+ 将 %1 的狗牌带回基地后勤点。
+ Apportez la plaque d'identité de %1 au point logistique.
+ Přineste %1 psí známku na logistické místo.
+
+
+
+
+ Chemical leak in %1
+ Chemieunfall in %1
+ 处理 %1 地区的化学品泄露
+ Fuite chimique dans la ville de %1
+ Chemický únik v %1
+
+
+ Some containers with a dangerous chemical agent have been broken in %1. The civilian population reported that only some small objects are contaminated. Eliminate the contamination by moving those objects under a big shower.
+ In %1 wurden einige Behälter mit gefährlichen chemischen Stoffen beschädigt. Laut Aussagen der Zivilbevölkerung scheinen aber nur kleinere Objekte mit dieser Substanz in Berührungen gekommen zu sein. Finden und beseitigen Sie die kontaminierten Objekte, in dem Sie diese unter eine große Dusche stellen.
+ 在 %1 地区, 一些装有危险化学试剂的集装箱发生破损。平民报告称只有一些小物体受到污染。将这些物体移动到大型淋浴器下以消除污染。
+ Certains conteneurs contenant un agent chimique dangereux ont été cassés dans la ville de %1. La population civile a signalé que seuls quelques petits objets étaient contaminés. Éliminez la contamination en déplaçant ces objets sous une grande douche.
+ Některé nádoby s nebezpečným chemickým činidlem byly rozbity v %1. Civilní obyvatelstvo hlásilo, že jsou kontaminovány pouze některé malé předměty. Odstraňte kontaminaci přesunem těchto předmětů pod velkou sprchu.
+
+
+ Bring a container available at the logistic point to the contaminated area. You will use it to load all contaminated objects.
+ Bringen Sie einen Container, welchen Sie an dem Logistikpunkt erhalten, zu dem markierten Bereich. Diesen Container können Sie verwenden um alle kontaminierten Objekte zu verlanden/transportieren.
+ 在后勤点生成集装箱并将其带到受污染区域。你将使用它来装载所有的受污染物体。
+ Apportez un conteneur disponible au point logistique dans la zone contaminée. Vous l'utiliserez pour charger tous les objets contaminés.
+ Do kontaminované oblasti přineste kontejner dostupný na logistickém místě. S jeho pomocí naložíte všechny kontaminované předměty.
+
+
+ Bring a container
+ Container bereitstellen
+ 携带一个集装箱
+ Apportez un conteneur
+ Přineste container
+
+
+ Locate contaminated objects
+ Kontaminierte Objekte lokalisieren
+ 确定受污染物体的位置
+ Localisez les objets contaminés
+ Najděte kontaminované předměty
+
+
+ Locate contaminated objects. The ED-1E drone can help you to identify contaminated objects by biopsy.
+ Lokalisieren Sie die kontaminierten Objekte mithilfe einer ED-1E-Drohne. Führen Sie mit der Drohne eine Biopsie durch, um die Objekte zu identifizieren.
+ 确定受污染物体的位置。ED-1E 无人机可以通过针刺活检帮助你识别受污染物体。
+ Localisez les objets contaminés. Le drone ED-1E peut vous aider à identifier les objets contaminés par biopsie.
+ Najděte kontaminované předměty. Dron ED-1E vám může pomoci identifikovat kontaminované předměty pomocí biopsie.
+
+
+ Clean contaminated objects
+ Kontaminierte Objekte reinigen
+ 清理受污染的物体
+ Nettoyez les objets contaminés
+ Vyčistěte kontaminované předměty
+
+
+ Load contaminated objects in containers. Move the container or objects inside a big shower. Note: you can load this container inside a vehicle and move the vehicle under the shower. This clean up the vehicle, crew and cargo.
+ Verladen Sie kontaminierte Objekte in einen Container und bringen Sie diesen zu einer großen Dusche. Hinweis: Sie können den Container in ein Fahrzeug laden und das ganze Fahrzeug unter die Dusche stellen. Dies dekontaminiert das Fahrzeug, die Insassen und die Ladung.
+ 将受污染物体装载至集装箱中。将集装箱或受污染物体移动到大型淋浴器下。注: 你可以将集装箱装载至载具, 再将载具移动到淋浴器下。这将一并净化载具、成员和货物。
+ Chargez les objets contaminés dans des conteneurs. Déplacez le contenant ou les objets dans une grande douche. Remarque: vous pouvez charger ce conteneur à l'intérieur d'un véhicule et déplacer le véhicule sous la douche. Cela nettoie le véhicule, l'équipage et la cargaison.
+ Kontaminované předměty vložte do kontejnerů. Přesuňte nádobu nebo předměty do velké sprchy. Poznámka: Tento kontejner můžete naložit do vozidla a přesunout vozidlo pod sprchu. Tím se vyčistí vozidlo, posádka a náklad.
+
+
+
+
+ EMP in %1
+ EMP in %1
+ 摧毁 %1 地区的 EMP 装置
+ EMP dans la ville de %1
+ EMP v %1
+
+
+ Civilian population reported that vehicles have electronic fail around %1. They are requesting your help to investigate the origin. %2
+ Die Bevölkerung hat um %1 Probleme mit der Elektronik ihrer Fahrzeugen. Sie brauchen unsere Unterstützung um den Grund dafür zu finden. %2
+ 平民报告称, %1 地区附近存在载具上的电子设备失效的情况。平民请求对来源进行调查。%2
+ La population civile a signalé que les véhicules ont une panne électronique autour de %1. Ils demandent votre aide pour enquêter sur l'origine. %2
+ Civilní obyvatelstvo uvedlo, že vozidla mají elektronické selhání kolem %1. Žádají vaši pomoc při vyšetřování původu. %2
+
+
+ Find and destroy station
+ Finde und zerstöre die Stationen
+ 找到并摧毁 EMP 发射站
+ Trouver et détruire la station
+ Najděte a zničte stanici
+
+
+ Locate and destroy EMP station creating electronic fail.
+ Finde und zerstöre die EMP Stationen, welche für die elektronischen Fehler verantwortlich sind.
+ 找到并摧毁导致电子设备失效的 EMP 发射站。
+ Localiser et détruite les équipements à l'origine des pertubations électro-magnétiques
+ Najděte a zničte EMP stanici vytvářející elektronické selhání.
+
+
+
+
+ Remove rubbish in %1
+ Entferne Müll in %1
+ 清除 %1 地区的垃圾
+ Retirer les déchets à %1
+ Odstraňte odpad v %1
+
+
+ Civilian population reported many rubbish on road making driving difficult around %1. They are requesting your help to remove them with a Nemmera.
+ Die Bevölkerung meldet viel Müll auf den Straßen bei %1. Dieser macht das fahren auf den Straßen fast unmöglich. Sie benötigen unsere Unterstützung um den Müll mit dem Nemera zu entfernen
+ 平民报告称 %1 附近的道路上有许多垃圾, 导致行车困难。平民请求您派遣豹式装甲车(Nemmera)来清除这些垃圾。
+ La population civile a signalé de nombreux déchets sur la route rendant la conduite difficile autour de %1. Ils demandent votre aide pour les supprimer avec un Nemmera.
+ Civilní obyvatelstvo hlásilo mnoho odpadků na silnici, což ztěžovalo řízení kolem %1. Žádají vaši pomoc při jejich odstranění pomocí Nemmery.
+
+
+ Rubbish spotted
+ Müll gefunden
+ 垃圾目击地点
+ Déchets repérés
+ odpad Identifikován
+
+
+ A civilian spotted this rubbish as particularly annoying while driving.
+ Ein Zivilist hat den Müll auf der Straße gesehen und konnte gerade noch ausweichen.
+ 一位平民发现这些垃圾非常阻碍行车。
+ Un civil a repéré ces déchets comme particulièrement ennuyeux en conduisant.
+ Civilista si všiml tohoto odpadu jako zvláště otravného při jízdě.
+
+
+
+
+ Contaminated civilians in %1
+ Kontaminierte Zivilisten bei %1
+ %1 地区的平民受到感染
+ Kontaminovaný civilisti v %1
+ Civils contaminés dans %1
+
+
+ Civilians get contaminated by a chemical agent around %1. They are requesting your help to decontaminate those civilans with a little shower. To locate civilians go to the subtask, follow red blood drop and use your chemical detector.
+ Zivilisten werden durch einen chemischen Kampfstoff bei %1 kontaminiert. Sie benötigen unsere Unterstützung. Dekontaminiere die Zivilisten mit einer kleinen Decon Dusche. Um die Zivilisten zu finden, suche bei der Unteraufgabe nach Bluttropfen und nutze deinen chemischen Detekor.
+ %1 附近的平民感染了一种化学试剂。平民请求您使用小型淋浴器来净化受感染的村民。要确定平民的位置, 请查看次级任务, 跟随红色的血滴并使用化学探测器。
+ Civilisté jsou kontaminováni chemickou látkou kolem %1. Žádají vaši pomoc při dekontaminaci těch civilistů malou sprchou. Chcete-li najít civilisty, přejděte na dílčí úkol, postupujte podle kapky červené krve a použijte svůj chemický detektor.
+ Les civils sont contaminés par un agent chimique autour de %1. Ils demandent votre aide pour décontaminer ces civils avec une petite douche. Pour localiser les civils, ouvrez la sous-tâche, suivez les gouttes de sang rouge et utilisez votre détecteur de produits chimiques.
+
+
+ Decontaminate this civilian
+ Dekontaminiere diesen Zivilisten
+ 净化这名平民
+ Dekontaminujte tohoto civilistu
+ Décontaminer ce civil
+
+
+ Search and decontaminate this civilian. Follow red blood drop and use your chemical detector.
+ Suche und dekontaminiere diesen Zivilisten. Folge den Bluttropen und nutze deinen Chemischen Detektor.
+ 搜寻并净化这名平民。跟随红色的血滴并使用化学探测器。
+ Prohledejte a dekontaminujte tohoto civilistu. Sledujte kapku červené krve a použijte svůj chemický detektor.
+ Recherchez et décontaminez ce civil. Suivez les gouttes de sang rouge et utilisez votre détecteur chimique.
+
+
+ %1 massacre
+ %1 massacre
+
+
+ Civilians were brutally killed in %1. They are requesting your help to move dead bodies in a grave next to a religious building. To locate killed civilians go to the subtask.
+ Des civils ont été sauvagement tués en %1. Ils demandent votre aide pour déplacer les cadavres dans une tombe à côté d'un édifice religieux. Pour localiser les civils tués, ouvrez la sous-tâche.
+
+
+ %1
+ %1
+
+
+ Move this killed civilian next to a church and dig a grave.
+ Déplacez ce civil tué près d'une église et creusez une tombe.
+
+
+
+
+
+
+ Database
+ Base de Dato
+ Datenbank
+ Base de Dados
+ 数据库
+ Base de données
+ Databáze
+
+
+
+
+ Interrogate
+ Verhören
+ Interrogar
+ 审问
+ Interroger
+ Vyslýchat
+
+
+
+
+ Logistic
+ Logistica
+ Logistik
+ Logística
+ 后勤
+ Logistique
+ Logistic
+
+
+ Require object
+ Solicitar Objeto
+ Nachschub anfordern
+ Solicitar reabastecimento
+ 申请补给
+ Demander des objets
+ Objekty/Zdroje/Suroviny
+
+
+ Repair wreck
+ Reparar chatarra
+ Wrack reparieren
+ Reparação de destroços
+ 修理残骸
+ Réparer l'épave
+ Opravit
+
+
+ Require vehicle
+ Solicitar vehiculo
+ Fahrzeug anfordern
+ Solicitar veículo
+ 申请载具
+ Demander un véhicule
+ Vyžadovat vozidlo
+
+
+ Refuel fuel source
+ 重新填充燃料罐
+ Ravitailler la source de carburant
+ Doplňte Palivo
+
+
+ Resupply rearm source
+ 重新装填弹药箱
+ Doplňte Munici
+ Ravitailler la source de ravaitaillement
+
+
+ Get tickets from body bag or prisoner
+ Erhalte Tickets durch Leichensäcke oder Gefangene
+ 回收尸体袋或囚犯以获得重生票数
+ Získejte Životy z vaku na tělo nebo vězně
+ Obtenir des tickets auprès d’un sac mortuaire ou d’un prisonnier
+
+
+
+
+ Mount FOB
+ Armar FOB
+ FOB aufbauen
+ Montar a FOB
+ 建立FOB
+ Monter la FOB
+ Postavte FOB
+
+
+ Dismantle FOB
+ Desarmar FOB
+ FOB abbauen
+ Desmontar a FOB
+ 拆除FOB
+ Démonter la FOB
+ Demontujte FOB
+
+
+
+
+ Civil Orders
+ Orden a Civiles
+ Befehle (Zivilisten)
+ Ordens (civil)
+ 命令平民
+ Ordre au civil
+ Občanské řády
+
+
+ Stop!
+ Alto!
+ Stopp!
+ Pare!
+ 站住!
+ Halte !
+ Stop!
+
+
+ Get down!
+ Agachate!
+ Auf den Boden!
+ Pro chão!
+ 趴下!
+ A terre !
+ K zemi!
+
+
+ Go away!
+ Vete de aqui!
+ Geh weg!
+ Vá embora!
+ 走开!
+ Partez !
+ Odejít!
+
+
+ Taxi
+ Taxi
+ Taxi
+ Táxi
+ 搭车
+ Taxi
+ Taxi
+
+
+ Ask info
+ Pedir información
+ Nach Informationen fragen
+ Pedir informações
+ 询问信息
+ Demander des informations
+ Zeptejte se info
+
+
+ Ask Reputation
+ Pregunte su reputación
+ Nach dem Ansehen fragen
+ Peça a reputação
+ 询问声誉情况
+ Demander la réputation
+ Vyžádejte si pověst
+
+
+ Give a banana
+ Banane geben
+ 给他一根香蕉
+ Dejte banán
+ Donner une banane
+
+
+
+
+ Abort assigned
+ Abortar
+ Zugewiesene Mission abbrechen
+ Abortar
+ 中止
+ Abandonner l'assignée
+ Přiřazeno přerušení
+
+
+ Request
+ Solicitar
+ Anfordern
+ Solicitar
+ 申请
+ Demander
+ Žádost
+
+
+
+
+ BI respawn
+ BI Respawn
+ BI重生
+ BI respawn
+ BI respawn
+
+
+ Re-deploy base
+ Wiedereinstieg Basis
+ 重新部署至基地
+ Se redéployer sur base
+ Znovu rozmístit základnu
+
+
+ Re-deploy rallypoints
+ Wiedereinstieg Ralleypoint
+ 重新部署至集合点
+ Se redéployer au point de ralliement
+ Znovu rozmístěte shromažďovací body
+
+
+
+
+ <t color='#ff1111'>Arsenal (BIS)</t>
+ <t color='#ff1111'>Arsenal (BIS)</t>
+ <t color='#ff1111'>Arsenal (BIS)</t>
+ <t color='#ff1111'>军火库(BIS)</t>
+ <t color='#ff1111'>Arsenal (BIS)</t>
+ <t color='#ff1111'>Arsenal (BIS)</t>
+
+
+
+
+ <t color='#ff1111'>Arsenal (ACE)</t>
+ <t color='#ff1111'>Arsenal (ACE)</t>
+ <t color='#ff1111'>Arsenal (ACE)</t>
+ <t color='#ff1111'>军火库(ACE)</t>
+ <t color='#ff1111'>Arsenal (ACE)</t>
+ <t color='#ff1111'>Arsenal (ACE)</t>
+
+
+
+
+ Remove tag
+ Markierung entfernen
+ 移除标记
+ Enlever le tag
+ Odstranit označení
+
+
+
+
+ Deploy flag
+ Flagge anbringen
+ 悬挂旗帜
+ Nasadit vlajku
+ Déployer le drapeau
+
+
+ Cut flag
+ Flagge entfernen
+ 剪断旗帜
+ uříznout vlajku
+ Enlever le drapeau
+
+
+
+
+ Copy container
+ Copiar container
+ Container kopieren
+ Copiar Contêiner
+ 记录集装箱内容
+ Copier le conteneur
+ Kopírovat kontejner
+
+
+ Paste container
+ Pegar container
+ Container einfügen
+ Colar Contâiner
+ 生成已记录的集装箱
+ Coller le conteneur
+ Vložit kontejner
+
+
+ Copy inventory
+ Copier l'inventaire
+
+
+ Paste inventory
+ Coller l'inventaire
+
+
+ Restore inventory
+ Restorer l'inventaire
+
+
+
+
+ Break door lock
+ Brich die Tür auf
+ Forcer la serrure
+ 撬锁
+ Rozbijte zámek dveří
+
+
+
+
+ Set day time
+ Mettre le jour
+
+
+ Set night time
+ Mettre la nuit
+
+
+ Change weather
+ Changer la météo
+
+
+ Enable change day time for officer on the arsenal box:
+ Autoriser le changement d'heure pour les officiers sur la caisse arsenal:
+
+
+ Enable change weather for officer on the arsenal box:
+ Autoriser le changement de météo pour les officiers sur la caisse arsenal:
+
+
+
+
+
+
+ I can't understand what is saying
+ No puedo entender lo que está diciendo
+ Ich verstehe nicht was Sie sagen
+ Não consigo entender o que está dizendo
+ 我不明白你在说什么。
+ Je ne comprends pas ce qu'il dit
+ nerozumím tomu co říkáš
+
+
+ I heard about %1 hideouts left.
+ Escuché que quedaban %1 escondite
+ Ich habe gehört, dass es noch %1 Verstecke gibt.
+ Ouvi dizer que há ainda %1 esconderijo(s) por perto.
+ 我听说还剩 %1 个藏匿点。
+ J'ai entendu dire qu'il reste %1 planque(s)
+ Slyšel jsem, že stále existuje %1 skrytých míst.
+
+
+ very low
+ muy baja
+ sehr niedrig
+ muito baixa
+ 非常差
+ très bas
+ velmi nízká
+
+
+ low
+ baja
+ niedrig
+ baixa
+ 差
+ bas
+ nízká
+
+
+ Sir, your reputation is
+ Señor, su reputación es
+ Mein Herr, Ihr Ansehen ist
+ Senhor, sua reputação é
+ 长官, 你的声誉
+ Monsieur, votre réputation est
+ Pane, vaše pověst je taková
+
+
+ Hello ! Your reputation is
+ Hola! su reputación es
+ Hallo ! Ihr Ansehen ist
+ Olá! Sua reputação é
+ 你好! 你的声誉
+ Bonjour ! Votre réputation est
+ Ahoj ! Vaše pověst je
+
+
+ I think your reputation is
+ Creo que tu reputación es
+ Ich glaube ihr Ansehen ist
+ Eu acho que sua reputação é
+ 我觉得你的声誉
+ Je pense que ta réputation est
+ Myslím, že vaše pověst je
+
+
+ Help me!
+ Ayudame!
+ Hilf mir!
+ Me ajude!
+ 救救我!
+ Aide moi !
+ Pomoz mi!
+
+
+ I am suffering!
+ Estoy sufriendo!
+ Ich habe Schmerzen!
+ Eu estou sofrendo!
+ 我好痛苦啊!
+ Je souffre !
+ Mám bolesti!
+
+
+ Injure!
+ ¡Lesionado!
+ Ich bin Verletzt!
+ Eu estou ferido!
+ 我受伤了!
+ Blesser !
+ Jsem zraněný!
+
+
+ I have open wound!
+ ¡Tengo una herida abierta!
+ I habe offene Wunden!
+ Eu tenho feridas abertas!
+ 我受了外伤!
+ J'ai une plaie ouverte !
+ Mám otevřenou ránu!
+
+
+ I already answered to your question!
+ ¡Ya respondí a tu pregunta!
+ Ich habe Ihnen bereits alles gesagt!
+ Eu já respondi a sua pergunta!
+ 我已经回答过你的问题了!
+ J'ai déjà répondu à votre question !
+ Na vaši otázku jsem již odpověděl!
+
+
+ I've no information for you
+ No tengo información para ti.
+ Ich habe keine Informationen für Sie.
+ Eu não tenho informações para você
+ 我没有你要的情报
+ Je n'ai aucune information pour toi
+ Nemám pro vás žádné informace
+
+
+ I'll show you some hint on the map
+ Te mostraré alguna pista en el map
+ Ich habe etwas auf der Karte markiert
+ Eu vou te mostrar uma dica no mapa
+ 我会在地图上给你一些提示
+ Je vais vous montrer un indice sur la carte
+ Ukážu vám nějakou nápovědu na mapě
+
+
+ I saw a lot of militia activity towards %1, %2 meter from here. Probably there is an hideout!
+ Vi mucha actividad de la milicia en direccion a %1, %2 metros de aqui. ¡Probablemente haya un escondite!
+ Ich habe mehrer bewaffnete Personen in Richtung %1, ca. %2m entfernt, gesehen. Möglicherweise ist dort ein Versteck!
+ Eu vi várias pessoas armadas indo para %1, a cerca de %2 metros distância. Talvez haja um esconderijo!
+ 我曾经在朝着 %1 的方向见到过大量民兵活动, 离这大概有 %2 米。那可能有一个藏匿点!
+ J'ai vu beaucoup d'activités de milice vers %1, à %2 mètres d'ici. Il y as probablement une planque!
+ Viděl jsem hodně aktivity milice směrem k %1, %2 metrů odtud. Pravděpodobně tam je úkryt!
+
+
+ There are no hideout around here!
+ ¡No hay escondites por aquí!
+ Hier in der Gegend gibt es keine Verstecke!
+ Não há esconderijo por aqui!
+ 附近没有藏匿点!
+ Il n'y a pas de planque par ici !
+ Tady kolem nejsou žádné skrýše!
+
+
+ Diary log
+ Registro diario
+ Gesprächsaufzeichnung
+ Relatório
+ 日志
+ Journal de bord
+ Deník
+
+
+ Pictures of cache number %1
+ Bilder des Waffenlagers %1
+ 武器箱 %1 的照片
+ Images de la cache d'arme numéro %1
+ Obrázky čísla keše %1
+
+
+ Searching for intel . . .
+ Buscando información . . .
+ Suche Information . . .
+ Procurando por informações . . .
+ 搜寻情报中 . . .
+ Recherche d'information . . .
+ Hledání intel . . .
+
+
+ I saw some militia movement %1, %2 meter from here
+ Vi movimiento de milicia a %1, %2 metros de aqui
+ Ich habe mehrer bewaffnete Personen in Richtung %1, ca. %2m entfernt, gesehen
+ Eu vi um movimento de milícia em %1, há %2 metros daqui
+ 我在 %1 见到过民兵活动, 离这大约 %2 米
+ J'ai vu un mouvement de milice %1, à %2 mètres d'ici
+ Viděl jsem nějaké hnutí milice %1, %2 metr odtud
+
+
+ I didn't see any militia movement in this area!
+ ¡No vi ningún movimiento de milicia en esta zona!
+ Ich habe keine bewaffneten Personen in der Nähe gesehen!
+ Eu não vi nenhum movimento de milícia nesta área!
+ 我没有在这块地方见到过任何民兵活动!
+ Je n'ai vu aucun mouvement de milice dans ce secteur !
+ V této oblasti jsem neviděl žádné hnutí domobrany!
+
+
+
+
+ Show me where you want to go with your map.
+ Muéstrame dónde quieres ir con tu mapa
+ Zeig mir auf der Karte wo du hin willst.
+ Mostre-me em seu mapa onde deseja ir.
+ 拿地图给我看看你要去哪。
+ Montrez-moi où vous voulez aller avec votre carte.
+ Ukažte mi na mapě, kam chcete jet.
+
+
+ No problem. I'd love to do that.
+ No hay problema. Me encantaría hacer eso.
+ Kein Problem. Das mache ich doch gerne.
+ Sem problema. Eu te levo.
+ 没问题。我很乐意这么做。
+ Aucun problème. J'adorerais faire ça.
+ Žádný problém. Rád bych to udělal.
+
+
+ The ride should not take long. Let's go.
+ El viaje no debe tomar mucho tiempo. Vamonos.
+ Die Fahrt sollten nicht lang dauern. Also los.
+ A viagem não deve demorar muito. Vamos.
+ 去那应该用不了多久, 走吧。
+ Le trajet ne devrait pas durer longtemps. Allons-y.
+ Jízda by neměla trvat dlouho. Pojďme.
+
+
+ After what you've done for us, it's an honor to drive you. Let's go.
+ Después de lo que has hecho por nosotros, es un honor llevarte. Vamonos.
+ Nach dem was Sie alles für uns getan haben, ist es mir eine Ehre Sie zu fahren. Los geht´s.
+ Depos do que você fez por nós, é uma honra te levar. Vamos.
+ 你们为我们做了这么多, 能够开车送你是我的荣幸。我们走吧。
+ Après ce que vous avez fait pour nous, c'est un honneur de vous conduire. Allons-y.
+ Po tom, co jsi pro nás udělal, je mi ctí tě vést. Pojďme.
+
+
+ Selected area must be on land.
+ El área seleccionada debe estar en tierra
+ Der Zielort muss an Land sein.
+ A área selecionada deve ser em terra.
+ 所选区域必须在陆地上。
+ La zone sélectionnée doit être sur terre.
+ Vybraná oblast musí být na zemi.
+
+
+ I hate you! Get out!
+ ¡Te odio! ¡Fuera de aquí!
+ Ich hasse dich! Raus hier!
+ Eu odeio você! Saia!
+ 我恨你! 滚出去!
+ Je vous déteste ! Sortez !
+ Nesnáším tě! Vystoupit!
+
+
+ Get Out of my car ! You are not welcome.
+ ¡Fuera de mi coche! No eres bienvenido.
+ Raus aus meinem Auto! Du bist hier nicht willkommen.
+ Saia do meu carro! Você não é bem-vindo.
+ 滚出我的车, 这里不欢迎你。
+ Sors de ma voiture ! Tu n'es pas le bienvenu.
+ Vypadni z mého auta! Nejsi vítán.
+
+
+ I am not a taxi driver!
+ ¡No soy taxista!
+ Ich bin kein Taxifahrer!
+ Eu não sou taxista!
+ 我又不是开出租车的!
+ Je ne suis pas chauffeur de taxi !
+ Nejsem taxikář!
+
+
+ No! I go where I want!
+ ¡No! ¡Voy donde quiero!
+ Nein! Ich gehe wohin ich will!
+ Não! Eu vou onde quero!
+ 不! 老子想去哪就去哪!
+ Non ! Je vais où je veux !
+ Ne! Jdu, kam chci!
+
+
+ Thank you but I already have food
+ Dankeschön, aber ich habe schon genug Essen
+ 我已经有食物了, 谢谢
+ Děkuji, ale jídlo už mám
+ Merci mais j'ai déjà mangé
+
+
+
+
+ GET OUT
+ PARTER
+
+
+ LEAVE NOW
+ PARTER MAINTENANT
+
+
+ WE WILL KILL YOU
+ ON VA VOUS TUER
+
+
+ BE AFRAID
+ AYEZ PEUR
+
+
+ GO HOME
+ RENTRER CHEZ VOUS
+
+
+ IED EVERYWHERE
+ IED PARTOUT
+
+
+ DRONE WATCHING YOU
+ LES DRONES VOUS OBSERVENT
+
+
+ WE HATE YOU
+ ON VOUS DETESTE
+
+
+ YOU GONNA DIE
+ VOUS ALLEZ MOURIR
+
+
+
+
+
+
+ Area is not flat enough!
+ El área no es lo suficientemente plana!
+ Das Gebiet ist nicht Flach genug!
+ A área não é plana o suficiente!
+ 此区域不够平坦!
+ La zone n'est pas assez plane !
+ Oblast není dostatečně rovná!
+
+
+ Too close at the main base!
+ ¡Demasiado cerca de la base principal!
+ Zu Nahe an der Haupt-Basis!
+ Muito perto da base principal!
+ 与主基地距离太近!
+ Trop près de la base principale !
+ Příliš blízko k hlavní základně!
+
+
+ Clear the area before mounting the FOB, %1
+ Despeje el área antes de montar el FOB, %1
+ Das Gebiet ist nicht frei, es sind noch folgende Fahrzeuge im Weg: %1
+ Limpe a área antes de montar a FOB, %1
+ 该区域未清空, 还有如下载具: %1
+ Nettoyez la zone avant de monter la FOB, %1
+ Před montáží FOB vyčistěte oblast, %1
+
+
+ Do not close the dialog with esc
+ No cerrar el diálogo con "escape"
+ Den Dialog NICHT mit ESC schließen
+ Não feche a caixa de diálogo com ESC
+ 请勿使用Esc键关闭对话框
+ Ne fermez pas la boîte de dialogue avec échap
+ Nezavírejte dialog pomocí esc
+
+
+ Name your FOB!
+ Nombre su FOB!
+ FOB benennen!
+ Não feche a caixa de diálogo com esc
+ 命名FOB!
+ Nommez votre FOB !
+ Pojmenujte FOB!
+
+
+ Name already in use!
+ Nombre ya en uso!
+ Der Name wird bereits verwendet!
+ O nome já está em uso!
+ 该名称已被使用!
+ Nom déjà utilisé !
+ Název se již používá!
+
+
+ Get back! Mounting FOB
+ ¡Atrás! Montando FOB
+ Geh ein wenig zurück! Die FOB wird aufgebaut
+ Afaste-se! Montando a FOB
+ 后退! FOB装配中
+ Reculez ! Construction de la FOB en cours
+ Oddalte se! Montáž FOB
+
+
+ Dismantle, move out ...
+ Desmantelado, muévanse...
+ Abbau im gange, geh ein wenig zurück...
+ Desmontando, se afaste...
+ 正在拆除, 请远离 ...
+ Démantéllement en cours, écartez-vous...
+ Probíhá demontáž, oddalte se trochu zpět...
+
+
+ Name the FOB:
+ Nombra el FOB:
+ FOB benennen:
+ Nome da FOB:
+ 命名FOB:
+ Nommez la FOB:
+ Pojmenujte FOB:
+
+
+ This rallypoint will self-destruct in %1min.
+ Dieser Ralleypoint wird sich in %1 Minuten selbst zerstören.
+ 该集合点将在 %1 分钟后自毁。
+ Ce point de ralliement s'autodétruira dans %1min.
+ Tento rallypoint se sám zničí za %1 min.
+
+
+ Can't redeploy,
+ Du kannst nicht neu einsteigen,
+ 无法重新部署,
+ Impossible de redéployer,
+ Nelze znovu nasadit
+
+
+ you need to be stabilized
+ du musst stabilisiert werden
+ 需要稳定伤势
+ tu as besoin d'être stabilisé
+ musíte být stabilizovaní
+
+
+ you need to have a splint
+ du brauchst eine Schiene
+ 需要佩戴固定夹板
+ vous devez avoir une attelle
+ musíte mít dlahu
+
+
+
+
+ Map updated
+ Mapa actualizado
+ Karte aktualisiert
+ Mapa atualizado
+ 地图已更新
+ Carte mise à jour
+ Mapa aktualizována
+
+
+ Cache destroyed!
+ Cache destruido!
+ Waffenlager zerstört!
+ Depósito destruído!
+ 武器箱已摧毁!
+ Cache d'arme détruite !
+ Cache zničena!
+
+
+ Intel about an ammo cache found!
+ ¡Inteligencia sobre una caché de munición encontrada!
+ Informationen über ein Waffenlager gefunden!
+ Informação sobre um depósito de armas encontrada!
+ 发现了关于弹药箱的情报!
+ Intel à propos d'une cache d'arme trouvée !
+ Intel o nalezené bedni munice!
+
+
+ Hideout destroyed! %1 remaining
+ Escondite destruido! Quedan %1
+ Versteck zerstört! Verbleiben noch %1
+ Esconderijo destruído! Restando %1
+ 藏匿点已摧毁! 还有 %1 处剩余
+ Planque détruite ! %1 restant
+ Úkryt zničen! Zbývá %1
+
+
+ This body does not have any intel
+ Este cuerpo no tiene ninguna información
+ Keine Informationen gefunden
+ Este corpo não contém informação
+ 这具尸体没有任何情报
+ Ce corps n'a pas d'informations
+ Toto tělo nemá žádné informace
+
+
+ Intel about an hideout found!
+ ¡Información sobre un escondite encontrado!
+ Informationen über ein Versteck gefunden!
+ Informação sobre esconderijo encontrada!
+ 发现了关于藏匿点的情报!
+ Intel à propos d'une planque trouvée !
+ Intel o nalezeném úkrytu!
+
+
+ In the last hideout we found important intel about all the cities occupied by the Oplitas! Size the last positions held by the enemies and defeat them once and for all
+ En el último escondite encontramos información importante sobre todas las ciudades ocupadas por los Oplitas! Evalúa las últimas posiciones de los enemigos y derrótalos de una vez por todas.
+ Im letzten Versteck haben wir wichtige Informationen über alle durch die Oplitas besetzten Städte gefunden! Greife die letzten Überreste des Feindes an und besiege ihn endgültig.
+ No último esconderijo encontramos informações importantes sobre as cidades ocupadas pelos inimigos! Conquites as últimas posições dos inimigos e derrote-os de uma vez por todas
+ 在上个敌军藏匿点中, 我们发现了写有Oplitas占领的全部城市的重要情报! 夺取最后一个敌军据点, 一举消灭他们!
+ Dans la dernière planque, nous avons trouvé des informations importantes sur toutes les villes occupées par les Oplitas ! Il faut prendre les dernières positions détenues par les ennemis et les vaincre une fois pour toutes
+ V posledním úkrytu jsme našli důležité informace o všech městech obsazených Oplitas! Musíte zaujmout poslední pozice držené nepřáteli a porazit je jednou provždy
+
+
+ %1 has been deployed!
+ %1 ha sido desplegado!
+ %1 wurde bereitgestellt!
+ Implantando em %1
+ %1 已部署!
+ %1 a été déployé !
+ %1 bylo nasazeno!
+
+
+ Saving in progress... Please wait
+ Guardando... Por favor, espere
+ Es wird gespeichert... Bitte warten
+ Salvando progresso... Espere por favor
+ 正在保存, 请稍后...
+ Enregistrement en cours... Veuillez patienter
+ Probíhá ukládání... Čekejte prosím
+
+
+ Game has been saved!
+ El juego se ha guardado!
+ Spiel wurde gespeichert!
+ Jogo salvo com sucesso!
+ 游戏已保存!
+ La partie a été enregistrée !
+ Hra byla uložena!
+
+
+ Database deleted!
+ Base de datos borrada!
+ Datenbank gelöscht!
+ Banco de Dados deletado!
+ 数据库已删除!
+ Base de données supprimée !
+ Databáze smazána!
+
+
+ We got a picture of the building where the cache is:
+ Wir haben ein Bild von dem Gebäude, in dem sich das Waffenlager befinden soll:
+ 我们有一张武器箱所在房屋的照片:
+ Nous avons une photo du bâtiment où se trouve la cache d'arme :
+ Získali jsme obrázek budovy, kde je keš:
+
+
+ We got a picture of the something around the cache:
+ Wir haben ein Bild von der näheren Umgebung des Waffenlagers:
+ 我们有一张武器箱所在地的照片:
+ Nous avons une image de quelque chose autour de la cache d'arme :
+ Získali jsme obrázek něčeho kolem keše:
+
+
+ No side mission assigned
+ Keine Nebenmission zugewiesen
+ 未分配支线任务
+ Aucune mission secondaire assignée
+ Žádná vedlejší mise není přidělena
+
+
+ Isn't a side mission, can't abort
+ Nur Nebenmissionen können abgebrochen werden
+ 只能中止支线任务
+ N'est pas une mission secondaire, je ne peux pas abandonner
+ Není to vedlejší mise, nelze ji zrušit
+
+
+ Server reboot in %1min, leave it NOW!
+ Serverneustart in %1 Minuten. JETZT den Server verlassen
+ Server reboot in %1min, leave it NOW!
+ Redémarrage du serveur dans %1min, décconectez-vous maintenant !
+ Server se restartuje za %1 minut
+
+
+ Respawn ticket added
+ Respawn Ticket hinzugefügt
+ 重生票数已增加
+ Respawn ticket added
+ Ticket de respawn rajouté
+
+
+ No body bag from a player
+ Kein Leichensack eines Spielers
+ 这不是玩家的尸体袋
+ Žádný vak na tělo od hráče
+ Aucun sac mortuaire de joueur
+
+
+ %1 respawn tickets left
+ %1 Respawn Ticket übrig
+ 剩余 %1 枚重生票数
+ Zbývá %1 tiketu na respawn
+ %1 ticket de respawn restant
+
+
+ None player need ticket
+ Aucun joueur n'a besoin de ticket
+
+
+
+
+ Order a civilian to stop
+ Ordena a un civil se detenga
+ Befiehlt den Zivilisten in der Umgebung stehen zu bleiben
+ Ordem para o civil parar
+ 命令平民站住
+ Ordonner à un civil de s'arrêter
+ Nařiďte civilistovi, aby zastavil
+
+
+ Order a civilian to get down
+ Ordena a un civil que se ponga a cubierto
+ Befiehlt den Zivilisten in der Umgebung sich hinzulegen
+ Ordem para o civil deitar-se
+ 命令平民趴下
+ Ordonner à un civil de se mettre à terre
+ Přikazuje okolním civilistům, aby si lehli
+
+
+ Order a civilian to go away
+ Ordena a un civil que se vaya.
+ Befiehlt den Zivilisten in der Umgebung wegzugehen
+ Ordem para o civil ir embora
+ 命令平民走开
+ Ordonner à un civil de partir
+ Nařiďte civilistovi, aby odešel
+
+
+
+
+ No copied container!
+ Ningún contenedor copiado!
+ Kein kopierter Container gefunden!
+ O contêiner não foi copiado!
+ 未记录集装箱内容!
+ Aucun conteneur copié !
+ Žádný zkopírovaný kontejner!
+
+
+ No container around!
+ No hay contenedores alrededor!
+ Kein Container gefunden!
+ Não há contêiner em volta!
+ 附近没有集装箱!
+ Pas de conteneur autour !
+ Kolem žádný kontejner!
+
+
+ Container and cargo copied! Clear the area to paste.
+ ¡Contenedor y carga copiados! Despejar el área para pegar.
+ Container und Inhalt kopiert! Bereich freimachen, um neuen einzufügen.
+ Contêiner e carga copiados! Limpe a área para colar.
+ 集装箱及其货物已记录! 清空该区域以创建一个复制品。
+ Conteneur et cargaison copiés ! Nettoyez la zone avant de faire un coller.
+ Kontejner a obsah zkopírovány! Vyčistěte oblast pro přidání nové.
+
+
+ No copied inventory!
+ L'inventaire n'a pas été copié
+
+
+ No objects around!
+ Pas d'objet dans les environs !
+
+
+
+
+ All the hideouts are destroyed, finally the Oplitas has been defeated! Mission accomplished
+ Todos los escondites fueron destruidos, finalmente el Oplitas han sido derrotados! Misión cumplida
+ Alle Verstecke sind zerstört, nun sind die Oplitas besiegt! Mission erfüllt
+ Todos os esconderijos foram destruídos, finalmente os inimigos foram derrotados! Missão cumprida
+ 所有敌军藏匿点已被摧毁, 敌军终于被打败了! 任务完成
+ Toutes les planques sont détruites, enfin l'Oplitas a été vaincue ! Mission accomplie
+ Všechny úkryty jsou zničeny, konečně byli Oplitas poraženi! Mise splněna
+
+
+
+
+ %1 wreck
+ %1 chatarra
+ %1 Wrack
+ %1 (carcaça)
+ %1 残骸
+ Épave %1
+ %1 vrak
+
+
+ Hideout %1 destroyed
+ Escondite %1 destruído
+ Versteck %1 wurde zerstört
+ Esconderijo %1 destruído
+ 藏匿点 %1 已摧毁
+ La planque %1 est détruite
+ Úkryt %1 zničen
+
+
+ Cache %1 destroyed
+ Cache %1 destruído
+ Waffenlager %1 wurde zerstört
+ Depósito %1 destruído
+ 武器箱 %1 已摧毁
+ La cache d'arme %1 est détruite
+ Zbrojnice %1 byla zničena
+
+
+
+
+ Contaminated
+ Kontaminiert
+ 受到污染
+ Contaminé
+ Kontaminovaný
+
+
+ Not contaminated
+ Nicht kontaminiert
+ 未受污染
+ Non contaminé
+ Není kontaminován
+
+
+
+
+ No door
+ Keine Tür
+ Aucune porte
+ 附近没有门
+ Žádné dveře
+
+
+ Breaking door lock...
+ Tür aufbrechen...
+ Casser la serrure ...
+ 正在撬锁...
+ Rozbití zámku dveří...
+
+
+
+
+ No body bag around or alive enemy
+ Kein Leichensack oder Feind in der Nähe
+ 附近没有尸体袋或存活的敌军
+ Žádný vak na tělo ani živý nepřítel
+ Aucun sac mortuaire ou prisonnier autour
+
+
+ You can't copy body bag
+ Leichensäcke können nicht kopiert werden.
+ 你不能复制尸体袋
+ Nemůžete zkopírovat vak na tělo
+ Vous ne pouvez pas copier un sac mortuaire
+
+
+
+
+
+
+ Clear the area before creating another object!
+ Despeje el área antes de crear otro objeto!
+ Der Bereich muss sauber sein, bevor Sie etwas neues anfordern!
+ Limpe a área antes de criar outro objeto!
+ 在创建新的物件前, 该区域必须清空!
+ Nettoyez la zone avant de créer un autre objet !
+ Před vytvořením dalšího objektu vyčistěte oblast!
+
+
+
+
+ Can't tow!<br/>(This vehicle can't tow %1)
+ Can't tow!<br/>(Este vehículo no puede remolcar %1)
+ Abschleppen nicht möglich!<br/>(Folgende Fahrzeuge können nicht gezogen werden: %1)
+ Can't tow!<br/>(Este veículo não pode rebocar %1)
+ 无法拖车!<br/>(当前载具(后车)无法牵引如下类型的载具: %1)
+ Impossible de remorquer !<br/>(Ce véhicule ne peut pas remorquer %1)
+ Nelze odtáhnout!<br/>(Toto vozidlo nemůže odtáhnout %1)
+
+
+ Towing vehicle selected, interact with the vehicle to tow!
+ Abschleppendes Fahrzeug ausgewählt. Interagiere mit dem Fahrzeuge, welches abgeschleppt werden soll!
+ 已选择牵引车, 与被牵引车互动以启用牵引!
+ Vybráno tažné vozidlo, interagujte s vozidlem, které chcete táhnout!
+ Véhicule de remorquage sélectionné, interagir avec le véhicule à remorquer !
+
+
+ Too far!
+ Zu weit entfernt!
+ 距离太远!
+ Trop loin !
+ Příliš daleko!
+
+
+ Not align!
+ Nicht korekt ausgerichtet
+ 没有对齐!
+ Nezarovnáno!
+ Non aligné !
+
+
+ This vehicle is already attached to another!
+ Este vehículo ya está unido a otro!
+ Dieses Fahrzeug zieht bereits ein anderes Fahrzeug!
+ Este veículo já está atracado a outro!
+ 这辆载具已经连接一辆载具了!
+ Ce véhicule est déjà attaché à un autre !
+ Toto vozidlo je již připojeno k jinému!
+
+
+
+
+ Hud On\Off
+ Hud Encendido\Apagado
+ Hud An\Aus
+ Hud Ligado\Desligado
+ 启用/关闭抬头显示(HUD)
+ Hud On\Off
+ Hud On\Off
+
+
+ Hook
+ Enganchar
+ Einhaken
+ Enganchar
+ 启用牵引
+ Accrocher
+ Hook
+
+
+
+
+ Q/Z to raise/lower the object
+ Q/Z para subir/bajar el objeto
+ Q/Y zum Heben/Senken des Objekts
+ Q/Z para subir/descer o objeto
+ 按下Q/Z来调节物件高度
+ A/W pour élever/abaisser l'objet
+ Q/Z pro zvednutí/snížení objektu
+
+
+ X/C to rotate the object
+ X/C para rotar el objeto
+ X/C um das Objekt zu drehen
+ X/C para rotacionar o objeto
+ 按下X/C来旋转物体
+ X/C pour faire pivoter l'objet
+ X/C pro otočení objektu
+
+
+ F/R to tilt the object
+ F/R para inclinar el objeto
+ F/R um das Object zu neigen
+ F/R para inclinar o objeto
+ 按下F/R来倾斜物件
+ F/R pour incliner l'objet
+ F/R pro naklonění objektu
+
+
+ SHIFT to increase the movement
+ SHIFT para aumentar el movimiento
+ SHIFT um die Bewegung des Objektes zu beschleunigen
+ SHIFT para acelerar o movimento
+ 按住Shift键来增加移动速度
+ SHIFT pour augmenter la vitesse de mouvement
+ SHIFT pro zvýšení pohybu
+
+
+ Release
+ Soltar
+ Loslassen
+ Soltar
+ 释放
+ Lacher
+ Uvolnění
+
+
+
+
+ No wreck found
+ No se ha encontrado chatarra
+ Kein Wrack gefunden
+ Nenhum carcaça encontrada
+ 附近没有残骸
+ Aucune épave trouvée
+ Nebyl nalezen žádný vrak
+
+
+ It is not a wreck!
+ ¡No es chatarra!
+ Das ist kein Wrack!
+ Isso não é um carcaça!
+ 这不是残骸!
+ Ce n'est pas une épave !
+ Není to vrak!
+
+
+ This wreck will respawn
+ 此残骸将会重生
+ Dieses Wrack respawnt automatisch
+ Esta carcaça será respawnada
+ Cette épave réapparaîtra
+ Tento vrak se znovu objeví
+
+
+
+
+ No object to delete found
+ Kein Objekt zum löschen gefunden
+ 没有可删除的物件
+ Aucun objet à supprimer trouvé
+ Nebyl nalezen žádný objekt k odstranění
+
+
+ Can't delete object not created by Logistic Point
+ Objekt konnte nicht gelöscht werden, da es nicht am Logisik-Punkt erstellt worden ist
+ 只能删除由后勤点创建的物件
+ Impossible de supprimer un objet non créé par le Point Logistique
+ Nelze smazat objekt, který nevytvořil Logistic Point
+
+
+
+
+ Rearm completed.
+ Réarmement effectué.
+
+
+
+