diff --git a/TO-DO.txt b/TO-DO.txt
index d92329d..e421d33 100644
--- a/TO-DO.txt
+++ b/TO-DO.txt
@@ -1,11 +1,19 @@
TO DO:
+ - Increase AI aggressivity:
+ + Make AI more keen on moving into incoming fire to reach move positions
+ - Make AI increase their use of suppressive fire on targets
+ - Fix spawn menu camera not being used on JIP (camera is following the player, who gets teleported when switching sides)
+ - Also fix R2T camera not showing on JIP
- Fix occasional double-kill registration for an individual unit
- Maybe why kills/vehicle destruction sometimes awards double the points that it should (including headshot damage)?
- Fix loadouts sometimes not getting applied to AI units (same issue as gAI when locality changes?)
- Fix spotting animation not working (same issue as healing action)
- Implement resupply ability to support:
- - Similar animations/UI icons to medic healing, but for rearming
+ + Similar animations/UI icons to medic healing, but for rearming
- Prevent players from looting bodies/opening their gear
+ + Add score to the resupplying unit
+ + Resupply the recipient as a fraction of their overall ammunition
+ + Calculate and cache ammo count in getOverallAmmo, and invalidate the cache via onInit, onReloaded, setRoleLoadout
- Add a repair ability to the engineer role
- Implement looping action logic
- Play a short unit gesture/animation
@@ -33,6 +41,14 @@ TO DO:
- Search for "DEBUG" and "TODO" keywords
DONE:
+ - Flip kill feed horizontally (apparently it's not very readable from right to left)
+ - Add death/revive sounds
+ - Add resupplying action sounds
+ - Add medical action sounds
+ - Add automatic magazine repacking on reload
+ - Add a custom headshot sound (satisfaction factor)
+ - Fix being able to change role GVAR by selecting a new role in the spawnmenu post-spawn
+ - Fix AI medics spam-healing themselves on damage and immediately reviving unconscious units
- Fix unconsciousState AI subsystem referencing serverside variables (causing AI to not respawn)
- Fix spawn menu inconsistencies
+ Sides with no tickets don't get greyed out
diff --git a/description.ext b/description.ext
index 1d197a1..f7dd4a2 100644
--- a/description.ext
+++ b/description.ext
@@ -12,8 +12,7 @@ onLoadName = __EVAL(MACRO_MISSION_NAME);
onLoadMission = __EVAL(MACRO_MISSION_FRAMEWORK_GAMEMODE + " (v" + MACRO_MISSION_FRAMEWORK_VERSION + ")");
overviewText = __EVAL(MACRO_MISSION_FRAMEWORK_GAMEMODE + " - " + MACRO_MISSION_NAME + " (v" + MACRO_MISSION_FRAMEWORK_VERSION + ")
Made by Cre8or (C) 2019 - 2024");
-// TODO: Add custom overview and banner images
-//overviewPicture = MACRO_MISSION_OVERVIEW_IMAGE;
+overviewPicture = MACRO_MISSION_OVERVIEW_IMAGE;
loadScreen = MACRO_MISSION_LOADING_BANNER;
joinUnassigned = 0; // Auto-slot players
@@ -21,8 +20,11 @@ disabledAI = 1;
//briefing = 0;
debriefing = 0;
saving = 0;
+respawnDialog=0;
+respawn=3;
+respawnDelay=2;
allowFunctionsRecompile = __EVAL((isServer and !isDedicated) or is3DENMultiplayer or is3DENPreview);
-
+/*
showHUD[] = {
1, // Scripted HUD (same as showHUD command)
1, // Vehicle and unit info
@@ -36,7 +38,7 @@ showHUD[] = {
0, // "x killed by y" systemChat messages
1 // force show drawIcon3D icons
};
-
+*/
diff --git a/init3DEN.sqf b/init3DEN.sqf
index 0b234a5..d023b87 100644
--- a/init3DEN.sqf
+++ b/init3DEN.sqf
@@ -144,7 +144,6 @@ private _EH_eachFrame = addMissionEventHandler ["EachFrame", {
// Enforce a valid naming scheme
if (count _name != 8) then {
systemChat format ["WARNING: ""%1"" is not a valid sector name!", _name];
- //breakTo QGVAR(eden_eachFrame);
continue;
};
_letter = _name select [7, 1];
@@ -176,23 +175,45 @@ private _EH_eachFrame = addMissionEventHandler ["EachFrame", {
+
// Update the flag's texture and position on the pole to match the sector parameters
- _textureEmpty = "a3\data_f\flags\flag_white_co.paa";
_textureIcon = "a3\ui_f\data\GUI\Rsc\RscDisplayMultiplayerSetup\flag_bluefor_empty_ca.paa";
- _texture = _textureEmpty;
+ _texture = MACRO_TEXTURE_FLAG_EMPTY;
_level = 0;
_activation = (_sector get3DENAttribute "ActivationBy") # 0;
switch (_activation select [0, 4]) do {
case "EAST": {
- _texture = MACRO_FLAG_TEXTURE_EAST;
+ #if __has_include("mission\sides\data_side_east.inc")
+ _texture = (
+ #include "mission\sides\data_side_east.inc"
+ ) param [2, MACRO_TEXTURE_FLAG_EMPTY];
+ #else
+ _texture = "a3\data_f\flags\flag_red_co.paa";
+ systemChat "[CONQUEST] ERROR: A critical file is missing! (mission\sides\data_side_east.inc)";
+ #endif
+
_level = 1;
};
case "GUER": {
- _texture = MACRO_FLAG_TEXTURE_RESISTANCE;
+ #if __has_include("mission\sides\data_side_resistance.inc")
+ _texture = (
+ #include "mission\sides\data_side_resistance.inc"
+ ) param [2, MACRO_TEXTURE_FLAG_EMPTY];
+ #else
+ _texture = "a3\data_f\flags\flag_green_co.paa";
+ systemChat "[CONQUEST] ERROR: A critical file is missing! (mission\sides\data_side_resistance.inc)";
+ #endif
_level = 1;
};
case "WEST": {
- _texture = MACRO_FLAG_TEXTURE_WEST;
+ #if __has_include("mission\sides\data_side_west.inc")
+ _texture = (
+ #include "mission\sides\data_side_west.inc"
+ ) param [2, MACRO_TEXTURE_FLAG_EMPTY];
+ #else
+ _texture = "a3\data_f\flags\flag_blue_co.paa";
+ systemChat "[CONQUEST] ERROR: A critical file is missing! (mission\sides\data_side_west.inc)";
+ #endif
_level = 1;
};
};
@@ -200,7 +221,7 @@ private _EH_eachFrame = addMissionEventHandler ["EachFrame", {
// Validate the texture path
if (!fileExists _texture) then {
- _texture = _textureEmpty;
+ _texture = MACRO_TEXTURE_FLAG_EMPTY;
} else {
_textureIcon = _texture;
};
diff --git a/mission.sqm b/mission.sqm
index e70fc62..95e87bc 100644
--- a/mission.sqm
+++ b/mission.sqm
@@ -497,9 +497,6 @@ randomSeed=7845369;
class ScenarioData
{
author="Cre8or";
- respawnDialog=0;
- respawn=3;
- respawnDelay=2;
};
class CustomAttributes
{
diff --git a/mission/loadouts/data_loadouts_east.inc b/mission/loadouts/data_loadouts_east.inc
deleted file mode 100644
index 5f28bdd..0000000
--- a/mission/loadouts/data_loadouts_east.inc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
----------------------------------------- ROLE LOADOUTS (OPFOR / EAST) ----------------------------------------
-
-USAGE:
-
- 1: Copy the loadout that you want to edit (large array under every role enum macro)
- 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
- 3: Modify the loadout to your heart's content
- 4: Export the edited loadout back into the array format (either using ACE3's Arsenal, or the getUnitLoad scripting command)
- 5: Paste the loadout into the corresponding role array
- 6: Save
- 7: Done!
-
- *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA!
-
- NOTE: Even if you're not using this side, DO NOT EMPTY THIS FILE! Otherwise, things WILL break! Just leave the default values in, instead. */
-
-
-
-
-
-[
- [ // Spec Ops
- MACRO_ENUM_ROLE_SPECOPS,
- [["arifle_Katiba_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],[],["hgun_ACPC2_F","muzzle_snds_acp","","",["9Rnd_45ACP_Mag",8],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_TacVest_brn",[["9Rnd_45ACP_Mag",3,8],["30Rnd_65x39_caseless_green_mag_Tracer",6,30],["HandGrenade",1,1]]],[],"H_ShemagOpen_tan","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Sniper
- MACRO_ENUM_ROLE_SNIPER,
- [["srifle_DMR_05_tan_f","","acc_flashlight","optic_KHS_blk",["10Rnd_93x64_DMR_05_Mag",10],[],"bipod_02_F_hex"],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_FullGhillie_sard",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_Chestrig_rgr",[["HandGrenade",1,1],["APERSTripMine_Wire_Mag",1,1],["ACE_FlareTripMine_Mag",1,1],["10Rnd_93x64_DMR_05_Mag",4,10],["16Rnd_9x21_green_Mag",2,17]]],[],"","G_Balaclava_oli",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Assault
- MACRO_ENUM_ROLE_ASSAULT,
- [["arifle_Katiba_GL_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_brn",[["1Rnd_HE_Grenade_shell",3,1],["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",6,30]]],[],"H_HelmetO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Support
- MACRO_ENUM_ROLE_SUPPORT,
- [["LMG_Zafir_F","","acc_flashlight","optic_ACO_grn",["150Rnd_762x54_Box_Tracer",150],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["150Rnd_762x54_Box_Tracer",1,150],["HandGrenade",1,1]]],["B_FieldPack_cbr",[["150Rnd_762x54_Box_Tracer",2,150]]],"H_HelmetO_ocamo","G_Bandanna_beast",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Engineer
- MACRO_ENUM_ROLE_ENGINEER,
- [["arifle_ARX_hex_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1],["MineDetector",1]]],["V_TacVest_brn",[["16Rnd_9x21_green_Mag",2,17],["HandGrenade",1,1],["30Rnd_65x39_caseless_green_mag_Tracer",7,30]]],["B_AssaultPack_ocamo",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetO_ocamo","G_Bandanna_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Medic
- MACRO_ENUM_ROLE_MEDIC,
- [["arifle_CTAR_hex_F","","acc_flashlight","optic_ACO_grn",["30Rnd_580x42_Mag_Tracer_F",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_personalAidKit",2]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_580x42_Mag_Tracer_F",7,30],["SmokeShell",2,1]]],["B_AssaultPack_cbr",[["ACE_personalAidKit",16]]],"H_HelmetSpecO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Anti Tank
- MACRO_ENUM_ROLE_ANTITANK,
- [["arifle_Katiba_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],["launch_RPG32_F","","","",["RPG32_F",1],[],""],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",7,30],["HandGrenade",1,1]]],["B_Kitbag_cbr",[["RPG32_F",2,1]]],"H_HelmetO_ocamo","G_Balaclava_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ]
-]
diff --git a/mission/loadouts/data_loadouts_resistance.inc b/mission/loadouts/data_loadouts_resistance.inc
deleted file mode 100644
index 8045a36..0000000
--- a/mission/loadouts/data_loadouts_resistance.inc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
----------------------------------------- ROLE LOADOUTS (INDFOR / RESISTANCE) ----------------------------------------
-
-USAGE:
-
- 1: Copy the loadout that you want to edit (large array under every role enum macro)
- 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
- 3: Modify the loadout to your heart's content
- 4: Export the edited loadout back into the array format (either using ACE3's Arsenal, or the getUnitLoad scripting command)
- 5: Paste the loadout into the corresponding role array
- 6: Save
- 7: Done!
-
- *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA!
-
- NOTE: Even if you're not using this side, DO NOT EMPTY THIS FILE! Otherwise, things WILL break! Just leave the default values in, instead. */
-
-
-
-
-
-[
- [ // Spec Ops
- MACRO_ENUM_ROLE_SPECOPS,
- //[["arifle_TRG21_GL_F","muzzle_snds_M","acc_flashlight","optic_MRCO",["30Rnd_556x45_Stanag",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_Pistol_heavy_01_F","","","optic_MRD",["11Rnd_45ACP_Mag",11],[],""],["U_B_CTRG_3",[["ACE_fieldDressing",2],["ACE_packingBandage",3],["ACE_morphine",2],["ACE_tourniquet",2],["ACE_epinephrine",1],["ACE_salineIV_250",1],["ACE_splint",2],["SmokeShell",1,1],["Chemlight_green",1,1]]],["V_TacVestIR_blk",[["11Rnd_45ACP_Mag",2,11],["SmokeShellGreen",1,1],["Chemlight_green",1,1],["1Rnd_HE_Grenade_shell",5,1],["30Rnd_556x45_Stanag_Tracer_Red",9,30],["HandGrenade",2,1]]],["B_Carryall_green_F",[["ToolKit",1],["MineDetector",1]]],"H_Cap_khaki_specops_UK","",["Binocular","","","",[],[],""],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch","ACE_NVG_Gen4"]]
- [["arifle_TRG21_F","","acc_flashlight","optic_ACO_grn_smg",["30Rnd_556x45_Stanag_Tracer_Green",30],[],""],[],["hgun_Pistol_heavy_01_green_F","muzzle_snds_acp","acc_flashlight_pistol","",["11Rnd_45ACP_Mag",15],[],""],["U_I_CombatUniform",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_PlateCarrierIA2_dgtl",[["HandGrenade",1,1],["11Rnd_45ACP_Mag",2,15],["30Rnd_556x45_Stanag_Tracer_Green",7,30]]],[],"H_MilCap_dgtl","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Sniper
- MACRO_ENUM_ROLE_SNIPER,
- [["srifle_DMR_05_tan_f","","acc_flashlight","optic_KHS_blk",["10Rnd_93x64_DMR_05_Mag",10],[],"bipod_02_F_hex"],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_FullGhillie_sard",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_Chestrig_rgr",[["HandGrenade",1,1],["APERSTripMine_Wire_Mag",1,1],["ACE_FlareTripMine_Mag",1,1],["10Rnd_93x64_DMR_05_Mag",4,10],["16Rnd_9x21_green_Mag",2,17]]],[],"","G_Balaclava_oli",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Assault
- MACRO_ENUM_ROLE_ASSAULT,
- [["arifle_Katiba_GL_F","","acc_flashlight","optic_ACO_grn_smg",["30Rnd_65x39_caseless_green_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_I_CombatUniform",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_brn",[["1Rnd_HE_Grenade_shell",3,1],["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",6,30]]],[],"H_HelmetO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Support
- MACRO_ENUM_ROLE_SUPPORT,
- [["LMG_Zafir_F","","acc_flashlight","optic_ACO_grn_smg",["150Rnd_762x54_Box_Tracer",150],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_I_CombatUniform_shortsleeve",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["150Rnd_762x54_Box_Tracer",1,150],["HandGrenade",1,1]]],["B_FieldPack_cbr",[["150Rnd_762x54_Box_Tracer",2,150]]],"H_HelmetO_ocamo","G_Bandanna_beast",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Engineer
- MACRO_ENUM_ROLE_ENGINEER,
- [["arifle_ARX_hex_F","","acc_flashlight","optic_ACO_grn_smg",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_I_CombatUniform",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1],["MineDetector",1]]],["V_TacVest_brn",[["16Rnd_9x21_green_Mag",2,17],["HandGrenade",1,1],["30Rnd_65x39_caseless_green_mag_Tracer",7,30]]],["B_AssaultPack_ocamo",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetO_ocamo","G_Bandanna_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Medic
- MACRO_ENUM_ROLE_MEDIC,
- [["arifle_CTAR_hex_F","","acc_flashlight","optic_ACO_grn_smg",["30Rnd_580x42_Mag_Tracer_F",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_I_CombatUniform",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_personalAidKit",2]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_580x42_Mag_Tracer_F",7,30],["SmokeShell",2,1]]],["B_AssaultPack_cbr",[["ACE_personalAidKit",16]]],"H_HelmetSpecO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Anti Tank
- MACRO_ENUM_ROLE_ANTITANK,
- [["arifle_Katiba_F","","acc_flashlight","optic_ACO_grn_smg",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],["launch_RPG32_F","","","",["RPG32_F",1],[],""],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_I_CombatUniform",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",7,30],["HandGrenade",1,1]]],["B_Kitbag_cbr",[["RPG32_F",2,1]]],"H_HelmetO_ocamo","G_Balaclava_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ]
-]
diff --git a/mission/loadouts/data_loadouts_west.inc b/mission/loadouts/data_loadouts_west.inc
deleted file mode 100644
index c9bc80d..0000000
--- a/mission/loadouts/data_loadouts_west.inc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
----------------------------------------- ROLE LOADOUTS (BLUFOR / WEST) ----------------------------------------
-
-USAGE:
-
- 1: Copy the loadout that you want to edit (large array under every role enum macro)
- 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
- 3: Modify the loadout to your heart's content
- 4: Export the edited loadout back into the array format (either using ACE3's Arsenal, or the getUnitLoad scripting command)
- 5: Paste the loadout into the corresponding role array
- 6: Save
- 7: Done!
-
- *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA!
-
- NOTE: Even if you're not using this side, DO NOT EMPTY THIS FILE! Otherwise, things WILL break! Just leave the default values in, instead. */
-
-
-
-
-
-[
- [ // Spec Ops
- MACRO_ENUM_ROLE_SPECOPS,
- [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],[],["hgun_Pistol_heavy_01_MRD_F","muzzle_snds_acp","acc_flashlight_pistol","",["11Rnd_45ACP_Mag",11],[],""],["U_B_CombatUniform_mcam",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_PlateCarrier2_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["HandGrenade",1,1],["11Rnd_45ACP_Mag",2,11]]],[],"H_Cap_headphones","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Sniper
- MACRO_ENUM_ROLE_SNIPER,
- [["srifle_DMR_02_camo_F","","acc_flashlight","optic_KHS_blk",["10Rnd_338_Mag",10],[],"bipod_01_F_blk"],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_FullGhillie_sard",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1]]],["V_Chestrig_rgr",[["HandGrenade",1,1],["APERSTripMine_Wire_Mag",1,1],["ACE_FlareTripMine_Mag",1,1],["16Rnd_9x21_red_Mag",2,17],["10Rnd_338_Mag",4,10]]],[],"","G_Bandanna_tan",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Assault
- MACRO_ENUM_ROLE_ASSAULT,
- [["arifle_MX_GL_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_PlateCarrier1_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["16Rnd_9x21_red_Mag",2,17],["1Rnd_HE_Grenade_shell",2,1]]],[],"H_HelmetSpecB","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Support
- MACRO_ENUM_ROLE_SUPPORT,
- [["LMG_03_F","","acc_flashlight","",["200Rnd_556x45_Box_Tracer_Red_F",200],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam_vest",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_PlateCarrier1_rgr",[["200Rnd_556x45_Box_Tracer_Red_F",2,200],["HandGrenade",1,1],["16Rnd_9x21_red_Mag",2,17]]],["B_Kitbag_mcamo",[]],"H_HelmetB_sand","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Engineer
- MACRO_ENUM_ROLE_ENGINEER,
- [["SMG_02_F","","acc_flashlight","optic_Aco",["30Rnd_9x21_Mag_SMG_02_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_DefusalKit",1],["MineDetector",1]]],["V_PlateCarrier2_rgr",[["16Rnd_9x21_red_Mag",2,17],["HandGrenade",1,1],["30Rnd_9x21_Mag_SMG_02_Tracer_Red",9,30]]],["B_AssaultPack_khk",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetB_grass","G_Balaclava_TI_blk_F",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Medic
- MACRO_ENUM_ROLE_MEDIC,
- [["arifle_SPAR_01_blk_F","","acc_flashlight","optic_Holosight_blk_F",["30Rnd_556x45_Stanag_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["ACE_elasticBandage",10],["ACE_morphine",5],["ACE_personalAidKit",2]]],["V_PlateCarrier1_rgr",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_556x45_Stanag_Tracer_Red",7,30],["SmokeShell",2,1]]],["B_AssaultPack_mcamo",[["ACE_personalAidKit",16]]],"H_HelmetB_camo","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ],
-
-
-
-
-
- [ // Anti Tank
- MACRO_ENUM_ROLE_ANTITANK,
- [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],["launch_MRAWS_olive_rail_F","","","",["MRAWS_HEAT_F",1],[],""],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["ACE_elasticBandage",10],["ACE_morphine",5]]],["V_PlateCarrier_Kerry",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_65x39_caseless_black_mag_Tracer",7,30]]],["B_Kitbag_rgr",[["MRAWS_HEAT_F",2,1]]],"H_HelmetB_snakeskin","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
- ]
-]
diff --git a/mission/res/overview.paa b/mission/res/overview.paa
new file mode 100644
index 0000000..4c1f8bf
Binary files /dev/null and b/mission/res/overview.paa differ
diff --git a/mission/settings.inc b/mission/settings.inc
index 20aa984..d2fe662 100644
--- a/mission/settings.inc
+++ b/mission/settings.inc
@@ -4,7 +4,7 @@
#define MACRO_MISSION_NAME "Gulf of Malden"
- #define MACRO_MISSION_OVERVIEW_IMAGE "mission\res\overview.paa"
+ #define MACRO_MISSION_OVERVIEW_IMAGE ""
#define MACRO_MISSION_LOADING_BANNER "mission\res\banner.paa"
@@ -24,17 +24,6 @@
#define MACRO_AI_SPAWNWEIGHT_RESISTANCE 0 // The weight towards spawning AI on the "resistance" (INDFOR) side
#define MACRO_AI_SPAWNWEIGHT_WEST 1 // The weight towards spawning AI on the "west" (BLUFOR) side
- // NOTE: Faces and voices parameters can either accept a single value (e.g. "farsi"), or an array of values (e.g. ["polish", "russian"])
- // Accepted values for voices are: "chinese", "english_fr", "english_gr", "english_uk", "english_us", "farsi", "french", "polish", "russian"
- #define MACRO_AI_VOICES_EAST "farsi"
- #define MACRO_AI_VOICES_RESISTANCE "english_gr"
- #define MACRO_AI_VOICES_WEST "english_us"
-
- // Accepted values for faces are: "african", "african_camo", "asian", "asian_camo", "greek", "greek_camo", "livonian", "persian", "persian_camo", "russian", "tanoan", "white", "white_camo"
- #define MACRO_AI_FACES_EAST ["persian", "persian_camo"]
- #define MACRO_AI_FACES_RESISTANCE "greek"
- #define MACRO_AI_FACES_WEST ["white", "livonian", "african"]
-
@@ -43,8 +32,8 @@
// GAMEPLAY SETTINGS
// ----------------------------------------------------------------------------------------------------------------------------------
// To modify the following properties, refer to the code snippets in the respective comments behind them
- #define MACRO_MISSION_CAMERAPOSITION [5233.83,9852.79,223.421] // The position of the camera when showing the spawn menu - acquired via: getPosWorld get3DENCamera
- #define MACRO_MISSION_CAMERADIRECTION [0.996809,-0.0793498,0.0157021] // The diorection of the camera when showing the spawn menu - acquired via: vectorDir get3DENCamera
+ #define MACRO_MISSION_CAMERAPOSITION [5233.83,9852.79,223.421] // The position of the camera when showing the spawn menu. Acquired via: copyToClipboard str getPosWorld get3DENCamera
+ #define MACRO_MISSION_CAMERADIRECTION [0.996809,-0.0793498,0.0157021] // The diorection of the camera when showing the spawn menu. Acquired via: copyToClipboard str vectorDir get3DENCamera
// Gamemode
#define MACRO_GM_STARTINGTICKETS 200 // How many respawn tickets each side should start with
@@ -56,7 +45,7 @@
// Damage balancing
#define MACRO_GM_UNIT_DAMAGEMUL_HEADSHOT 3 // Multiplier for the damage dealt by headshots
- #define MACRO_GM_UNIT_DAMAGEMUL_BULLET 1 // Multiplier for the damage units receive from that bullet hits
+ #define MACRO_GM_UNIT_DAMAGEMUL_BULLET 1.5 // Multiplier for the damage units receive from that bullet hits
#define MACRO_GM_UNIT_DAMAGEMUL_EXPLOSIVE 1 // Multiplier for the damage units receive from explosions
#define MACRO_GM_UNIT_DAMAGEMUL_FALLDAMAGE 1 // Multiplier for the damage units receive from falling
#define MACRO_GM_UNIT_DAMAGEMUL_ROADKILL 1 // Multiplier for the damage units receive when getting hit/run over by vehicles
@@ -68,21 +57,6 @@
-// ----------------------------------------------------------------------------------------------------------------------------------
-// SIDES
-// ----------------------------------------------------------------------------------------------------------------------------------
- #define MACRO_SIDE_NAME_EAST "CSAT"
- #define MACRO_SIDE_NAME_RESISTANCE "AAF"
- #define MACRO_SIDE_NAME_WEST "NATO"
-
- #define MACRO_FLAG_TEXTURE_EAST "a3\data_f\Flags\flag_CSAT_co.paa"
- #define MACRO_FLAG_TEXTURE_RESISTANCE "a3\data_f\Flags\flag_AAF_co.paa"
- #define MACRO_FLAG_TEXTURE_WEST "a3\data_f\Flags\flag_nato_co.paa"
-
-
-
-
-
// ----------------------------------------------------------------------------------------------------------------------------------
// LOADOUTS
// ----------------------------------------------------------------------------------------------------------------------------------
diff --git a/mission/sides/data_side_east.inc b/mission/sides/data_side_east.inc
new file mode 100644
index 0000000..df00586
--- /dev/null
+++ b/mission/sides/data_side_east.inc
@@ -0,0 +1,111 @@
+/*
+---------------------------------------- SIDE DATA FILE (OPFOR / EAST) ----------------------------------------
+
+USAGE:
+
+ Modifying loadouts:
+ 1: Copy the loadout that you want to edit (large array under every role enum macro)
+ 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
+ 3: Modify the loadout to your heart's content
+ 4: Export the edited loadout back into the array format (using the getUnitLoad scripting command)
+ 5: Paste the loadout into the corresponding role array
+ 6: Save
+ 7: Done!
+
+ *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA! */
+
+#include "..\..\res\common\macros.inc"
+
+
+
+
+
+[
+ // Side name (short format, ideally 5 characters or less)
+ "CSAT",
+
+ // Side name (long format, ideally up to 40 characters)
+ "Canton Protocol Strategic Alliance Treaty",
+
+ // Texture path to a flag representing this side (ArmA 3 has many country flags you can use)
+ "a3\data_f\Flags\flag_CSAT_co.paa",
+
+ // The sets of faces that AI units on this side should use. Intended for immersion.
+ // Possible values: "african", "african_camo", "asian", "asian_camo", "greek", "greek_camo", "livonian", "persian", "persian_camo", "russian", "tanoan", "white", "white_camo"
+ // NOTE: This setting accepts a single value (e.g. "greek"), or an array of values (e.g. ["african", "african_camo"])
+ ["persian", "persian_camo"],
+
+ // The spoken voice presets that AI units on this side should use (for things like automatic call-outs). Intended for immersion.
+ // Possible values: "chinese", "english_fr", "english_gr", "english_uk", "english_us", "farsi", "french", "polish", "russian"
+ // NOTE: This setting accepts a single value (e.g. "farsi"), or an array of values (e.g. ["english_uk", "english_us"])
+ "farsi",
+
+
+
+
+
+ // Loadouts
+ [
+ [ // Spec Ops
+ MACRO_ENUM_ROLE_SPECOPS,
+ [["arifle_Katiba_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],[],["hgun_ACPC2_F","muzzle_snds_acp","","",["9Rnd_45ACP_Mag",8],[],""],["U_O_CombatUniform_ocamo",[]],["V_TacVest_brn",[["9Rnd_45ACP_Mag",3,8],["30Rnd_65x39_caseless_green_mag_Tracer",6,30],["HandGrenade",1,1]]],[],"H_ShemagOpen_tan","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Sniper
+ MACRO_ENUM_ROLE_SNIPER,
+ [["srifle_DMR_05_tan_f","","acc_flashlight","optic_KHS_blk",["10Rnd_93x64_DMR_05_Mag",10],[],"bipod_02_F_hex"],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_FullGhillie_sard",[]],["V_Chestrig_rgr",[["HandGrenade",1,1],["10Rnd_93x64_DMR_05_Mag",5,10],["16Rnd_9x21_green_Mag",2,17]]],[],"","G_Balaclava_oli",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Assault
+ MACRO_ENUM_ROLE_ASSAULT,
+ [["arifle_Katiba_GL_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[]],["V_TacVest_brn",[["1Rnd_HE_Grenade_shell",4,1],["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",6,30]]],[],"H_HelmetO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Support
+ MACRO_ENUM_ROLE_SUPPORT,
+ [["LMG_Zafir_F","","acc_flashlight","optic_ACO_grn",["150Rnd_762x54_Box_Tracer",150],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["150Rnd_762x54_Box_Tracer",1,150],["HandGrenade",1,1]]],["B_FieldPack_cbr",[["150Rnd_762x54_Box_Tracer",2,150]]],"H_HelmetO_ocamo","G_Bandanna_beast",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_RESUPPLY]
+ ],
+
+
+
+
+
+ [ // Engineer
+ MACRO_ENUM_ROLE_ENGINEER,
+ [["arifle_ARX_hex_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[["MineDetector",1]]],["V_TacVest_brn",[["16Rnd_9x21_green_Mag",2,17],["HandGrenade",1,1],["30Rnd_65x39_caseless_green_mag_Tracer",7,30]]],["B_AssaultPack_ocamo",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetO_ocamo","G_Bandanna_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_REPAIR]
+ ],
+
+
+
+
+
+ [ // Medic
+ MACRO_ENUM_ROLE_MEDIC,
+ [["arifle_CTAR_hex_F","","acc_flashlight","optic_ACO_grn",["30Rnd_580x42_Mag_Tracer_F",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_580x42_Mag_Tracer_F",7,30],["SmokeShell",2,1]]],["B_AssaultPack_cbr",[]],"H_HelmetSpecO_ocamo","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_HEAL]
+ ],
+
+
+
+
+
+ [ // Anti Tank
+ MACRO_ENUM_ROLE_ANTITANK,
+ [["arifle_Katiba_F","","acc_flashlight","optic_ACO_grn",["30Rnd_65x39_caseless_green_mag_Tracer",30],[],""],["launch_RPG32_F","","","",["RPG32_F",1],[],""],["hgun_Rook40_F","","","",["16Rnd_9x21_green_Mag",17],[],""],["U_O_CombatUniform_ocamo",[]],["V_TacVest_khk",[["16Rnd_9x21_green_Mag",2,17],["30Rnd_65x39_caseless_green_mag_Tracer",7,30],["HandGrenade",1,1]]],["B_Kitbag_cbr",[["RPG32_F",2,1]]],"H_HelmetO_ocamo","G_Balaclava_blk",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ]
+ ]
+]
diff --git a/mission/sides/data_side_resistance.inc b/mission/sides/data_side_resistance.inc
new file mode 100644
index 0000000..21d13f4
--- /dev/null
+++ b/mission/sides/data_side_resistance.inc
@@ -0,0 +1,111 @@
+/*
+---------------------------------------- SIDE DATA FILE (INDFOR / RESISTANCE) ----------------------------------------
+
+USAGE:
+
+ Modifying loadouts:
+ 1: Copy the loadout that you want to edit (large array under every role enum macro)
+ 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
+ 3: Modify the loadout to your heart's content
+ 4: Export the edited loadout back into the array format (using the getUnitLoad scripting command)
+ 5: Paste the loadout into the corresponding role array
+ 6: Save
+ 7: Done!
+
+ *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA! */
+
+#include "..\..\res\common\macros.inc"
+
+
+
+
+
+[
+ // Side name (short format, ideally 5 characters or less)
+ "AAF",
+
+ // Side name (long format, ideally up to 40 characters)
+ "Altis Armed Forces",
+
+ // Texture path to a flag representing this side (ArmA 3 has many country flags you can use)
+ "a3\data_f\Flags\flag_AAF_co.paa",
+
+ // The sets of faces that AI units on this side should use. Intended for immersion.
+ // Possible values: "african", "african_camo", "asian", "asian_camo", "greek", "greek_camo", "livonian", "persian", "persian_camo", "russian", "tanoan", "white", "white_camo"
+ // NOTE: This setting accepts a single value (e.g. "greek"), or an array of values (e.g. ["african", "african_camo"])
+ "english_gr",
+
+ // The spoken voice presets that AI units on this side should use (for things like automatic call-outs). Intended for immersion.
+ // Possible values: "chinese", "english_fr", "english_gr", "english_uk", "english_us", "farsi", "french", "polish", "russian"
+ // NOTE: This setting accepts a single value (e.g. "farsi"), or an array of values (e.g. ["english_uk", "english_us"])
+ ["greek", "greek_camo"],
+
+
+
+
+
+ // Loadouts
+ [
+ [ // Spec Ops
+ MACRO_ENUM_ROLE_SPECOPS,
+ [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],[],["hgun_Pistol_heavy_01_MRD_F","muzzle_snds_acp","acc_flashlight_pistol","",["11Rnd_45ACP_Mag",11],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier2_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["HandGrenade",1,1],["11Rnd_45ACP_Mag",2,11]]],[],"H_Cap_headphones","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Sniper
+ MACRO_ENUM_ROLE_SNIPER,
+ [["srifle_DMR_02_camo_F","","acc_flashlight","optic_KHS_blk",["10Rnd_338_Mag",10],[],"bipod_01_F_blk"],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_FullGhillie_sard",[]],["V_Chestrig_rgr",[["HandGrenade",1,1],["16Rnd_9x21_red_Mag",2,17],["10Rnd_338_Mag",5,10]]],[],"","G_Bandanna_tan",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Assault
+ MACRO_ENUM_ROLE_ASSAULT,
+ [["arifle_MX_GL_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier1_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["16Rnd_9x21_red_Mag",2,17],["1Rnd_HE_Grenade_shell",4,1]]],[],"H_HelmetSpecB","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Support
+ MACRO_ENUM_ROLE_SUPPORT,
+ [["LMG_03_F","","acc_flashlight","",["200Rnd_556x45_Box_Tracer_Red_F",200],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam_vest",[]],["V_PlateCarrier1_rgr",[["200Rnd_556x45_Box_Tracer_Red_F",2,200],["HandGrenade",1,1],["16Rnd_9x21_red_Mag",2,17]]],["B_Kitbag_mcamo",[]],"H_HelmetB_sand","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_RESUPPLY]
+ ],
+
+
+
+
+
+ [ // Engineer
+ MACRO_ENUM_ROLE_ENGINEER,
+ [["SMG_02_F","","acc_flashlight","optic_Aco",["30Rnd_9x21_Mag_SMG_02_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["MineDetector",1]]],["V_PlateCarrier2_rgr",[["16Rnd_9x21_red_Mag",2,17],["HandGrenade",1,1],["30Rnd_9x21_Mag_SMG_02_Tracer_Red",9,30]]],["B_AssaultPack_khk",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetB_grass","G_Balaclava_TI_blk_F",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_REPAIR]
+ ],
+
+
+
+
+
+ [ // Medic
+ MACRO_ENUM_ROLE_MEDIC,
+ [["arifle_SPAR_01_blk_F","","acc_flashlight","optic_Holosight_blk_F",["30Rnd_556x45_Stanag_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier1_rgr",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_556x45_Stanag_Tracer_Red",7,30],["SmokeShell",2,1]]],["B_AssaultPack_mcamo",[]],"H_HelmetB_camo","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_HEAL]
+ ],
+
+
+
+
+
+ [ // Anti Tank
+ MACRO_ENUM_ROLE_ANTITANK,
+ [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],["launch_MRAWS_olive_rail_F","","","",["MRAWS_HEAT_F",1],[],""],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier_Kerry",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_65x39_caseless_black_mag_Tracer",7,30]]],["B_Kitbag_rgr",[["MRAWS_HEAT_F",2,1]]],"H_HelmetB_snakeskin","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ]
+ ]
+]
diff --git a/mission/sides/data_side_west.inc b/mission/sides/data_side_west.inc
new file mode 100644
index 0000000..1fc66e3
--- /dev/null
+++ b/mission/sides/data_side_west.inc
@@ -0,0 +1,111 @@
+/*
+---------------------------------------- SIDE DATA FILE (BLUFOR / WEST) ----------------------------------------
+
+USAGE:
+
+ Modifying loadouts:
+ 1: Copy the loadout that you want to edit (large array under every role enum macro)
+ 2: Apply the loadout onto yourself (either using ACE3's Arsenal, or the setUnitLoadout scripting command)
+ 3: Modify the loadout to your heart's content
+ 4: Export the edited loadout back into the array format (using the getUnitLoad scripting command)
+ 5: Paste the loadout into the corresponding role array
+ 6: Save
+ 7: Done!
+
+ *DO NOT ADD ANYTHING ELSE* - NOT EVEN A COMMA (,) OR A SEMICOLON (;) AT THE END OF THE FILE! NOTHING! NYET! NADA! */
+
+#include "..\..\res\common\macros.inc"
+
+
+
+
+
+[
+ // Side name (short format, ideally 5 characters or less)
+ "NATO",
+
+ // Side name (long format, ideally up to 40 characters)
+ "North Atlantic Treaty Organisation",
+
+ // Texture path to a flag representing this side (ArmA 3 has many country flags you can use)
+ "a3\data_f\Flags\flag_nato_co.paa",
+
+ // The sets of faces that AI units on this side should use. Intended for immersion.
+ // Possible values: "african", "african_camo", "asian", "asian_camo", "greek", "greek_camo", "livonian", "persian", "persian_camo", "russian", "tanoan", "white", "white_camo"
+ // NOTE: This setting accepts a single value (e.g. "greek"), or an array of values (e.g. ["african", "african_camo"])
+ ["white", "white_camo", "livonian", "african"],
+
+ // The spoken voice presets that AI units on this side should use (for things like automatic call-outs). Intended for immersion.
+ // Possible values: "chinese", "english_fr", "english_gr", "english_uk", "english_us", "farsi", "french", "polish", "russian"
+ // NOTE: This setting accepts a single value (e.g. "farsi"), or an array of values (e.g. ["english_uk", "english_us"])
+ "english_us",
+
+
+
+
+
+ // Loadouts
+ [
+ [ // Spec Ops
+ MACRO_ENUM_ROLE_SPECOPS,
+ [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],[],["hgun_Pistol_heavy_01_MRD_F","muzzle_snds_acp","acc_flashlight_pistol","",["11Rnd_45ACP_Mag",11],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier2_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["HandGrenade",1,1],["11Rnd_45ACP_Mag",2,11]]],[],"H_Cap_headphones","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Sniper
+ MACRO_ENUM_ROLE_SNIPER,
+ [["srifle_DMR_02_camo_F","","acc_flashlight","optic_KHS_blk",["10Rnd_338_Mag",10],[],"bipod_01_F_blk"],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_FullGhillie_sard",[]],["V_Chestrig_rgr",[["HandGrenade",1,1],["16Rnd_9x21_red_Mag",2,17],["10Rnd_338_Mag",5,10]]],[],"","G_Bandanna_tan",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Assault
+ MACRO_ENUM_ROLE_ASSAULT,
+ [["arifle_MX_GL_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],["1Rnd_HE_Grenade_shell",1],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier1_rgr",[["30Rnd_65x39_caseless_black_mag_Tracer",7,30],["16Rnd_9x21_red_Mag",2,17],["1Rnd_HE_Grenade_shell",4,1]]],[],"H_HelmetSpecB","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ],
+
+
+
+
+
+ [ // Support
+ MACRO_ENUM_ROLE_SUPPORT,
+ [["LMG_03_F","","acc_flashlight","",["200Rnd_556x45_Box_Tracer_Red_F",200],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam_vest",[]],["V_PlateCarrier1_rgr",[["200Rnd_556x45_Box_Tracer_Red_F",2,200],["HandGrenade",1,1],["16Rnd_9x21_red_Mag",2,17]]],["B_Kitbag_mcamo",[]],"H_HelmetB_sand","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_RESUPPLY]
+ ],
+
+
+
+
+
+ [ // Engineer
+ MACRO_ENUM_ROLE_ENGINEER,
+ [["SMG_02_F","","acc_flashlight","optic_Aco",["30Rnd_9x21_Mag_SMG_02_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[["MineDetector",1]]],["V_PlateCarrier2_rgr",[["16Rnd_9x21_red_Mag",2,17],["HandGrenade",1,1],["30Rnd_9x21_Mag_SMG_02_Tracer_Red",9,30]]],["B_AssaultPack_khk",[["SLAMDirectionalMine_Wire_Mag",3,1]]],"H_HelmetB_grass","G_Balaclava_TI_blk_F",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_REPAIR]
+ ],
+
+
+
+
+
+ [ // Medic
+ MACRO_ENUM_ROLE_MEDIC,
+ [["arifle_SPAR_01_blk_F","","acc_flashlight","optic_Holosight_blk_F",["30Rnd_556x45_Stanag_Tracer_Red",30],[],""],[],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier1_rgr",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_556x45_Stanag_Tracer_Red",7,30],["SmokeShell",2,1]]],["B_AssaultPack_mcamo",[]],"H_HelmetB_camo","G_Combat",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]],
+ [MACRO_ENUM_LOADOUT_ABILITY_HEAL]
+ ],
+
+
+
+
+
+ [ // Anti Tank
+ MACRO_ENUM_ROLE_ANTITANK,
+ [["arifle_MX_Black_F","","acc_flashlight","optic_Aco",["30Rnd_65x39_caseless_black_mag_Tracer",30],[],""],["launch_MRAWS_olive_rail_F","","","",["MRAWS_HEAT_F",1],[],""],["hgun_P07_F","","","",["16Rnd_9x21_red_Mag",17],[],""],["U_B_CombatUniform_mcam",[]],["V_PlateCarrier_Kerry",[["16Rnd_9x21_red_Mag",2,17],["30Rnd_65x39_caseless_black_mag_Tracer",7,30]]],["B_Kitbag_rgr",[["MRAWS_HEAT_F",2,1]]],"H_HelmetB_snakeskin","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]
+ ]
+ ]
+]
diff --git a/res/common/macros.inc b/res/common/macros.inc
index 8ad4b39..b6a684c 100644
--- a/res/common/macros.inc
+++ b/res/common/macros.inc
@@ -225,7 +225,7 @@
// End Screen
#define MACRO_POS_ES_TOP_TEXTSIZE MACRO_UI_TEXTSIZE_5
- #define MACRO_POS_ES_TICKETS_TEXTSIZE MACRO_UI_TEXTSIZE_2
+ #define MACRO_POS_ES_TICKETS_TEXTSIZE MACRO_UI_TEXTSIZE_3
// Kill Feed
#define MACRO_POS_KF_Y (0.25 * safeZoneH)
@@ -305,9 +305,9 @@
#define MACRO_UI_SECTORFLAGS_SCALEOFFSET 0.03 // When zooming in on the map, the sector flag icons will eventually increase to twice their normal size. This offset lets you choose at which zoom level this transition should happen. Larger numbers lean towards "zoomed out", smaller numbers towards "zoomed in" (logarithmic scale). Accepted range is 0 to 1
// Unit Icons
- #define MACRO_UI_ICONS3D_MAXDISTANCE_INF 300 // The maximum distance, in meters, at which infantry 3D icons are visible
- #define MACRO_UI_ICONS3D_MAXDISTANCE_VEH 1000 // The maximum distance, in meters, at which vehicle 3D icons are visible
- #define MACRO_UI_ICONS3D_MAXDISTANCE_MEDIC 80 // The maximum distance, in meters, at which medic-specific infantry icons (units in need of healing, and nearby medics) are visible
+ #define MACRO_UI_ICONS3D_MAXDISTANCE_INF 500 // The maximum distance, in meters, at which infantry 3D icons are visible
+ #define MACRO_UI_ICONS3D_MAXDISTANCE_VEH 1500 // The maximum distance, in meters, at which vehicle 3D icons are visible
+ #define MACRO_UI_ICONS3D_MAXDISTANCE_ROLEACTION 80 // The maximum distance, in meters, at which role-specific infantry icons (healing/resupplying/repairing) are visible
// Combat Area
#define MACRO_CA_CORNEROFFSET 50000 // How much the combat area should overextend (beyond the map corners), in meters
@@ -320,6 +320,8 @@
#define MACRO_FONT_UI_THIN "PuristaLight"
#define MACRO_FONT_UI_MEDIUM "PuristaMedium"
+ #define MACRO_TEXTURE_FLAG_EMPTY "a3\data_f\flags\flag_white_co.paa"
+
@@ -361,18 +363,22 @@
// Actions
#define MACRO_ACT_SPOTTING_MINVISIBILITY 0.5 // The minimum threshold that visibility checks must exceed for a target to be considered spottable (return value of checkVisibility)
#define MACRO_ACT_SPOTTING_DURATION 6 // How long, in seconds, a hostile unit/vehicle is visible for when spotted
- #define MACRO_ACT_SPOTTING_COOLDOWNDURATION 17 // How long the spotting action remains blocked for, in seconds, when in cooldown
- #define MACRO_ACT_SPOTTING_COSTPERUSE 4 // How much it costs to use the spotting action. Divice the cooldown duration by this value to determine how often the action may be triggered (at once) before entering cooldown
+ #define MACRO_ACT_SPOTTING_COOLDOWNDURATION 15 // How long the spotting action remains blocked for, in seconds, when in cooldown
+ #define MACRO_ACT_SPOTTING_COSTPERUSE 2 // How much it costs to use the spotting action. Divice the cooldown duration by this value to determine how often the action may be triggered (at once) before entering cooldown
+
+ #define MACRO_ACT_RESUPPLYUNIT_MAXDISTANCE 2 // The distance, in meters, below which support units must be to friendly units in order to resupply them
+ #define MACRO_ACT_RESUPPLYUNIT_AMOUNT 0.1 // The amount of ammunition that is added to friendly units upon resupplying, expressed as fraction of their loadout's maximum ammunition
+ #define MACRO_ACT_RESUPPLYUNIT_COOLDOWN 1 // The cooldown duration, in seconds, between consecutive resupply actions
#define MACRO_ACT_HEALUNIT_MAXDISTANCE 2 // The distance, in meters, below which medics must be to their patients in order to heal them
#define MACRO_ACT_HEALUNIT_AMOUNT 0.15 // The amount of health that is added to patients upon healing, expressed as fraction of their maximum health
- #define MACRO_ACT_HEALUNIT_COOLDOWN 1 // The cooldown duration, in seconds, between two consecutive healing actions that medics must wait
+ #define MACRO_ACT_HEALUNIT_COOLDOWN 1 // The cooldown duration, in seconds, between consecutive healing actions
#define MACRO_KEYBIND_TOGGLESPAWNMENU DIK_F1
- #define MACRO_KEYBIND_HEAL DIK_4
- #define MACRO_KEYBIND_REARM DIK_5
- #define MACRO_KEYBIND_REPAIR DIK_6
#define MACRO_KEYBIND_GIVEUP DIK_SPACE
+ #define MACRO_KEYBIND_RESUPPLY DIK_4
+ #define MACRO_KEYBIND_REPAIR DIK_4
+ #define MACRO_KEYBIND_HEAL DIK_4
// Combat Area
#define MACRO_CA_PLAYER_INTERVAL 0.1 // The interval, in seconds, between two consecutive combat area checks for the player
@@ -402,13 +408,16 @@
#define MACRO_AI_DRIVERCONTROL_INTERVAL 0.25 // Interval, in seconds, between two update cycles of the AI driverControl system (each vehicle driver gets updated every this often)
#define MACRO_AI_COMMANDER_INTERVAL 0.25 // Interval, in seconds, between two update cycles of the AI commander system (per side; * 3 for a full cycle)
#define MACRO_AI_DOMOVEINTERVAL 5 // The interval, in seconds, between two doMove commands being issued to AI units (as they sometimes need to be rescheduled to move)
- #define MACRO_AI_MEDICAL_MAXACTIONDISTANCE 20 // The maximum distance, in meters, that AI units are willing to travel in order to perform medical actions on others, or to receive medical attention
- #define MACRO_AI_MEDICAL_CHANGESTANCEDISTANCE 8 // The distance to the patient, in meters, below which the unit will adjust its stance to that of the patient
- #define MACRO_AI_MEDICAL_PATIENT_STOPDURATIONPERHEAL 2 // For how long an AI unit remains stopped, in seconds, after being healed (prevents them from running away while being healed)
+ #define MACRO_AI_CARELESSDURATION 5 // The duration, in seconds, during which AI units will be careless when being forced to move
+ #define MACRO_AI_ROLEACTION_MAXDISTANCE_UNIT 20 // The maximum distance, in meters, below which AI units will consider performing role-specific actions on nearby friendly units (and, for the recipients, to seek out the action-providing units)
+ #define MACRO_AI_ROLEACTION_CHANGESTANCEDISTANCE 8 // The distance to the recipient, in meters, below which units performing role-specific actions will adjust their stance to that of the recipient
+ #define MACRO_AI_ROLEACTION_RECIPIENT_STOPDURATION 1 // For how long an AI unit remains stopped, in seconds, after being healed or resupplied, ontop of the performed action's cooldown duration (prevents them from running away while still being healed/resupplied)
+ #define MACRO_AI_MEDICAL_SELFHEALCOOLDOWN 3 // The duration, in seconds, that a medic must wait after being injured before being allowed to heal itself (to combat heal-spamming)
+ #define MACRO_AI_MEDICAL_INITIALREVIVEDELAY 2 // The initial delay, in seconds, after a unit has gone unconscious before AI medics are allowed to revive them (to combat revive-spamming)
#define MACRO_AI_COMMANDER_STRATEGICVALUE_DECREASEPERGROUP 4 // By how much a sector's current strategic value is divided, for each group ordered to it (per iteration of the commander system)
#define MACRO_AI_COMMANDER_SECTOR_MINLEVELOWNED 0.8 // The minimum capturing level of owned sectors for them to be considered as candidates
#define MACRO_AI_COMMANDER_WAYPOINT_MINDISTANCE 5 // Minimum distance, in meters, that a potential new waypoint must be from a group's current waypoint to be submitted
- #define MACRO_AI_COMMANDER_NEWORDER_COOLDOWN 20 // Average (+/-25%) cooldown, in seconds, between two orders to a group from the AI commander (even if the orders are identical)
+ #define MACRO_AI_COMMANDER_NEWORDER_COOLDOWN 30 // Average (+/-25%) cooldown, in seconds, between two orders to a group from the AI commander (even if the orders are identical)
// Gamemode
#define MACRO_GM_KILLASSISTDURATION 10 // How long (in seconds), after damaging an enemy unit, it is possible to receive a kill assist for
@@ -460,10 +469,14 @@
// Health
#define MACRO_UNIT_HEALTH_FALLDAMAGEHEIGHT 3 // The height in meters beyond which units receive fall damage when jumping off of surfaces (assuming no initial velocity)
- #define MACRO_UNIT_HEALTH_THRESHOLDLOW 0.5 // The threshold of health below which a unit is considered to be at low health
+ #define MACRO_UNIT_HEALTH_THRESHOLDLOW 0.5 // The threshold of health below which a unit is considered to be at low health. Below this threshold, AI units will seek out nearby medics.
+
+ // Ammo
+ #define MACRO_UNIT_AMMO_THRESHOLDLOW 0.5 // The threshold of overall ammo below which a unit is considered to be at low ammo. Below this threshold, AI units will seek out nearby support units.
+ #define MACRO_UNIT_AMMO_RESUPPLYCOOLDOWN 5 // The cooldown duration, in seconds, that nits who have been fully resupplied must wait before being allowed to receive supplies again
// Framework
- #define MACRO_MISSION_FRAMEWORK_VERSION "0.14.662" // The version of this framework
+ #define MACRO_MISSION_FRAMEWORK_VERSION "0.16.794" // The version of this framework
#define MACRO_MISSION_FRAMEWORK_GAMEMODE "Conquest"
// Multiplayer settings (referenced by the Steam server browser)
@@ -507,6 +520,7 @@
#define MACRO_SCORE_SECTOR_CAPTURING 20 // Triggered for every 10% of level change
#define MACRO_SCORE_SECTOR_CAPTURED 300
+ #define MACRO_SCORE_RESUPPLY 1 // Per percentage of ammo resupplied
#define MACRO_SCORE_HEAL 1 // Per health point healed
#define MACRO_SCORE_REVIVE 50
@@ -536,10 +550,10 @@
#define MACRO_ENUM_SCORE_SECTOR_CAPTURED 2
//TODO: Add messages for the following macros
- #define MACRO_ENUM_SCORE_HEAL 10
- #define MACRO_ENUM_SCORE_REVIVE 11
- //#define MACRO_ENUM_SCORE_REPAIR 12
- //#define MACRO_ENUM_SCORE_REARM 13
+ #define MACRO_ENUM_SCORE_RESUPPLY 10
+ #define MACRO_ENUM_SCORE_REPAIR 11
+ #define MACRO_ENUM_SCORE_HEAL 12
+ #define MACRO_ENUM_SCORE_REVIVE 13
#define MACRO_ENUM_SCORE_SUICIDE 20
#define MACRO_ENUM_SCORE_DESERTING 21
@@ -768,6 +782,7 @@
#define MACRO_ENUM_KF_ICON_MINE 3
#define MACRO_ENUM_KF_ICON_EXPLOSIVE 4
+ #define MACRO_KF_ICON_UNKNOWN "a3\ui_f\data\IGUI\Cfg\simpleTasks\types\unknown_ca.paa"
#define MACRO_KF_ICON_HEADSHOT "a3\ui_f\data\IGUI\Cfg\simpleTasks\types\kill_ca.paa"
#define MACRO_KF_ICON_ROADKILL "a3\ui_f\data\IGUI\RscIngameUI\RscUnitInfo\role_driver_ca.paa"
#define MACRO_KF_ICON_MINE "a3\ui_f\data\IGUI\Cfg\simpleTasks\types\mine_ca.paa"
@@ -795,13 +810,17 @@
// AI REQUEST PIORITIES
// ------------------------------------------------------------------------------------------------------------------------------------------------
- #define MACRO_ENUM_AI_PRIO_BASESETTINGS 0
+ #define MACRO_ENUM_AI_PRIO_BASESETTINGS 0
+ #define MACRO_ENUM_AI_PRIO_CARELESSMOVE 1
- #define MACRO_ENUM_AI_PRIO_MEDICAL 1
- #define MACRO_ENUM_AI_PRIO_DODGEVEHICLE 2
+ #define MACRO_ENUM_AI_PRIO_RESUPPLY 10
+ #define MACRO_ENUM_AI_PRIO_REPAIR 11
+ #define MACRO_ENUM_AI_PRIO_MEDICAL 12
- #define MACRO_ENUM_AI_PRIO_UNCONSCIOUS 10
- #define MACRO_ENUM_AI_PRIO_SAFESTART 11
+ #define MACRO_ENUM_AI_PRIO_DODGEVEHICLE 20
+
+ #define MACRO_ENUM_AI_PRIO_UNCONSCIOUS 30
+ #define MACRO_ENUM_AI_PRIO_SAFESTART 31
@@ -811,10 +830,27 @@
// AI MOVE TYPES
// ------------------------------------------------------------------------------------------------------------------------------------------------
- #define MACRO_ENUM_AI_MOVETYPE_HALT 0
- #define MACRO_ENUM_AI_MOVETYPE_REGROUP 1
- #define MACRO_ENUM_AI_MOVETYPE_GOAL 2
- #define MACRO_ENUM_AI_MOVETYPE_ACTION 3
+ #define MACRO_ENUM_AI_MOVETYPE_HALT 0
+ #define MACRO_ENUM_AI_MOVETYPE_REGROUP 1
+ #define MACRO_ENUM_AI_MOVETYPE_GOAL 2
+ #define MACRO_ENUM_AI_MOVETYPE_ACTION 3
+
+
+
+
+
+// ------------------------------------------------------------------------------------------------------------------------------------------------
+// UNIT SOUND ENUMERATIONS
+// ------------------------------------------------------------------------------------------------------------------------------------------------
+
+ #define MACRO_ENUM_SOUND_INVALID -1
+
+ #define MACRO_ENUM_SOUND_RESUPPLY 0
+ #define MACRO_ENUM_SOUND_REPAIR 1
+ #define MACRO_ENUM_SOUND_HEAL 2
+
+ #define MACRO_ENUM_SOUND_VO_DEATH 10
+ #define MACRO_ENUM_SOUND_VO_REVIVE 11
@@ -840,3 +876,5 @@
//#define MACRO_DEBUG_NM_NODES_VEH
//#define MACRO_DEBUG_NM_NODE_IDS
//#define MACRO_DEBUG_NM_PATH
+
+ //#define MACRO_DEBUG_UI_MAP_OVERVIEWMODE
diff --git a/res/params.inc b/res/params.inc
index aac1ade..f297eb6 100644
--- a/res/params.inc
+++ b/res/params.inc
@@ -36,19 +36,19 @@ class Param_AI_MaxUnitsPerGroup {
};
class Param_AI_SpawnWeight_East {
- title = __EVAL("AI spawn bias for side """ + MACRO_SIDE_NAME_EAST + """:");
+ title = __EVAL("AI spawn bias for OPFOR:");
values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
default = MACRO_AI_SPAWNWEIGHT_EAST;
};
class Param_AI_SpawnWeight_Resistance {
- title = __EVAL("AI spawn bias for side """ + MACRO_SIDE_NAME_RESISTANCE + """:");
+ title = __EVAL("AI spawn bias for INDFOR:");
values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
default = MACRO_AI_SPAWNWEIGHT_RESISTANCE;
};
class Param_AI_SpawnWeight_West {
- title = __EVAL("AI spawn bias for side """ + MACRO_SIDE_NAME_WEST + """:");
+ title = __EVAL("AI spawn bias for side BLUFOR:");
values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
default = MACRO_AI_SPAWNWEIGHT_WEST;
};
diff --git a/res/sounds/headshot.ogg b/res/sounds/headshot.ogg
new file mode 100644
index 0000000..c2688bc
Binary files /dev/null and b/res/sounds/headshot.ogg differ
diff --git a/res/sounds/sounds.inc b/res/sounds/sounds.inc
index 27d096a..d6326bc 100644
--- a/res/sounds/sounds.inc
+++ b/res/sounds/sounds.inc
@@ -1,19 +1,23 @@
class GVAR(HitMarker) : GVAR(Default) {
- sound[] = {"res\sounds\hitMarker.ogg", db+5, 1};
+ sound[] = {"res\sounds\hitMarker.ogg", 1, 1};
};
class GVAR(EnemyKilled) : GVAR(Default) {
- sound[] = {"@a3\3DEN\Data\Sound\CfgSound\notificationDefault.wss", db+5, 1};
+ sound[] = {"@a3\3DEN\Data\Sound\CfgSound\notificationDefault.wss", 1, 1};
};
class GVAR(FriendlyKilled) : GVAR(Default) {
- sound[] = {"@a3\3DEN\Data\Sound\CfgSound\notificationWarning.wss", db+5, 1};
+ sound[] = {"@a3\3DEN\Data\Sound\CfgSound\notificationWarning.wss", 1, 1};
};
class GVAR(SideDefeated) : GVAR(Default) {
sound[] = {"@a3\missions_f_beta\data\sounds\firing_drills\drill_finish.wss", db+5, 1};
};
+class GVAR(Headshot) : GVAR(Default) {
+ sound[] = {"res\sounds\headshot.ogg", 1, 1};
+};
+
class GVAR(TicketsLow_Siren) : GVAR(Default) {
sound[] = {"@a3\data_f_curator\sound\cfgsounds\air_raid", db+5, 1};
};
@@ -23,13 +27,347 @@ class GVAR(TicketsLow_Siren) : GVAR(Default) {
class GVAR(BulletHit_1) : GVAR(Default) {
- sound[] = {"res\sounds\hit_1.ogg", db+5, 1};
+ sound[] = {"res\sounds\hit_1.ogg", 1, 1};
};
class GVAR(BulletHit_2) : GVAR(Default) {
- sound[] = {"res\sounds\hit_2.ogg", db+5, 1};
+ sound[] = {"res\sounds\hit_2.ogg", 1, 1};
};
class GVAR(BulletHit_3) : GVAR(Default) {
- sound[] = {"res\sounds\hit_3.ogg", db+5, 1};
+ sound[] = {"res\sounds\hit_3.ogg", 1, 1};
+};
+
+
+
+
+
+class GVAR(Unit_Resupply_1) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\weapons\Closure\sfx9.wss", db+14, 1};
+};
+
+class GVAR(Unit_Resupply_2) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\weapons\Closure\Mk200_closure_1.wss", db+12, 1};
+};
+
+
+
+
+
+class GVAR(Unit_Heal_1) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Other\firstaid_01.wss", db+4, 1.2}; // offset 2.5
+};
+
+class GVAR(Unit_Heal_2) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Other\firstaid_02.wss", db+6, 1}; // offset 4.15
+};
+
+class GVAR(Unit_Heal_3) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Other\firstaid_03.wss", db+14, 1}; // offset 4.8
+};
+
+class GVAR(Unit_Heal_4) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Other\firstaid_04.wss", db+8, 1}; // offset 3.1
+};
+
+class GVAR(Unit_Heal_5) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Other\firstaid_06.wss", db+6, 1.2}; // offset 3.6
+};
+
+class GVAR(Unit_Heal_6) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\ingame\AinvPknlMstpSlayWpstDnon_medicIn.wss", db+6, 1};
+};
+
+class GVAR(Unit_Heal_7) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\ingame\AinvPknlMstpSlayWpstDnon_medicOut.wss", db+6, 1};
+};
+
+class GVAR(Unit_Heal_8) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\ingame\AinvPpneMstpSlayWpstDnon_medicIn.wss", db+6, 1};
+};
+
+class GVAR(Unit_Heal_9) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\ingame\AinvPpneMstpSlayWpstDnon_medicout.wss", db+6, 1};
+};
+
+
+
+
+
+class GVAR(Unit_VO_Revive_1) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_choke_01.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_2) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_choke_02.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_3) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_choke_03.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_4) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_choke_04.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_5) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_choke_01.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_6) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_choke_02.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_7) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_choke_03.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_8) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_choke_04.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_9) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_choke_03.wss", db+5, 1};
+};
+
+class GVAR(Unit_VO_Revive_10) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_choke_04.wss", db+5, 1};
+};
+
+
+
+
+/*
+class GVAR(Unit_VO_Death_1) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_01.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_2) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_02.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_3) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_04.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_4) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_08.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_5) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_11.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_6) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_12.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_7) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_02.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_8) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_07.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_9) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_09.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_10) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_10.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_11) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person2\P2_hit_01.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_12) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person2\P2_hit_05.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_13) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person2\P2_hit_07.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_14) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_01.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_15) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_03.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_16) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_11.wss", db+14, 1};
+};
+
+class GVAR(Unit_VO_Death_17) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_12.wss", db+14, 1};
+};
+*/
+
+
+
+
+
+class GVAR(Unit_VO_Death_Loud_1) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male02ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_3.ogg", db+10, 1};
+};
+
+class GVAR(Unit_VO_Death_Loud_2) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male04ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_3) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male05ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_4) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male05ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_3.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_5) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male05ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_6) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male06ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_1.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_7) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male06ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_8) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male09ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_1.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_9) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male11ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_10) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_01.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_11) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_11.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_12) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_12.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_13) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_03.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_14) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person1\P1_hit_05.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_15) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_03.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Loud_16) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_10.wss", db+14, 1};
+};
+
+
+
+
+
+class GVAR(Unit_VO_Death_Quiet_1) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male01ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_2) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male01ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_3.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_3) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male03ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_3.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_4) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male03ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_5) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male04ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_6) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male07ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_7) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male08ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_8) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male12ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_2.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_9) : GVAR(Default) {
+ sound[] = {"@a3\dubbing_radio_f\data\eng\Male12ENG\RadioProtocolENG\Combat\200_CombatShouts\ScreamingE_4.ogg", db+10, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_10) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person0\P0_hit_04.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_11) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person2\P2_hit_06.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_12) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person2\P2_hit_08.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_13) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_01.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_14) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_04.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_15) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_06.wss", db+14, 1};
+};
+
+
+class GVAR(Unit_VO_Death_Quiet_16) : GVAR(Default) {
+ sound[] = {"@a3\sounds_f\characters\human-sfx\Person3\P3_hit_12.wss", db+14, 1};
};
diff --git a/res/ui/dialogs/rscSpawnMenu.inc b/res/ui/dialogs/rscSpawnMenu.inc
index f825378..566cac9 100644
--- a/res/ui/dialogs/rscSpawnMenu.inc
+++ b/res/ui/dialogs/rscSpawnMenu.inc
@@ -124,7 +124,7 @@ class GVAR(RscSpawnMenu) {
// Flag, Left
class Flag_Picture_Left : GVAR(RscPictureNoAR) {
idc = MACRO_IDC_SM_SIDE_FLAG_LEFT_PICTURE;
- text = "a3\data_f\Flags\flag_white_co.paa";
+ text = MACRO_TEXTURE_FLAG_EMPTY;
x = pixelW * MACRO_POS_SPACER_X;
y = pixelH * MACRO_POS_SPACER_Y;
w = MACRO_POS_SM_WIDTH / 3 - pixelW * (MACRO_POS_SPACER_X * 2 + 1);
diff --git a/res/ui/rscTitles/rscEndScreen.inc b/res/ui/rscTitles/rscEndScreen.inc
index ad71b2e..18a0f7c 100644
--- a/res/ui/rscTitles/rscEndScreen.inc
+++ b/res/ui/rscTitles/rscEndScreen.inc
@@ -37,7 +37,7 @@ class GVAR(RscEndScreen) {
// Flag Picture, Left
class Flag_Picture_Left : GVAR(RscPictureNoAR) {
idc = MACRO_IDC_ES_FLAG_LEFT_PICTURE;
- text = "a3\data_f\Flags\flag_white_co.paa";
+ text = MACRO_TEXTURE_FLAG_EMPTY;
x = 0;
y = 0.3;
w = 0.3;
diff --git a/res/ui/rscTitles/rscSectorHUD.inc b/res/ui/rscTitles/rscSectorHUD.inc
index 45f4304..9d75032 100644
--- a/res/ui/rscTitles/rscSectorHUD.inc
+++ b/res/ui/rscTitles/rscSectorHUD.inc
@@ -38,7 +38,7 @@ class GVAR(RscSectorHUD) {
class Sector_Flag : GVAR(RscPictureNoAR) {
idc = MACRO_IDC_SHUD_FLAG_PICTURE;
- text = "a3\data_f\Flags\flag_white_co.paa";
+ text = MACRO_TEXTURE_FLAG_EMPTY;
x = MACRO_POS_SHUD_SIDE_WIDTH;
w = MACRO_POS_SHUD_FLAG_WIDTH;
h = MACRO_POS_SHUD_HEIGHT;
diff --git a/res/ui/ui.inc b/res/ui/ui.inc
index 423ae28..c39b925 100644
--- a/res/ui/ui.inc
+++ b/res/ui/ui.inc
@@ -84,11 +84,11 @@ class GVAR(RscScoreFeed_Text_Left) : GVAR(RscScoreFeed_Text) {
};
class GVAR(RscKillFeed_Name_Killer) : GVAR(RscText) {
- style = ST_LEFT;
+ style = ST_RIGHT;
sizeEx = MACRO_POS_KF_ENTRY_TEXTSIZE;
};
class GVAR(RscKillFeed_Name_Victim) : GVAR(RscKillFeed_Name_Killer) {
- style = ST_RIGHT;
+ style = ST_LEFT;
};
diff --git a/scripts/actions/fn_act_registerKeybindings.sqf b/scripts/actions/fn_act_registerKeybindings.sqf
index 08c87ee..107c65a 100644
--- a/scripts/actions/fn_act_registerKeybindings.sqf
+++ b/scripts/actions/fn_act_registerKeybindings.sqf
@@ -81,7 +81,37 @@ if (GVAR(hasMod_ace_finger)) then {
-// Healing
+// Role action: resupplying
+[
+ MACRO_MISSION_FRAMEWORK_GAMEMODE,
+ QGVAR(kb_resupplyUnit),
+ "Resupply unit/self",
+ {([player] call FUNC(act_tryResupplyUnit)) param [0, false]},
+ "",
+ [MACRO_KEYBIND_RESUPPLY, [false, false, false]],
+ true,
+ 0,
+ false
+] call CBA_fnc_addKeybind;
+
+
+/*
+// Role action: Repairing
+[
+ MACRO_MISSION_FRAMEWORK_GAMEMODE,
+ QGVAR(kb_repairVehicle),
+ "Repair vehicle",
+ {([player] call FUNC(act_tryHealUnit)) param [0, false]},
+ "",
+ [MACRO_KEYBIND_REPAIR, [false, false, false]],
+ true,
+ 0,
+ false
+] call CBA_fnc_addKeybind;
+*/
+
+
+// Role action: Healing
[
MACRO_MISSION_FRAMEWORK_GAMEMODE,
QGVAR(kb_healUnit),
@@ -109,15 +139,3 @@ GVAR(kb_act_pressed_giveUp) = false;
0,
false
] call CBA_fnc_addKeybind;
-
-
-
-
-
-// Add compatibility for ACE's custom events
-if (GVAR(hasMod_ace_throwing)) then {
- MACRO_FNC_INITVAR(GVAR(EH_ace_firedPlayer), -1);
-
- ["ace_firedPlayer", GVAR(EH_ace_firedPlayer)] call CBA_fnc_removeEventHandler;
- GVAR(EH_ace_firedPlayer) = ["ace_firedPlayer", FUNC(unit_onFired)] call CBA_fnc_addEventHandler;
-};
diff --git a/scripts/actions/fn_act_spotTarget.sqf b/scripts/actions/fn_act_spotTarget.sqf
index 663a7dd..cab3665 100644
--- a/scripts/actions/fn_act_spotTarget.sqf
+++ b/scripts/actions/fn_act_spotTarget.sqf
@@ -45,7 +45,7 @@ if (_newCost > _time) exitWith {
GVAR(spotTarget_cost) = _time;
GVAR(spotTarget_cooldown) = true;
- playSoundUI ["addItemFailed", 0.5, 1, true];
+ playSoundUI ["addItemFailed", 3, 1, true];
true;
};
@@ -141,12 +141,12 @@ if (
if (!isNull _target) then {
[_player, _target] remoteExecCall [QFUNC(gm_spotTargetLocal), 0, false];
- playSoundUI ["TacticalPing4", 1, 1, true];
+ playSoundUI ["TacticalPing4", 2.5, 1, true];
[_player] call FUNC(anim_gesturePoint);
} else {
- playSoundUI ["WeaponRestedOn", 1.5, 1, true];
+ playSoundUI ["WeaponRestedOn", 5, 1, true];
};
diff --git a/scripts/actions/fn_act_tryHealUnit.sqf b/scripts/actions/fn_act_tryHealUnit.sqf
index a52c667..7b9aa77 100644
--- a/scripts/actions/fn_act_tryHealUnit.sqf
+++ b/scripts/actions/fn_act_tryHealUnit.sqf
@@ -24,10 +24,11 @@ params [
// Preconditions
if (
!local _medic
- or {!isTouchingGround _medic}
+ or {vehicle _medic != _medic}
or {_medic getVariable [QGVAR(role), MACRO_ENUM_ROLE_INVALID] != MACRO_ENUM_ROLE_MEDIC}
or {[_medic] call FUNC(unit_isReloading)}
or {!([_medic] call FUNC(unit_isAlive))}
+ or {!isTouchingGround _medic}
) exitWith {
[false, objNull]
};
@@ -61,8 +62,13 @@ private _medicSide = _medic getVariable [QGVAR(side), sideEmpty];
private _candidates = [[_target], allUnits] select (isNull _target);
_candidates = _candidates select {
_x distanceSqr _medic <= _c_maxActionDistSqr
+ and {_x == vehicle _x}
+ and {_x getVariable [QGVAR(isSpawned), false]}
and {(_x getVariable [QGVAR(side), sideEmpty]) == _medicSide}
- and {[_x] call FUNC(unit_needsHealing)}
+ and {
+ _x getVariable [QGVAR(health), 1] < 1
+ or {_x getVariable [QGVAR(isUnconscious), false]}
+ }
};
if (_candidates isEqualTo []) exitWith {[false, objNull]};
@@ -90,10 +96,12 @@ if (isNull _target) then {
_target = (_candidatesSorted param [0, []]) param [1, objNull];
// If no candidate is found, check if the medic needs healing
- if (isNull _target) then {
- if ([_medic] call FUNC(unit_needsHealing)) then {
- _target = _medic;
- };
+ if (
+ isNull _target
+ and {_medic == vehicle _medic}
+ and {_medic getVariable [QGVAR(health), 1] < 1}
+ ) then {
+ _target = _medic;
};
// Validate the target
@@ -121,8 +129,11 @@ if (!isPlayer _medic) then {
_medic doWatch _target;
};
-// Inform the server about the successful healing action
+// Inform the unit about the successful healing action
[_medic, _target] remoteExecCall [QFUNC(unit_onHealUnit), _target, false];
+// Handle action sounds
+[_medic, MACRO_ENUM_SOUND_HEAL] remoteExecCall [QFUNC(unit_playSound), 0, false];
+
// Return the unit that was healed
[true, _target];
diff --git a/scripts/actions/fn_act_tryResupplyUnit.sqf b/scripts/actions/fn_act_tryResupplyUnit.sqf
new file mode 100644
index 0000000..6b60e42
--- /dev/null
+++ b/scripts/actions/fn_act_tryResupplyUnit.sqf
@@ -0,0 +1,136 @@
+/* --------------------------------------------------------------------------------------------------------------------
+ Author: Cre8or
+ Description:
+ [LA][GE]
+ Makes a support unit attempt to resupply a friendly unit.
+
+ If a recipient unit is passed, the support unit will attempt to resupply that unit. Otherwise, the function attempts
+ to determine a candidate recipient from the support unit's viewing direction.
+ Arguments:
+ 0: