From ef4c5a63adbfb94fbd3d5ed7f9fba36a7667b2fe Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Thu, 25 Jan 2024 21:08:37 -0800 Subject: [PATCH 01/17] add general createBox fnc, adjust zen module, central definition --- functions/CfgFunctions.hpp | 1 + functions/client/fn_addZenModules.sqf | 39 +++-- functions/resupply/fn_crateDefinitions.sqf | 159 +++++++++++++++++++ functions/resupply/fn_createAmmoBox.sqf | 101 ++---------- functions/resupply/fn_createBox.sqf | 99 ++++++++++++ functions/resupply/fn_createCSWBox.sqf | 36 +++++ functions/resupply/fn_createLaunchersBox.sqf | 36 +++++ functions/resupply/fn_createMedicalBox.sqf | 62 +------- functions/resupply/fn_createMortarBox.sqf | 36 +++++ functions/resupply/fn_createWeaponsBox.sqf | 70 ++------ 10 files changed, 415 insertions(+), 224 deletions(-) create mode 100644 functions/resupply/fn_crateDefinitions.sqf create mode 100644 functions/resupply/fn_createBox.sqf create mode 100644 functions/resupply/fn_createCSWBox.sqf create mode 100644 functions/resupply/fn_createLaunchersBox.sqf create mode 100644 functions/resupply/fn_createMortarBox.sqf diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index 04aa8f0..b59b3de 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -46,6 +46,7 @@ class milsim class resupply { class createAmmoBox {}; + class createMortarBox {}; class createWeaponsBox {}; class createMedicalBox {}; } diff --git a/functions/client/fn_addZenModules.sqf b/functions/client/fn_addZenModules.sqf index 72e5e2b..f410814 100644 --- a/functions/client/fn_addZenModules.sqf +++ b/functions/client/fn_addZenModules.sqf @@ -5,35 +5,40 @@ if ( !hasInterface ) exitWith {}; "Create Resupply Box", { params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]]; - + _keysSorted = keys milsim_resupply_crateDefinitions; + _keysSorted sort true; + _comboOptions = []; + _comboOptions resize (count _keysSorted); + for "_i" from 0 to (count _keysSorted) - 1 do { + private _definition = milsim_resupply_crateDefinitions get (_keysSorted select _i); + _comboOptions set [_i, [ + _definition getOrDefault ["displayName", "ERROR"], // display name + _definition getOrDefault ["description", "No description"], // tooltip + _definition getOrDefault ["icon", "No icon"] // icon + ]]; + }; + [ "Resupply Box Options", [ - [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ] + // [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ] + ["COMBO", "Box Type", [_keysSorted, _comboOptions, 0]] ], { params ["_dialog", "_args"]; - _dialog params ["_type"]; - _args params ["_pos", "_target"]; - - switch (_type) do { - case 1: { - [_target, _pos] call milsim_fnc_createAmmoBox; - }; - case 2: { - [_target, _pos] call milsim_fnc_createWeaponsBox; - }; - case 3: { - [_target, _pos] call milsim_fnc_createMedicalBox; - }; + _dialog params ["_typeOptionSelected"]; + _args params ["_pos", "_target", "_keysSorted"]; + + + if ([_target, _typeOptionSelected, _pos] call milsim_fnc_createBox) then { + ["Resupply Box", format["Created a %1 box", _typeOptionSelected]] call BIS_fnc_curatorHint; }; }, {}, - [_pos, _target] + [_pos, _target, _options] ] call zen_dialog_fnc_create; - } ] call zen_custom_modules_fnc_register; diff --git a/functions/resupply/fn_crateDefinitions.sqf b/functions/resupply/fn_crateDefinitions.sqf new file mode 100644 index 0000000..0842b53 --- /dev/null +++ b/functions/resupply/fn_crateDefinitions.sqf @@ -0,0 +1,159 @@ +milsim_resupply_crateDefinitions = createHashMapFromArray [ + ["AMMO LIGHT", createHashMapFromArray [ + ["className", "Box_Syndicate_Ammo_F"], + ["displayName", "Ammo Crate"], + ["description", "A crate containing general ammunition and equipment for an infantry squad."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", []], + ["weapons", [ + ["rhs_weap_M136",4], + ["rhs_weap_M136_hp",4], + ["rhs_weap_m72a7",2] + ]], + ["magazines", [ + ["1Rnd_SmokePurple_Grenade_shell",12], + ["1Rnd_SmokeBlue_Grenade_shell",24], + ["1Rnd_SmokeOrange_Grenade_shell",12], + ["rhs_mag_M441_HE",25], + ["rhs_mag_M433_HEDP",15], + ["ACE_40mm_Flare_ir",12], + ["rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote",25], + ["rhsusf_20Rnd_762x51_m993_Mag",25], + ["SmokeShell",12], + ["rhs_mag_m67",12], + ["1Rnd_Smoke_Grenade_shell",24], + ["1Rnd_SmokeRed_Grenade_shell",24], + ["1Rnd_SmokeGreen_Grenade_shell",24], + ["1Rnd_SmokeYellow_Grenade_shell",12], + ["Tier1_30Rnd_556x45_M856A1_EMag",25], + ["Tier1_30Rnd_556x45_Mk318Mod0_EMag",75], + ["ACE_30Rnd_65_Creedmor_mag",25], + ["SMA_30Rnd_762x35_BLK_EPR",25], + ["Tier1_30Rnd_762x35_300BLK_SMK_PMAG",25], + ["SMA_30Rnd_68x43_SPC_FMJ",25], + ["SMA_30Rnd_68x43_SPC_FMJ_Tracer",25], + ["SMA_20Rnd_762x51mm_M80A1_EPR",25], + ["SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25], + ["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25], + ["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer",25], + ["Tier1_250Rnd_762x51_Belt_M993_AP",15], + ["ACE_20Rnd_762x51_Mag_Tracer",25], + ["ACE_20Rnd_762x51_M993_AP_Mag",25], + ["rhsusf_20Rnd_762x51_SR25_m993_Mag",25], + ["Tier1_20Rnd_762x51_M993_SR25_Mag",25], + ["Tier1_20Rnd_65x48_Creedmoor_SR25_Mag",25], + ["rhssaf_30rnd_556x45_EPR_G36", 25], + ["DemoCharge_Remote_Mag",16] + ]], + ["items", []] + ] + ]]], + ["AMMO HEAVY", createHashMapFromArray [ + ["className", "Box_NATO_Wps_F"], + ["displayName", "Heavy Ammo Crate"], + ["description", "A crate containing mixed ammo for rifles, ARs, MAT, and HAT."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", []], + ["weapons", []], + ["magazines", [ + ["MRAWS_HEAT_F",35], + ["MRAWS_HE_F",15], + ["Tier1_250Rnd_762x51_Belt_M993_AP",50], + ["Tier1_30Rnd_556x45_M856A1_EMag",25], + ["Tier1_30Rnd_556x45_Mk318Mod0_EMag",50], + ["Titan_AA",10], + ["Titan_AT",10], + ["200Rnd_65x39_cased_Box_Tracer_Red",50] + ]], + ["items", []] + ] + ]]], + ["AMMO MORTAR", createHashMapFromArray [ + ["className", "Box_Syndicate_Wps_F"], + ["displayName", "Mortar Ammo Crate"], + ["description", "A crate containing mortar ammunition."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", []], + ["weapons", []], + ["magazines", [ + ["ACE_1Rnd_82mm_Mo_HE",24], + ["ACE_1Rnd_82mm_Mo_Smoke",12], + ["ACE_1Rnd_82mm_Mo_Illum",12] + ]], + ["items", []] + ] + ]]], + ["MEDICAL", createHashMapFromArray [ + ["className", "ACE_medicalSupplyCrate_advanced"], + ["displayName", "Medical Crate"], + ["description", "A crate containing medical supplies."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Medikit_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", []], + ["weapons", []], + ["magazines", []], + ["items", [ + ["ACE_packingBandage",100], + ["ACE_elasticBandage",100], + ["ACE_tourniquet",48], + ["ACE_splint",48], + ["ACE_morphine",50], + ["ACE_epinephrine",50], + ["ACE_bloodIV",75], + ["ACE_bloodIV_500",50], + ["ACE_bloodIV_250",25], + ["ACE_quikclot",75], + ["ACE_personalAidKit", 5], + ["ACE_surgicalKit", 5] + ]] + ] + ]]], + ["LAUNCHERS", createHashMapFromArray [ + ["className", "Box_NATO_WpsLaunch_F"], + ["displayName", "Launcher Crate"], + ["description", "A crate containing missile launchers and ammunition."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", [ + + ]], + ["weapons", [ + ["launch_B_Titan_short_F",2], + ["launch_NLAW_F",2], + ["rhs_weap_fim92",2] + ]], + ["magazines", [ + ["Titan_AA",6], + ["Titan_AT",6] + ]], + ["items", [ + + ]] + ] + ]]], + ["CSW", createHashMapFromArray [ + ["className", "Box_NATO_Equip_F"], + ["displayName", "CSW Crate"], + ["description", "A crate containing backpacks that assemble into static weapons."], + ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", [ + ["RHS_M2_Gun_Bag",2], + ["RHS_M2_Tripod_Bag",2], + ["RHS_M2_MiniTripod_Bag",2], + ["rhs_Tow_Gun_Bag",2], + ["rhs_TOW_Tripod_Bag",2], + ["UK3CB_Static_M240_Elcan_Gun_Bag",2], + ["UK3CB_B_Static_M240_Elcan_Tripod_Low_Bag_US_D",2], + ["RHS_Mk19_Gun_Bag",2], + ["RHS_Mk19_Tripod_Bag",2] + ]], + ["weapons", []], + ["magazines", []], + ["items", []] + ]]] +]]; + \ No newline at end of file diff --git a/functions/resupply/fn_createAmmoBox.sqf b/functions/resupply/fn_createAmmoBox.sqf index 2e3f319..06da1f4 100644 --- a/functions/resupply/fn_createAmmoBox.sqf +++ b/functions/resupply/fn_createAmmoBox.sqf @@ -1,7 +1,7 @@ /* * Author: Hizumi * - * Create Ammo resupply box for the 17th Batallion + * Create Ammo resupply box for the 17th Battalion * * Arguments: * 0: Vehicle - @@ -12,9 +12,19 @@ * * Example: * [box] call milsim_fnc_createAmmoBox; // create ammo box via init line of editor object - * [objNull, pos] call milsim_fnc_createAmmoBox // create ammo box via zeus module + * [objNull, pos] call milsim_fnc_createAmmoBox; // create ammo box via zeus module * * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; */ @@ -23,89 +33,4 @@ params [ ["_pos", [0,0,0], [[]], 3] ]; -if (isNull _box) then { - _box = "Box_Syndicate_Ammo_F" createVehicle _pos; -}; - -clearBackpackCargoGlobal _box; -clearItemCargoGlobal _box; -clearMagazineCargoGlobal _box; -clearWeaponCargoGlobal _box; - -_packs = []; - -_items = []; - -_magazines = [ - ["1Rnd_SmokePurple_Grenade_shell",12], - ["1Rnd_SmokeBlue_Grenade_shell",24], - ["1Rnd_SmokeOrange_Grenade_shell",12], - ["rhs_mag_M441_HE",25], - ["rhs_mag_M433_HEDP",15], - ["ACE_40mm_Flare_ir",12], - ["rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote",25], - ["rhsusf_20Rnd_762x51_m993_Mag",25], - ["SmokeShell",12], - ["rhs_mag_m67",12], - ["1Rnd_Smoke_Grenade_shell",24], - ["1Rnd_SmokeRed_Grenade_shell",24], - ["1Rnd_SmokeGreen_Grenade_shell",24], - ["1Rnd_SmokeYellow_Grenade_shell",12], - ["Tier1_30Rnd_556x45_M856A1_EMag",25], - ["Tier1_30Rnd_556x45_Mk318Mod0_EMag",75], - ["ACE_30Rnd_65_Creedmor_mag",25], - ["SMA_30Rnd_762x35_BLK_EPR",25], - ["Tier1_30Rnd_762x35_300BLK_SMK_PMAG",25], - ["SMA_30Rnd_68x43_SPC_FMJ",25], - ["SMA_30Rnd_68x43_SPC_FMJ_Tracer",25], - ["SMA_20Rnd_762x51mm_M80A1_EPR",25], - ["SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25], - ["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25], - ["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer",25], - ["Tier1_250Rnd_762x51_Belt_M993_AP",15], - ["ACE_20Rnd_762x51_Mag_Tracer",25], - ["ACE_20Rnd_762x51_M993_AP_Mag",25], - ["rhsusf_20Rnd_762x51_SR25_m993_Mag",25], - ["Tier1_20Rnd_762x51_M993_SR25_Mag",25], - ["Tier1_20Rnd_65x48_Creedmoor_SR25_Mag",25], - ["rhssaf_30rnd_556x45_EPR_G36", 25], - ["DemoCharge_Remote_Mag",16] -]; - -_weapons = [ - ["rhs_weap_M136",4], - ["rhs_weap_M136_hp",4], - ["rhs_weap_m72a7",2] -]; - -{ - _x params ["_class", "_qty"]; - - _box addBackpackCargoGlobal [_class, _qty] - -} foreach _packs; - -{ - _x params ["_class", "_qty"]; - - _box addItemCargoGlobal [_class, _qty] - -} foreach _items; - -{ - _x params ["_class", "_qty"]; - - _box addMagazineCargoGlobal [_class, _qty] - -} foreach _magazines; - -{ - _x params ["_class", "_qty"]; - - _box addWeaponCargoGlobal [_class, _qty] - -} foreach _weapons; - -[_box,1] call ace_cargo_fnc_setSize; - -true; \ No newline at end of file +[_box, "AMMO LIGHT", _pos] call milsim_fnc_createBox; \ No newline at end of file diff --git a/functions/resupply/fn_createBox.sqf b/functions/resupply/fn_createBox.sqf new file mode 100644 index 0000000..6bb8e57 --- /dev/null +++ b/functions/resupply/fn_createBox.sqf @@ -0,0 +1,99 @@ +/* + * Author: Hizumi & IndigoFox + * + * Create Mortar resupply box for the 17th Battalion + * + * Arguments: + * 0: Vehicle - + * 1: Position - + * + * Return Value: + * Function executed + * + * Example: + * [box] call milsim_fnc_createBox; // create mortar ammo box via init line of editor object + * [objNull, pos] call milsim_fnc_createBox; // create mortar ammo box via zeus module + * + * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; + */ + + +params [ + ["_box", objNull, [objNull]], + ["_type", "", [""]], + ["_pos", [0,0,0], [[]], 3] +]; + +if (isNil "milsim_resupply_crateDefinitions") exitWith { + format["Resupply Boxes: milsim_resupply_crateDefinitions is not defined, possibly a bad edit?"] remoteExec ["systemChat", 0]; + false; +}; + +if (_type isEqualTo "") exitWith { + format["Resupply Boxes: [_boxObject, _type, _pos] call milsim_fnc_createBox"] remoteExec ["systemChat", 0]; + format["Please use one of the following types for _type:"] remoteExec ["systemChat", 0]; + format["%1", (keys milsim_resupply_crateDefinitions)] remoteExec ["systemChat", 0]; + false; +}; + +private _boxData = milsim_resupply_crateDefinitions getOrDefault [_type, createHashMap]; +if (count _boxData isEqualTo 0) exitWith { + format["Resupply Boxes: [_boxObject, _type, _pos] call milsim_fnc_createBox"] remoteExec ["systemChat", 0]; + format["%1 is not a valid type for _type", _type] remoteExec ["systemChat", 0]; + format["Please use one of the following types for _type:"] remoteExec ["systemChat", 0]; + format["%1", (keys milsim_resupply_crateDefinitions)] remoteExec ["systemChat", 0]; + false; +}; + +private _boxItems = _boxData getOrDefault ["items", createHashMap]; + +if (isNull _box) then { + _box = (_boxData get "className") createVehicle _pos; +}; + +clearBackpackCargoGlobal _box; +clearItemCargoGlobal _box; +clearMagazineCargoGlobal _box; +clearWeaponCargoGlobal _box; + +{ + _x params ["_class", "_qty"]; + + _box addBackpackCargoGlobal [_class, _qty] + +} foreach (_boxItems getOrDefault ["backpacks", []]); + +{ + _x params ["_class", "_qty"]; + + _box addItemCargoGlobal [_class, _qty] + +} foreach (_boxItems getOrDefault ["items", []]); + +{ + _x params ["_class", "_qty"]; + + _box addMagazineCargoGlobal [_class, _qty] + +} foreach (_boxItems getOrDefault ["magazines", []]); + +{ + _x params ["_class", "_qty"]; + + _box addWeaponCargoGlobal [_class, _qty] + +} foreach (_boxItems getOrDefault ["weapons", []]); + +[_box,1] call ace_cargo_fnc_setSize; + +true; \ No newline at end of file diff --git a/functions/resupply/fn_createCSWBox.sqf b/functions/resupply/fn_createCSWBox.sqf new file mode 100644 index 0000000..180e21c --- /dev/null +++ b/functions/resupply/fn_createCSWBox.sqf @@ -0,0 +1,36 @@ +/* + * Author: Hizumi & IndigoFox + * + * Create Ammo resupply box for the 17th Battalion + * + * Arguments: + * 0: Vehicle - + * 1: Position - + * + * Return Value: + * Function executed + * + * Example: + * [box] call milsim_fnc_createCSWBox; // create ammo box via init line of editor object + * [objNull, pos] call milsim_fnc_createCSWBox; // create ammo box via zeus module + * + * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; + */ + + +params [ + ["_box", objNull, [objNull]], + ["_pos", [0,0,0], [[]], 3] +]; + +[_box, "CSW", _pos] call milsim_fnc_createBox; \ No newline at end of file diff --git a/functions/resupply/fn_createLaunchersBox.sqf b/functions/resupply/fn_createLaunchersBox.sqf new file mode 100644 index 0000000..a702aa0 --- /dev/null +++ b/functions/resupply/fn_createLaunchersBox.sqf @@ -0,0 +1,36 @@ +/* + * Author: Hizumi & IndigoFox + * + * Create Ammo resupply box for the 17th Battalion + * + * Arguments: + * 0: Vehicle - + * 1: Position - + * + * Return Value: + * Function executed + * + * Example: + * [box] call milsim_fnc_createLaunchersBox; // create ammo box via init line of editor object + * [objNull, pos] call milsim_fnc_createLaunchersBox; // create ammo box via zeus module + * + * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; + */ + + +params [ + ["_box", objNull, [objNull]], + ["_pos", [0,0,0], [[]], 3] +]; + +[_box, "LAUNCHERS", _pos] call milsim_fnc_createBox; \ No newline at end of file diff --git a/functions/resupply/fn_createMedicalBox.sqf b/functions/resupply/fn_createMedicalBox.sqf index 4ee057c..0b0b0a0 100644 --- a/functions/resupply/fn_createMedicalBox.sqf +++ b/functions/resupply/fn_createMedicalBox.sqf @@ -23,64 +23,4 @@ params [ ["_pos", [0,0,0], [[]], 3] ]; -if (isNull _box) then { - _box = "ACE_medicalSupplyCrate_advanced" createVehicle _pos; -}; - -clearBackpackCargoGlobal _box; -clearItemCargoGlobal _box; -clearMagazineCargoGlobal _box; -clearWeaponCargoGlobal _box; - -_packs = []; - -_items = [ - ["ACE_packingBandage",100], - ["ACE_elasticBandage",100], - ["ACE_tourniquet",48], - ["ACE_splint",48], - ["ACE_morphine",50], - ["ACE_epinephrine",50], - ["ACE_bloodIV",75], - ["ACE_bloodIV_500",50], - ["ACE_bloodIV_250",25], - ["ACE_quikclot",75], - ["ACE_personalAidKit", 5], - ["ACE_surgicalKit", 5] -]; - -_magazines = []; - -_weapons = []; - -{ - _x params ["_class", "_qty"]; - - _box addBackpackCargoGlobal [_class, _qty] - -} foreach _packs; - -{ - _x params ["_class", "_qty"]; - - _box addItemCargoGlobal [_class, _qty] - -} foreach _items; - -{ - _x params ["_class", "_qty"]; - - _box addMagazineCargoGlobal [_class, _qty] - -} foreach _magazines; - -{ - _x params ["_class", "_qty"]; - - _box addWeaponCargoGlobal [_class, _qty] - -} foreach _weapons; - -[_box,1] call ace_cargo_fnc_setSize; - -true; \ No newline at end of file +[_box, "MEDICAL", _pos] call milsim_fnc_createBox; \ No newline at end of file diff --git a/functions/resupply/fn_createMortarBox.sqf b/functions/resupply/fn_createMortarBox.sqf new file mode 100644 index 0000000..8d63374 --- /dev/null +++ b/functions/resupply/fn_createMortarBox.sqf @@ -0,0 +1,36 @@ +/* + * Author: Hizumi & IndigoFox + * + * Create Mortar resupply box for the 17th Battalion + * + * Arguments: + * 0: Vehicle - + * 1: Position - + * + * Return Value: + * Function executed + * + * Example: + * [box] call milsim_fnc_createMortarBox; // create mortar ammo box via init line of editor object + * [objNull, pos] call milsim_fnc_createMortarBox; // create mortar ammo box via zeus module + * + * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; + */ + + +params [ + ["_box", objNull, [objNull]], + ["_pos", [0,0,0], [[]], 3] +]; + +[_box, "AMMO MORTAR", _pos] call milsim_fnc_createBox; \ No newline at end of file diff --git a/functions/resupply/fn_createWeaponsBox.sqf b/functions/resupply/fn_createWeaponsBox.sqf index c5141d7..5907845 100644 --- a/functions/resupply/fn_createWeaponsBox.sqf +++ b/functions/resupply/fn_createWeaponsBox.sqf @@ -12,9 +12,19 @@ * * Example: * [box] call milsim_fnc_createWeaponsBox; // create ammo box via init line of editor object - * [objNull, pos] call milsim_fnc_createWeaponsBox // create ammo box via zeus module + * [objNull, pos] call milsim_fnc_createWeaponsBox; // create ammo box via zeus module * * Public: Yes + * + * Note: For gathering: + formatText ["%1", [ + ["containerClassname", typeOf cursorObject], + ["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray], + ["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray], + ["magazineAmmo", magazinesAmmoCargo cursorObject], + ["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray] + ]]; */ @@ -23,60 +33,4 @@ params [ ["_pos", [0,0,0], [[]], 3] ]; -if (isNull _box) then { - _box = "Box_NATO_Wps_F" createVehicle _pos; -}; - -clearBackpackCargoGlobal _box; -clearItemCargoGlobal _box; -clearMagazineCargoGlobal _box; -clearWeaponCargoGlobal _box; - -_packs = []; - -_items = []; - -_magazines = [ - ["MRAWS_HEAT_F",35], - ["MRAWS_HE_F",15], - ["Tier1_250Rnd_762x51_Belt_M993_AP",50], - ["Tier1_30Rnd_556x45_M856A1_EMag",25], - ["Tier1_30Rnd_556x45_Mk318Mod0_EMag",50], - ["Titan_AA",10], - ["Titan_AT",10], - ["200Rnd_65x39_cased_Box_Tracer_Red",50] -]; - -_weapons = []; - -{ - _x params ["_class", "_qty"]; - - _box addBackpackCargoGlobal [_class, _qty] - -} foreach _packs; - -{ - _x params ["_class", "_qty"]; - - _box addItemCargoGlobal [_class, _qty] - -} foreach _items; - -{ - _x params ["_class", "_qty"]; - - _box addMagazineCargoGlobal [_class, _qty] - -} foreach _magazines; - -{ - _x params ["_class", "_qty"]; - - _box addWeaponCargoGlobal [_class, _qty] - -} foreach _weapons; - -[_box,1] call ace_cargo_fnc_setSize; - -true; \ No newline at end of file +[_box, "AMMO HEAVY", _pos] call milsim_fnc_createBox; \ No newline at end of file From dcb8d2d0d6ba2f95670b2250924c56bcedf30fd6 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Thu, 25 Jan 2024 21:14:11 -0800 Subject: [PATCH 02/17] fix cfgfunctions and add init declaration --- functions/CfgFunctions.hpp | 6 +++++- functions/init/fn_initPlayerLocal.sqf | 3 +++ functions/init/fn_initServer.sqf | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index b59b3de..4bd975c 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -45,10 +45,14 @@ class milsim }; class resupply { + class crateDefinitions {}; class createAmmoBox {}; + class createBox {}; + class createCSWBox {}; + class createLaunchersBox {}; + class createMedicalBox {}; class createMortarBox {}; class createWeaponsBox {}; - class createMedicalBox {}; } class ambience { diff --git a/functions/init/fn_initPlayerLocal.sqf b/functions/init/fn_initPlayerLocal.sqf index 3a1a2a3..5f25ff9 100644 --- a/functions/init/fn_initPlayerLocal.sqf +++ b/functions/init/fn_initPlayerLocal.sqf @@ -1,5 +1,8 @@ if ( !hasInterface ) exitWith {}; +// define milsim_resupply_crateDefinitions +call milsim_fnc_crateDefinitions; + ["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups; nil; \ No newline at end of file diff --git a/functions/init/fn_initServer.sqf b/functions/init/fn_initServer.sqf index 15784ef..220f8ec 100644 --- a/functions/init/fn_initServer.sqf +++ b/functions/init/fn_initServer.sqf @@ -1,5 +1,8 @@ if (!isServer) exitWith {}; +// define milsim_resupply_crateDefinitions +call milsim_fnc_crateDefinitions; + _fixedAssets = [ ["Ares", "USAF_A10", 0], ["Odyssey", "RHSGREF_A29B_HIDF", 0], @@ -50,6 +53,8 @@ missionNamespace setVariable ["milsim_var_rotaryAssets", _rotaryAssets]; publicVariable "milsim_var_fixedAssets"; publicVariable "milsim_var_rotaryAssets"; + + // Initializes the Dynamic Groups framework and groups ["Initialize", [true]] call BIS_fnc_dynamicGroups; From e9fc5cfe2191991f76a5aea15cd8fbd12f0d06fa Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Thu, 25 Jan 2024 21:24:14 -0800 Subject: [PATCH 03/17] update FBCB2 element callsigns --- functions/fbcb2/fn_processFBCB2Callsigns.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/fbcb2/fn_processFBCB2Callsigns.sqf b/functions/fbcb2/fn_processFBCB2Callsigns.sqf index 32d1b27..0c1083b 100644 --- a/functions/fbcb2/fn_processFBCB2Callsigns.sqf +++ b/functions/fbcb2/fn_processFBCB2Callsigns.sqf @@ -2,19 +2,19 @@ _text = " =======------ Mission Data Set ------=======

-RIPTIDE
+SPARTAN
Command

-ONI
+BLACKJACK
Alpha Platoon

-GOLIATH
+ZOOMER
Echo

TIGER
RRC

-BLACKFOOT/font>
+BLACKFOOT
Weapons Squad

"; From d823ebeb265949009d07e2441992de845298d99e Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Thu, 25 Jan 2024 21:39:39 -0800 Subject: [PATCH 04/17] fix icons for crate defs --- functions/resupply/fn_crateDefinitions.sqf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/functions/resupply/fn_crateDefinitions.sqf b/functions/resupply/fn_crateDefinitions.sqf index 0842b53..6701cb7 100644 --- a/functions/resupply/fn_crateDefinitions.sqf +++ b/functions/resupply/fn_crateDefinitions.sqf @@ -3,7 +3,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "Box_Syndicate_Ammo_F"], ["displayName", "Ammo Crate"], ["description", "A crate containing general ammunition and equipment for an infantry squad."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\rifle_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", []], ["weapons", [ @@ -53,7 +53,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "Box_NATO_Wps_F"], ["displayName", "Heavy Ammo Crate"], ["description", "A crate containing mixed ammo for rifles, ARs, MAT, and HAT."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\heli_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", []], ["weapons", []], @@ -74,7 +74,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "Box_Syndicate_Wps_F"], ["displayName", "Mortar Ammo Crate"], ["description", "A crate containing mortar ammunition."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\scout_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", []], ["weapons", []], @@ -90,7 +90,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "ACE_medicalSupplyCrate_advanced"], ["displayName", "Medical Crate"], ["description", "A crate containing medical supplies."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Medikit_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\heal_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", []], ["weapons", []], @@ -115,7 +115,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "Box_NATO_WpsLaunch_F"], ["displayName", "Launcher Crate"], ["description", "A crate containing missile launchers and ammunition."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\heli_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", [ @@ -138,7 +138,7 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["className", "Box_NATO_Equip_F"], ["displayName", "CSW Crate"], ["description", "A crate containing backpacks that assemble into static weapons."], - ["icon", "a3\ui_f\data\gui\cfg\hints\Ammobox_ca.paa"], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa"], ["items", createHashMapFromArray [ ["backpacks", [ ["RHS_M2_Gun_Bag",2], From 754d7356e112af1873ea119613e8f3b57a1da764 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Fri, 26 Jan 2024 00:26:06 -0800 Subject: [PATCH 05/17] adds events, queue, auto-notifications, manual checks for pilots --- functions/CfgFunctions.hpp | 8 + .../fbcb2/fn_messageFBCB2AssetStatus.sqf | 2 +- functions/respawn/fn_init.sqf | 182 ++++++++++++++++++ .../fn_showReinsertQueueNotification.sqf | 17 ++ 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 functions/respawn/fn_init.sqf create mode 100644 functions/respawn/fn_showReinsertQueueNotification.sqf diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index 04aa8f0..d88b58c 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -64,4 +64,12 @@ class milsim class mapMarkerToString {}; //needs refactor class stringToMapMarker {}; //needs refactor }; +}; + +class milsim_respawn { + class functions { + file = "functions\respawn"; + class init { postInit = 1; }; + class showReinsertQueueNotification {}; + }; }; \ No newline at end of file diff --git a/functions/fbcb2/fn_messageFBCB2AssetStatus.sqf b/functions/fbcb2/fn_messageFBCB2AssetStatus.sqf index abfc739..6571a0b 100644 --- a/functions/fbcb2/fn_messageFBCB2AssetStatus.sqf +++ b/functions/fbcb2/fn_messageFBCB2AssetStatus.sqf @@ -11,7 +11,7 @@ _text = composeText [_text, parseText "Asset Date: Fri, 26 Jan 2024 16:16:18 -0800 Subject: [PATCH 06/17] locally tested. adds settings, fixes removal logic --- functions/respawn/fn_init.sqf | 49 ++++++++++++++----- .../fn_showReinsertQueueNotification.sqf | 33 +++++++++++-- functions/settings/fn_addCBASettings.sqf | 37 ++++++++++++++ 3 files changed, 101 insertions(+), 18 deletions(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index a6d6981..7ba95d1 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -1,8 +1,10 @@ // execute for all -milsim_respawn_setting_maxRangeToReady = 400; // distance in meters from a base at which players can ready up for pickup. players removed from the queue if they move further away than this distance +if (isNil "milsim_respawn_setting_reinsertion_maxRangeToReady") then { + // configured in CBA settings + milsim_respawn_setting_reinsertion_maxRangeToReady = 400; // distance in meters from a base at which players can ready up for pickup. players removed from the queue if they move further away than this distance +}; milsim_respawn_bases = allMissionObjects "ModuleRespawnPosition_F"; // array of all respawn modules in the mission -// player self-interacts will be applied in initPlayerLocal via milsim_respawn_fnc_readyForPickup // on the server, initialize the queue and register the CBA event handler by which players can ready up if (isServer) then { @@ -14,14 +16,19 @@ if (isServer) then { ["milsim_respawn_fileReinsertRequest", { params ["_unit", "_closestBaseName"]; milsim_respawn_reinsertionQueue pushBackUnique [_unit, _closestBaseName]; - diag_log text format ["[milsim_respawn] [reinsertion] ADDED name=%1 playerUID=%2 closestBase=%3", name _unit, getPlayerUID _unit, _closestBaseName]; + diag_log text format [ + "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 closestBase=%3", + name _unit, getPlayerUID _unit, _closestBaseName + ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; ["milsim_respawn_removeReinsertRequest", { params ["_unit"]; - if (milsim_respawn_reinsertionQueue find {_x#0 isEqualTo _unit} == -1) exitWith {}; + if (count (milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _unit}) isEqualTo 0) exitWith {}; milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue select {_x#0 isNotEqualTo _unit}; - diag_log text format ["[milsim_respawn] [reinsertion] REMOVED BY REQUEST name=%1 playerUID=%2", name _unit, getPlayerUID _unit]; + diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2", + name _unit, getPlayerUID _unit + ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; @@ -41,7 +48,7 @@ if (isServer) then { if (_distanceFromBase < _nearestDistance) then { _nearestDistance = _distanceFromBase; }; - if (_distanceFromBase < milsim_respawn_setting_maxRangeToReady) then { + if (_distanceFromBase < milsim_respawn_setting_reinsertion_maxRangeToReady) then { _nearBase = true; }; } forEach milsim_respawn_bases; @@ -49,7 +56,10 @@ if (isServer) then { if (_nearBase && alive _player) then { _stillValid pushBackUnique _queueData; } else { - diag_log text format ["[milsim_respawn] [reinsertion] REMOVED AUTOMATICALLY name=%1 playerUID=%2 nearestBase=%3m", name _player, getPlayerUID _player, _nearestDistance]; + diag_log text format [ + "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 nearestBase=%3m", + name _player, getPlayerUID _player, _nearestDistance + ]; }; } forEach milsim_respawn_reinsertionQueue; @@ -81,13 +91,16 @@ if (hasInterface) then { { params ["_target", "_player", "_params"]; private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; - ["milsim_respawn_fileReinsertRequest", [_player, _closestBase getVariable ["name", "unknown"]]] call CBA_fnc_serverEvent; - format["Re-insert Request Filed at Location %1", _closestBase getVariable ["name", "unknown"]] call CBA_fnc_notify; + private _closestBaseName = _closestBase getVariable ["name", "unknown"]; + ["milsim_respawn_fileReinsertRequest", [_player, _closestBaseName]] call CBA_fnc_serverEvent; + [["Re-insert Request Filed"], [format["Pickup at %1", _closestBaseName]]] call CBA_fnc_notify; }, { params ["_target", "_player", "_params"]; private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; - (_player distance _closestBase < milsim_respawn_setting_maxRangeToReady) && + + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + (_player distance _closestBase < milsim_respawn_setting_reinsertion_maxRangeToReady) && not (_player in ((missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#0})) } ] call ace_interact_menu_fnc_createAction; @@ -100,10 +113,12 @@ if (hasInterface) then { { params ["_target", "_player", "_params"]; ["milsim_respawn_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; - "Re-insert Request has been rescinded." call CBA_fnc_notify; + "Re-insert Request Rescinded" call CBA_fnc_notify; }, { params ["_target", "_player", "_params"]; + + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && (_player in ((missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#0})) } ] call ace_interact_menu_fnc_createAction; @@ -149,7 +164,9 @@ if (hasInterface) then { call milsim_respawn_fnc_showReinsertQueueNotification; }, - {true} // always allow + { + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] + } // always allow ] call ace_interact_menu_fnc_createAction; [_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass; @@ -169,8 +186,14 @@ if (hasInterface) then { // ADD TIMER FOR PILOTS - IF REINSERT LIST NOT CHECKED FOR 20 MINUTES, SHOW NOTIFICATION AUTOMATICALLY if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { [{ + if (not ( + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] + )) exitWith {}; private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - if (diag_tickTime - _lastCheck < (60*20)) exitWith {}; // if last check was less than 20 minutes ago, skip + if ( + diag_tickTime - _lastCheck < + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", 60*20] + ) exitWith {}; // if last check was less than X minutes ago, skip // if last check was greater than 20 minutes ago, we'll prompt the notification now and reset the timer localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; diff --git a/functions/respawn/fn_showReinsertQueueNotification.sqf b/functions/respawn/fn_showReinsertQueueNotification.sqf index ce66ef7..4ae775c 100644 --- a/functions/respawn/fn_showReinsertQueueNotification.sqf +++ b/functions/respawn/fn_showReinsertQueueNotification.sqf @@ -2,14 +2,37 @@ private _par = [["Players Awaiting Reinsert", 1.2, [1,0.64,0,1]]]; private _baseNames = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; { private _baseName = _x; - _par pushBack [format ["Location: %1", _baseName], 1, [0,1,0,1]]; - { - _par pushBack _x; - } forEach ((missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) select { + private _peopleAtThisBase = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) select { _x#1 isEqualTo _baseName } apply { [name (_x#0), 0.7, [1,1,1,1]]; - }); + }; + + private _playerCountText = ""; + switch (count _peopleAtThisBase) do { + case 0: { + _playerCountText = "No players"; + }; + case 1: { + _playerCountText = "1 player"; + }; + default { + _playerCountText = format ["%1 players", count _peopleAtThisBase]; + }; + }; + + _par pushBack [ + format ["Location: %1 (%2)", + _baseName, + _playerCountText + ], + 1, + [0,1,0,1] + ]; + + { + _par pushBack _x; + } forEach _peopleAtThisBase; } forEach _baseNames; _par call CBA_fnc_notify; diff --git a/functions/settings/fn_addCBASettings.sqf b/functions/settings/fn_addCBASettings.sqf index dc0ef30..c19dd52 100644 --- a/functions/settings/fn_addCBASettings.sqf +++ b/functions/settings/fn_addCBASettings.sqf @@ -125,6 +125,43 @@ ] call CBA_fnc_addSetting; +//--------------------- +// Respawn Settings +[ + "milsim_respawn_setting_reinsertion_enabled", // variable + "CHECKBOX", // type + ["Enabled", "Whether or not players can file for reinsert and pilots can check the reinsert queue"], // title + ["17th Battalion", "Re-insert Queue"], // category + true, // default value + true, // global setting + { + params ["_value"]; + diag_log format["[milsim] (respawn_reinsertion) enabled set to %1", _value]; + } +] call CBA_fnc_addSetting; + +[ + "milsim_respawn_setting_reinsertion_maxRangeToReady", // variable + "SLIDER", // type + ["Max Request Filing Range", "Maximum distance from a respawn point a player can be to ready up"], // title + ["17th Battalion", "Re-insert Queue"], // category + [0, 1000, 400, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage] + true, // global setting + { + params ["_value"]; + diag_log format["[milsim] (respawn_reinsertion) max range to ready set to %1", _value]; + } +] call CBA_fnc_addSetting; + +[ + "milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", // variable + "SLIDER", // type + ["Pilot Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title + ["17th Battalion", "Re-insert Queue"], // category + [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage + true +] call CBA_fnc_addSetting; + diag_log text "[MILSIM] (settings) Custom CBA settings initialized"; nil; \ No newline at end of file From 4ced5080058327aafaeeca59679683e4be864ad3 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Fri, 26 Jan 2024 21:06:47 -0800 Subject: [PATCH 07/17] add global broadcast on players waiting longer than threshold, log --- functions/respawn/fn_init.sqf | 99 ++++++++++++++++++++---- functions/settings/fn_addCBASettings.sqf | 9 +++ 2 files changed, 93 insertions(+), 15 deletions(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index 7ba95d1..44cee2d 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -1,3 +1,9 @@ + +// if a player files for reinsert using self-interaction +// they're added to the queue along with their nearest base location and the time they filed +// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around +// the player's time in the queue stating how long they have been waiting, their name, and their group's name + // execute for all if (isNil "milsim_respawn_setting_reinsertion_maxRangeToReady") then { // configured in CBA settings @@ -12,34 +18,49 @@ if (isServer) then { milsim_respawn_reinsertionQueue = []; publicVariable "milsim_respawn_reinsertionQueue"; + milsim_respawn_reinsertionOverTimeoutLastNotificationTime = 0; + // register event handlers ["milsim_respawn_fileReinsertRequest", { - params ["_unit", "_closestBaseName"]; - milsim_respawn_reinsertionQueue pushBackUnique [_unit, _closestBaseName]; + params ["_unit", "_closestBaseName", "_time"]; + milsim_respawn_reinsertionQueue pushBackUnique [_unit, _closestBaseName, _time]; diag_log text format [ - "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 closestBase=%3", - name _unit, getPlayerUID _unit, _closestBaseName + "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 filedAtBase=%3", + name _unit, + getPlayerUID _unit, + _closestBaseName ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; ["milsim_respawn_removeReinsertRequest", { params ["_unit"]; - if (count (milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _unit}) isEqualTo 0) exitWith {}; - milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue select {_x#0 isNotEqualTo _unit}; - diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2", - name _unit, getPlayerUID _unit + private _unitArrs = milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _unit}; + if (count _unitArrs isEqualTo 0) exitWith {}; + + milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue - _unitArrs; + // sort _unitArrs by time in queue, descending + [_unitArrs, [], { + _x#2 + }, "DESCEND"] call BIS_fnc_sortBy; + (_unitArrs#0) params ["_unit", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] + private _timeInQueue = diag_tickTime - (_timeFiled); + diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2 filedAtBase=%3 inQueue=%4s", + name _unit, + getPlayerUID _unit, + _baseName, + _timeInQueue ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; - // every 60 seconds, revalidate any players in the queue - // compare their distance to the nearest base, and remove them if they're too far away (or dead) + [{ + // every 60 seconds, revalidate any players in the queue + // compare their distance to the nearest base, and remove them if they're too far away (or dead) private _stillValid = []; { - private _queueData = _x; - private _player = _queueData#0; + _x params ["_player", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] private _nearBase = false; private _nearestDistance = 99999; { @@ -57,14 +78,62 @@ if (isServer) then { _stillValid pushBackUnique _queueData; } else { diag_log text format [ - "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 nearestBase=%3m", - name _player, getPlayerUID _player, _nearestDistance + "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 filedAtBase=%3 nearestBaseDistance=%4m inQueue=%5s", + name _unit, + getPlayerUID _unit, + _baseName, + _nearestDistance, + diag_tickTime - _timeFiled ]; }; } forEach milsim_respawn_reinsertionQueue; + // broadcast new list to all machines milsim_respawn_reinsertionQueue = _stillValid; publicVariable "milsim_respawn_reinsertionQueue"; + + + // if at least 1 player in the queue has been waiting longer than the configured timeout, + // show a notification to all players if the last notification was more than 5 minutes ago + private _needNotification = + diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5 // if last notification was more than 5 minutes ago + if (_needNotification) then { + private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_timeout", 60*20]; // default 20 minutes + private _timeoutPlayers = milsim_respawn_reinsertionQueue select {alive (_x#0) && (diag_tickTime - (_x#2)) > _timeout}; + if (count _timeoutPlayers > 0) then { + // sort _timeoutPlayers by time in queue, descending + _timeoutPlayers = [_timeoutPlayers, [], { + _x#2 + }, "DESCEND"] call BIS_fnc_sortBy; + private _playerLines = _timeoutPlayers apply { + private _timeInQueue = diag_tickTime - (_x#2); + private _groupId = groupID (_x#0); + [format [ + "%1: %2 [%2s]", + _groupId, + name (_x#0), + [_timeInQueue, "MM:SS"] call BIS_fnc_secondsToString + ], 0.8, [0.8, 0.8, 0.8, 1]]; + }; + ["Players are still waiting for Re-insert!", _playerLines] remoteExec ["CBA_fnc_notify", -2]; + + milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; + + diag_log text format [ + "[milsim] (respawn_reinsertion) PLAYERS WAITING LONGER THAN %1s: %2", + _timeout, + _timeoutPlayers apply { + format[ + "%1: %2 [%3]", + groupID (_x#0), + name _x#0, + diag_tickTime - (_x#2) + ] + } + ]; + + }; + }; }, 60] call CBA_fnc_addPerFrameHandler; }; @@ -92,7 +161,7 @@ if (hasInterface) then { params ["_target", "_player", "_params"]; private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; private _closestBaseName = _closestBase getVariable ["name", "unknown"]; - ["milsim_respawn_fileReinsertRequest", [_player, _closestBaseName]] call CBA_fnc_serverEvent; + ["milsim_respawn_fileReinsertRequest", [_player, _closestBaseName, diag_tickTime]] call CBA_fnc_serverEvent; [["Re-insert Request Filed"], [format["Pickup at %1", _closestBaseName]]] call CBA_fnc_notify; }, { diff --git a/functions/settings/fn_addCBASettings.sqf b/functions/settings/fn_addCBASettings.sqf index c19dd52..7b87c51 100644 --- a/functions/settings/fn_addCBASettings.sqf +++ b/functions/settings/fn_addCBASettings.sqf @@ -162,6 +162,15 @@ true ] call CBA_fnc_addSetting; +[ + "milsim_respawn_setting_reinsertion_timeout", // variable + "SLIDER", // type + ["Request Timeout", "How long should at least one person be waiting before prompting a global notification."], // title + ["17th Battalion", "Re-insert Queue"], // category + [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage + true +] call CBA_fnc_addSetting; + diag_log text "[MILSIM] (settings) Custom CBA settings initialized"; nil; \ No newline at end of file From e395fa9c16478a974e60821b35025f79df2422d5 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Fri, 26 Jan 2024 21:22:35 -0800 Subject: [PATCH 08/17] add forcedPilotCheck setting, some formatting changes --- functions/respawn/fn_init.sqf | 5 +++-- functions/settings/fn_addCBASettings.sqf | 28 +++++++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index 44cee2d..59aec70 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -256,7 +256,8 @@ if (hasInterface) then { if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { [{ if (not ( - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", true] )) exitWith {}; private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; if ( @@ -266,7 +267,7 @@ if (hasInterface) then { // if last check was greater than 20 minutes ago, we'll prompt the notification now and reset the timer localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - + call milsim_respawn_fnc_showReinsertQueueNotification; }, 30] call CBA_fnc_addPerFrameHandler; }; diff --git a/functions/settings/fn_addCBASettings.sqf b/functions/settings/fn_addCBASettings.sqf index 7b87c51..c541b2b 100644 --- a/functions/settings/fn_addCBASettings.sqf +++ b/functions/settings/fn_addCBASettings.sqf @@ -149,7 +149,20 @@ true, // global setting { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) max range to ready set to %1", _value]; + diag_log format["[milsim] (respawn_reinsertion) maxRangeToReady set to %1", _value]; + } +] call CBA_fnc_addSetting; + +[ + "milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", // variable + "CHECKBOX", // type + ["Enabled", "Whether or not pilots are forced to view the contents of the reinsertion queue per interval"], // title + ["17th Battalion", "Re-insert Queue"], // category + true, // default value + true, // global setting + { + params ["_value"]; + diag_log format["[milsim] (respawn_reinsertion) pilotForcedCheckEnabled set to %1", _value]; } ] call CBA_fnc_addSetting; @@ -159,7 +172,12 @@ ["Pilot Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title ["17th Battalion", "Re-insert Queue"], // category [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage - true + true, + { + params ["_value"]; + diag_log format["[milsim] (respawn_reinsertion) pilotForcedCheckInterval set to %1", _value]; + + } ] call CBA_fnc_addSetting; [ @@ -168,7 +186,11 @@ ["Request Timeout", "How long should at least one person be waiting before prompting a global notification."], // title ["17th Battalion", "Re-insert Queue"], // category [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage - true + true, + { + params ["_value"]; + diag_log format["[milsim] (respawn_reinsertion) timeout set to %1", _value]; + } ] call CBA_fnc_addSetting; diag_log text "[MILSIM] (settings) Custom CBA settings initialized"; From 1ac1664faf4bc0261d5e38cd56f1683937285e7a Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Sun, 28 Jan 2024 13:46:56 -0800 Subject: [PATCH 09/17] bug fixes --- functions/respawn/fn_init.sqf | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index 59aec70..762dca0 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -61,7 +61,6 @@ if (isServer) then { private _stillValid = []; { _x params ["_player", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] - private _nearBase = false; private _nearestDistance = 99999; { private _baseLocation = _x; @@ -69,18 +68,17 @@ if (isServer) then { if (_distanceFromBase < _nearestDistance) then { _nearestDistance = _distanceFromBase; }; - if (_distanceFromBase < milsim_respawn_setting_reinsertion_maxRangeToReady) then { - _nearBase = true; - }; } forEach milsim_respawn_bases; + private _nearBase = _nearestDistance < milsim_respawn_setting_reinsertion_maxRangeToReady; + if (_nearBase && alive _player) then { - _stillValid pushBackUnique _queueData; + _stillValid pushBackUnique _x; } else { diag_log text format [ "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 filedAtBase=%3 nearestBaseDistance=%4m inQueue=%5s", - name _unit, - getPlayerUID _unit, + name _player, + getPlayerUID _player, _baseName, _nearestDistance, diag_tickTime - _timeFiled @@ -96,7 +94,7 @@ if (isServer) then { // if at least 1 player in the queue has been waiting longer than the configured timeout, // show a notification to all players if the last notification was more than 5 minutes ago private _needNotification = - diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5 // if last notification was more than 5 minutes ago + diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5; // if last notification was more than 5 minutes ago if (_needNotification) then { private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_timeout", 60*20]; // default 20 minutes private _timeoutPlayers = milsim_respawn_reinsertionQueue select {alive (_x#0) && (diag_tickTime - (_x#2)) > _timeout}; @@ -160,7 +158,8 @@ if (hasInterface) then { { params ["_target", "_player", "_params"]; private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; - private _closestBaseName = _closestBase getVariable ["name", "unknown"]; + private _closestBaseName = _closestBase getVariable ["name", ""]; + if (_closestBaseName == "") then {_closestBaseName = format["near %1", text (nearestLocation [_closestBase, ""])]}; ["milsim_respawn_fileReinsertRequest", [_player, _closestBaseName, diag_tickTime]] call CBA_fnc_serverEvent; [["Re-insert Request Filed"], [format["Pickup at %1", _closestBaseName]]] call CBA_fnc_notify; }, From 9b7042cd7d4b779ace97c9b638733caa85483b91 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Sun, 28 Jan 2024 14:40:03 -0800 Subject: [PATCH 10/17] add mortar resupply crates for mk6 and 60mm --- functions/resupply/fn_crateDefinitions.sqf | 46 +++++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/functions/resupply/fn_crateDefinitions.sqf b/functions/resupply/fn_crateDefinitions.sqf index 6701cb7..17bb3e8 100644 --- a/functions/resupply/fn_crateDefinitions.sqf +++ b/functions/resupply/fn_crateDefinitions.sqf @@ -154,6 +154,48 @@ milsim_resupply_crateDefinitions = createHashMapFromArray [ ["weapons", []], ["magazines", []], ["items", []] + ] + ]]], + ["MORTAR MK6", createHashMapFromArray [ + ["className", "Box_NATO_WpsSpecial_F"], + ["displayName", "Mortar MK6 Supply Crate"], + ["description", "A crate containing Mk6 mortar resupply (tubes) and tools."], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\scout_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", [ + ["B_Mortar_01_support_F",3], + ["B_Mortar_01_weapon_F",6], + ["UK3CB_LSM_B_B_CARRYALL_RADIO_TIG_STRIPE_01",1] + ]], + ["weapons", [ + ["ACE_Vector",2] + ]], + ["magazines", [ + ["acex_intelitems_notepad",2] + ]], + ["items", [ + ["ACE_artilleryTable",2], + ["ACE_RangeTable_82mm",2], + ["ACE_microDAGR",2], + ["ACE_MapTools",2] + ]] + ] + ]]], + ["MORTAR 60MM COMMANDO", createHashMapFromArray [ + ["className", "Box_NATO_WpsSpecial_F"], + ["displayName", "Mortar 60mm Commando Supply Crate"], + ["description", "A crate containing COMMANDO 60mm mortar shells and some STANAGs."], + ["icon", "\A3\ui_f\data\igui\cfg\simpleTasks\types\scout_ca.paa"], + ["items", createHashMapFromArray [ + ["backpacks", []], + ["weapons", []], + ["magazines", [ + ["twc_2inch_he_1rnd",70], + ["twc_2inch_smoke_1rnd",15], + ["twc_2inch_illum_1rnd",15], + ["Tier1_30Rnd_556x45_Mk318Mod0_EMag",20] + ]], + ["items", []] + ] ]]] -]]; - \ No newline at end of file +]; \ No newline at end of file From 49fa0c39d2c5d477c5a25af7c218293f9b4077e1 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Sun, 28 Jan 2024 21:14:22 -0800 Subject: [PATCH 11/17] makes supply boxes ignore weight restrictions for drag and carry --- functions/client/fn_addZenModules.sqf | 6 ++++-- functions/resupply/fn_createBox.sqf | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/functions/client/fn_addZenModules.sqf b/functions/client/fn_addZenModules.sqf index f410814..ec7ca94 100644 --- a/functions/client/fn_addZenModules.sqf +++ b/functions/client/fn_addZenModules.sqf @@ -32,9 +32,11 @@ if ( !hasInterface ) exitWith {}; _args params ["_pos", "_target", "_keysSorted"]; - if ([_target, _typeOptionSelected, _pos] call milsim_fnc_createBox) then { - ["Resupply Box", format["Created a %1 box", _typeOptionSelected]] call BIS_fnc_curatorHint; + private _box = [_target, _typeOptionSelected, _pos] call milsim_fnc_createBox; + if (isNull _box) exitWith { + ["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint; }; + ["Resupply Box", format["Created a %1 box", _typeOptionSelected]] call BIS_fnc_curatorHint; }, {}, [_pos, _target, _options] diff --git a/functions/resupply/fn_createBox.sqf b/functions/resupply/fn_createBox.sqf index 6bb8e57..0917746 100644 --- a/functions/resupply/fn_createBox.sqf +++ b/functions/resupply/fn_createBox.sqf @@ -96,4 +96,6 @@ clearWeaponCargoGlobal _box; [_box,1] call ace_cargo_fnc_setSize; -true; \ No newline at end of file +// ignore weight restrictions for carry/drag +_box setVariable ["ace_ignoreWeightCarry", true, true]; +_box; \ No newline at end of file From b6189cc7f319fa83ee5eef63e1f3ab4f17635fe9 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Sun, 28 Jan 2024 22:35:03 -0800 Subject: [PATCH 12/17] fixes reinsertion formatting and includes groups in diaglog --- functions/respawn/fn_init.sqf | 33 +++++++++++-------- .../fn_showReinsertQueueNotification.sqf | 18 +++++++++- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index 762dca0..d378dab 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -25,9 +25,10 @@ if (isServer) then { params ["_unit", "_closestBaseName", "_time"]; milsim_respawn_reinsertionQueue pushBackUnique [_unit, _closestBaseName, _time]; diag_log text format [ - "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 filedAtBase=%3", + "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 group=%3 filedAtBase=%4", name _unit, getPlayerUID _unit, + groupId (group _unit), _closestBaseName ]; publicVariable "milsim_respawn_reinsertionQueue"; @@ -44,9 +45,10 @@ if (isServer) then { }, "DESCEND"] call BIS_fnc_sortBy; (_unitArrs#0) params ["_unit", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] private _timeInQueue = diag_tickTime - (_timeFiled); - diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2 filedAtBase=%3 inQueue=%4s", + diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2 group=%3 filedAtBase=%4 inQueue=%5s", name _unit, getPlayerUID _unit, + groupId (group _unit), _baseName, _timeInQueue ]; @@ -76,9 +78,10 @@ if (isServer) then { _stillValid pushBackUnique _x; } else { diag_log text format [ - "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 filedAtBase=%3 nearestBaseDistance=%4m inQueue=%5s", + "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 group=%3 filedAtBase=%4 nearestBaseDistance=%5m inQueue=%6s", name _player, getPlayerUID _player, + groupId (group _player), _baseName, _nearestDistance, diag_tickTime - _timeFiled @@ -97,23 +100,27 @@ if (isServer) then { diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5; // if last notification was more than 5 minutes ago if (_needNotification) then { private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_timeout", 60*20]; // default 20 minutes - private _timeoutPlayers = milsim_respawn_reinsertionQueue select {alive (_x#0) && (diag_tickTime - (_x#2)) > _timeout}; + private _timeoutPlayers = milsim_respawn_reinsertionQueue select { + alive (_x#0) && + (diag_tickTime - (_x#2)) > _timeout + }; if (count _timeoutPlayers > 0) then { // sort _timeoutPlayers by time in queue, descending _timeoutPlayers = [_timeoutPlayers, [], { _x#2 }, "DESCEND"] call BIS_fnc_sortBy; - private _playerLines = _timeoutPlayers apply { + private _playerLines = ["Players are still waiting for Re-insert!"]; + { private _timeInQueue = diag_tickTime - (_x#2); - private _groupId = groupID (_x#0); - [format [ - "%1: %2 [%2s]", + private _groupId = groupID (group (_x#0)); + _playerLines pushBack ([format [ + "%1: %2 [%3]", _groupId, name (_x#0), [_timeInQueue, "MM:SS"] call BIS_fnc_secondsToString - ], 0.8, [0.8, 0.8, 0.8, 1]]; - }; - ["Players are still waiting for Re-insert!", _playerLines] remoteExec ["CBA_fnc_notify", -2]; + ], 0.8, [0.8, 0.8, 0.8, 1]]); + } forEach _timeoutPlayers; + _playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated]; milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; @@ -123,8 +130,8 @@ if (isServer) then { _timeoutPlayers apply { format[ "%1: %2 [%3]", - groupID (_x#0), - name _x#0, + groupId (group (_x#0)), + name (_x#0), diag_tickTime - (_x#2) ] } diff --git a/functions/respawn/fn_showReinsertQueueNotification.sqf b/functions/respawn/fn_showReinsertQueueNotification.sqf index 4ae775c..4c626a2 100644 --- a/functions/respawn/fn_showReinsertQueueNotification.sqf +++ b/functions/respawn/fn_showReinsertQueueNotification.sqf @@ -5,9 +5,25 @@ private _baseNames = (missionNamespace getVariable ["milsim_respawn_reinsertionQ private _peopleAtThisBase = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) select { _x#1 isEqualTo _baseName } apply { - [name (_x#0), 0.7, [1,1,1,1]]; + private _timeInQueue = diag_tickTime - (_x#2); + [ + format [ + "%1: %2 [%3]", + groupId (group (_x#0)), + name (_x#0), + [_timeInQueue, "MM:SS"] call BIS_fnc_secondsToString + ], + 0.7, + [1,1,1,1] + ]; }; + _peopleAtThisBase = [ + _peopleAtThisBase, + [], + {_x#0} + ] call BIS_fnc_sortBy; + private _playerCountText = ""; switch (count _peopleAtThisBase) do { case 0: { From 8d42fa4593daf4e635176422cd7e6764494b8afe Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Mon, 29 Jan 2024 10:59:39 -0800 Subject: [PATCH 13/17] fixes error in respawn wait over threshold notification --- functions/respawn/fn_init.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index d378dab..76e8c09 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -109,7 +109,7 @@ if (isServer) then { _timeoutPlayers = [_timeoutPlayers, [], { _x#2 }, "DESCEND"] call BIS_fnc_sortBy; - private _playerLines = ["Players are still waiting for Re-insert!"]; + private _playerLines = [["Players are still waiting for Re-insert!"]]; { private _timeInQueue = diag_tickTime - (_x#2); private _groupId = groupID (group (_x#0)); From 2951e9cda9d39ad86546751621bdc8f57a656cd4 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Mon, 29 Jan 2024 13:26:44 -0800 Subject: [PATCH 14/17] structured logging --- functions/CfgFunctions.hpp | 5 +++++ functions/client/fn_bindEventHandlers.sqf | 7 +++++-- functions/settings/fn_addRespawnChatHandler.sqf | 6 +++++- functions/util/fn_getPlayerLogString.sqf | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 functions/util/fn_getPlayerLogString.sqf diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index f9035e1..9f3f211 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -69,6 +69,11 @@ class milsim class mapMarkerToString {}; //needs refactor class stringToMapMarker {}; //needs refactor }; + + class util + { + class getPlayerLogString {}; + }; }; class milsim_respawn { diff --git a/functions/client/fn_bindEventHandlers.sqf b/functions/client/fn_bindEventHandlers.sqf index 08a8cdf..569d3a1 100644 --- a/functions/client/fn_bindEventHandlers.sqf +++ b/functions/client/fn_bindEventHandlers.sqf @@ -3,9 +3,12 @@ if ( !hasInterface ) exitWith {}; player addEventHandler["Respawn", { params ["_unit", "_corpse"]; - _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"]; + private _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"]; if (_killer == "respawn_button") then { - format["[MILSIM] (client) %1 was unconscious then clicked the respawn button", name _unit] remoteExec["diag_log", 0]; + format[ + "[MILSIM] (client) RESPAWNED WHILE UNCONSCIOUS %1", + [_unit] call milsim_fnc_getPlayerLogString + ] remoteExec["diag_log", 0]; // format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0]; }; } diff --git a/functions/settings/fn_addRespawnChatHandler.sqf b/functions/settings/fn_addRespawnChatHandler.sqf index fa87a52..e0bfaa1 100644 --- a/functions/settings/fn_addRespawnChatHandler.sqf +++ b/functions/settings/fn_addRespawnChatHandler.sqf @@ -3,7 +3,11 @@ { _clientID = _thisArgs select 0; player setDamage 1; - format["[MILSIM] (init) %1 claims they were glitched and respawned - %2", name player, netID player] remoteExec["diag_log", 2]; + format[ + "[MILSIM] (init) CHAT COMMAND RESPAWN playerNetID=%1 %2", + player call BIS_fnc_netId, + [player] call milsim_fnc_getPlayerLogString + ] remoteExec["diag_log", 2]; format["%1 claims they were glitched and respawned (%2)", name player, netID player] remoteExec["systemChat", -_clientID]; }, "all", diff --git a/functions/util/fn_getPlayerLogString.sqf b/functions/util/fn_getPlayerLogString.sqf new file mode 100644 index 0000000..d3f5ae0 --- /dev/null +++ b/functions/util/fn_getPlayerLogString.sqf @@ -0,0 +1,17 @@ +/* + Function: milsim_fnc_getPlayerLogString + + Author: IndigoFox + + Description: + Returns a string containing the player's name, UID and group name in 'key="value"' format. + + Parameters: + 0: _playerObj - The player object to get the string for. +*/ + +params [["_playerObj", objNull]]; +if (isNull _playerObj) exitWith { + "playerName=""ERROR"" playerUID=""ERROR"" playerGroup=""ERROR""" +}; +format["playerName=""%1"" playerUID=""%2"" playerGroup=""%3""", name _playerObj, getPlayerUID _playerObj, groupId (group _playerObj)]; \ No newline at end of file From f52011cbc47e933eda5937e770cbdaf5cf4171db Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Tue, 30 Jan 2024 10:39:45 -0800 Subject: [PATCH 15/17] adds getNearestBase, rework logging, use server diag_tickTime --- functions/CfgFunctions.hpp | 1 + functions/respawn/fn_getNearestBase.sqf | 15 +++ functions/respawn/fn_init.sqf | 123 ++++++++++++------------ 3 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 functions/respawn/fn_getNearestBase.sqf diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index 9f3f211..e5f54d5 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -81,5 +81,6 @@ class milsim_respawn { file = "functions\respawn"; class init { postInit = 1; }; class showReinsertQueueNotification {}; + class getNearestBase {}; }; }; \ No newline at end of file diff --git a/functions/respawn/fn_getNearestBase.sqf b/functions/respawn/fn_getNearestBase.sqf new file mode 100644 index 0000000..c9039aa --- /dev/null +++ b/functions/respawn/fn_getNearestBase.sqf @@ -0,0 +1,15 @@ +params [["_player", objNull, [objNull]]]; +if (isNull _player) exitWith {[99999, ""]}; + +private _bases = missionNamespace getVariable ["milsim_respawn_bases", []]; +if (count _bases == 0) exitWith {[99999, ""]}; + +// get nearest base (Module_Respawn_F) +private _closestBase = [_bases, _player] call BIS_fnc_nearestPosition; +// get distance +private _nearestDistance = _closestBase distance _player; +// get base name +private _baseName = _closestBase getVariable ["name", ""]; +if (_baseName == "") then {_baseName = format["near %1", text (nearestLocation [_closestBase, ""])]}; + +[_nearestDistance, _baseName]; \ No newline at end of file diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf index 76e8c09..56a6836 100644 --- a/functions/respawn/fn_init.sqf +++ b/functions/respawn/fn_init.sqf @@ -1,7 +1,7 @@ // if a player files for reinsert using self-interaction // they're added to the queue along with their nearest base location and the time they filed -// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around +// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around // the player's time in the queue stating how long they have been waiting, their name, and their group's name // execute for all @@ -22,14 +22,14 @@ if (isServer) then { // register event handlers ["milsim_respawn_fileReinsertRequest", { - params ["_unit", "_closestBaseName", "_time"]; - milsim_respawn_reinsertionQueue pushBackUnique [_unit, _closestBaseName, _time]; + params ["_unit", "_closestBaseName"]; + milsim_respawn_reinsertionQueue pushBackUnique [ + _unit, _closestBaseName, diag_tickTime + ]; diag_log text format [ - "[milsim] (respawn_reinsertion) ADDED name=%1 playerUID=%2 group=%3 filedAtBase=%4", - name _unit, - getPlayerUID _unit, - groupId (group _unit), - _closestBaseName + "[milsim] (respawn_reinsertion) PLAYER FILED REQUEST :: filedAtBase=""%1"" %2", + _closestBaseName, + [_unit] call milsim_fnc_getPlayerLogString ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; @@ -45,12 +45,10 @@ if (isServer) then { }, "DESCEND"] call BIS_fnc_sortBy; (_unitArrs#0) params ["_unit", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] private _timeInQueue = diag_tickTime - (_timeFiled); - diag_log text format ["[milsim] (respawn_reinsertion) REMOVED BY REQUEST name=%1 playerUID=%2 group=%3 filedAtBase=%4 inQueue=%5s", - name _unit, - getPlayerUID _unit, - groupId (group _unit), + diag_log text format ["[milsim] (respawn_reinsertion) PLAYER RESCINDED REQUEST :: filedAtBase=""%1"" inQueueDuration=""%2s"" %3", _baseName, - _timeInQueue + _timeInQueue, + [_unit] call milsim_fnc_getPlayerLogString ]; publicVariable "milsim_respawn_reinsertionQueue"; }] call CBA_fnc_addEventHandler; @@ -61,30 +59,23 @@ if (isServer) then { // every 60 seconds, revalidate any players in the queue // compare their distance to the nearest base, and remove them if they're too far away (or dead) private _stillValid = []; + private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; { _x params ["_player", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] - private _nearestDistance = 99999; - { - private _baseLocation = _x; - private _distanceFromBase = _player distance _baseLocation; - if (_distanceFromBase < _nearestDistance) then { - _nearestDistance = _distanceFromBase; - }; - } forEach milsim_respawn_bases; + - private _nearBase = _nearestDistance < milsim_respawn_setting_reinsertion_maxRangeToReady; + private _nearBase = _nearestDistance < _maxRangeToReady; if (_nearBase && alive _player) then { _stillValid pushBackUnique _x; } else { diag_log text format [ - "[milsim] (respawn_reinsertion) REMOVED AUTOMATICALLY name=%1 playerUID=%2 group=%3 filedAtBase=%4 nearestBaseDistance=%5m inQueue=%6s", - name _player, - getPlayerUID _player, - groupId (group _player), + "[milsim] (respawn_reinsertion) PLAYER DEQUEUED AUTOMATICALLY :: filedAtBase=""%1"" nearestBaseDistance=""%2m"" maxDistanceSetting=""%3m"" inQueueDuration=""%4s"" %5", _baseName, _nearestDistance, - diag_tickTime - _timeFiled + _maxRangeToReady, + diag_tickTime - _timeFiled, + [_player] call milsim_fnc_getPlayerLogString ]; }; } forEach milsim_respawn_reinsertionQueue; @@ -96,12 +87,12 @@ if (isServer) then { // if at least 1 player in the queue has been waiting longer than the configured timeout, // show a notification to all players if the last notification was more than 5 minutes ago - private _needNotification = + private _needNotification = diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5; // if last notification was more than 5 minutes ago if (_needNotification) then { private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_timeout", 60*20]; // default 20 minutes private _timeoutPlayers = milsim_respawn_reinsertionQueue select { - alive (_x#0) && + alive (_x#0) && (diag_tickTime - (_x#2)) > _timeout }; if (count _timeoutPlayers > 0) then { @@ -109,34 +100,31 @@ if (isServer) then { _timeoutPlayers = [_timeoutPlayers, [], { _x#2 }, "DESCEND"] call BIS_fnc_sortBy; + + // GLOBAL CBA NOTIFY private _playerLines = [["Players are still waiting for Re-insert!"]]; { - private _timeInQueue = diag_tickTime - (_x#2); - private _groupId = groupID (group (_x#0)); _playerLines pushBack ([format [ "%1: %2 [%3]", - _groupId, + groupID (group (_x#0)), name (_x#0), - [_timeInQueue, "MM:SS"] call BIS_fnc_secondsToString + [diag_tickTime - (_x#2), "MM:SS"] call BIS_fnc_secondsToString ], 0.8, [0.8, 0.8, 0.8, 1]]); } forEach _timeoutPlayers; _playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated]; + // RESET NOTIFICATION TIMER milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; - diag_log text format [ - "[milsim] (respawn_reinsertion) PLAYERS WAITING LONGER THAN %1s: %2", - _timeout, - _timeoutPlayers apply { - format[ - "%1: %2 [%3]", - groupId (group (_x#0)), - name (_x#0), - diag_tickTime - (_x#2) - ] - } - ]; - + // LOG TO RPT + { + diag_log text format [ + "[milsim] (respawn_reinsertion) PLAYER WAITING OVER TIMEOUT :: timeout=""%1s"" inQueueDuration=""%2s"" %3", + _timeout, + diag_tickTime - (_x#2), + [_x#0] call milsim_fnc_getPlayerLogString + ]; + } forEach _timeoutPlayers; }; }; }, 60] call CBA_fnc_addPerFrameHandler; @@ -157,26 +145,36 @@ if (hasInterface) then { (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]) find _type != -1 ) exitWith {}; - + private _fileForReinsertAction = [ "milsim_respawn_fileReinsertRequest", "File Re-insert Request", "\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa", { params ["_target", "_player", "_params"]; - private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; - private _closestBaseName = _closestBase getVariable ["name", ""]; - if (_closestBaseName == "") then {_closestBaseName = format["near %1", text (nearestLocation [_closestBase, ""])]}; - ["milsim_respawn_fileReinsertRequest", [_player, _closestBaseName, diag_tickTime]] call CBA_fnc_serverEvent; - [["Re-insert Request Filed"], [format["Pickup at %1", _closestBaseName]]] call CBA_fnc_notify; + // find nearest base or location + ([_player] call milsim_respawn_fnc_getNearestBase) params [ + "_baseDistance", "_baseName" + ]; + // send event to server + ["milsim_respawn_fileReinsertRequest", [_player, _baseName]] call CBA_fnc_serverEvent; + // notify player their request was filed + [["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify; }, { params ["_target", "_player", "_params"]; - private _closestBase = [milsim_respawn_bases, _player] call BIS_fnc_nearestPosition; + // find nearest base or location + ([_player] call milsim_respawn_fnc_getNearestBase) params [ + "_baseDistance", "_baseName" + ]; + private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; + private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + + // check if module is enabled, player is near a base, and player is not already in the queue missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - (_player distance _closestBase < milsim_respawn_setting_reinsertion_maxRangeToReady) && - not (_player in ((missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#0})) + (_baseDistance < _maxRangeToReady) && + not (_player in (_existingQueue apply {_x#0})) } ] call ace_interact_menu_fnc_createAction; [_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; @@ -187,14 +185,19 @@ if (hasInterface) then { "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", { params ["_target", "_player", "_params"]; + // send event to server ["milsim_respawn_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; + // notify player their request was rescinded "Re-insert Request Rescinded" call CBA_fnc_notify; }, { params ["_target", "_player", "_params"]; + private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + + // check if module is enabled, player is in the queue missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - (_player in ((missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#0})) + (_player in (_existingQueue apply {_x#0})) } ] call ace_interact_menu_fnc_createAction; [_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; @@ -213,7 +216,7 @@ if (hasInterface) then { ///////////////////////////////////////////////////// - // PILOTS ONLY + // PILOTS ONLY // ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]; localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; @@ -227,7 +230,7 @@ if (hasInterface) then { (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]) find _type != -1 ) exitWith {}; - + private _checkReinsertQueueAction = [ "milsim_respawn_checkReinsertQueue", "[PILOT] Check Re-insert Queue", @@ -267,13 +270,13 @@ if (hasInterface) then { )) exitWith {}; private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; if ( - diag_tickTime - _lastCheck < + diag_tickTime - _lastCheck < missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", 60*20] ) exitWith {}; // if last check was less than X minutes ago, skip // if last check was greater than 20 minutes ago, we'll prompt the notification now and reset the timer localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - + call milsim_respawn_fnc_showReinsertQueueNotification; }, 30] call CBA_fnc_addPerFrameHandler; }; From 9ec51a5e19cb72d1b6ecc4dec4035c4dc7eb8b4d Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Tue, 30 Jan 2024 15:05:02 -0800 Subject: [PATCH 16/17] big refactor to isolate functionality. adds milsim_fnc_log. --- functions/CfgFunctions.hpp | 23 +- .../reinsert/client/fn_addAceSelfActions.sqf | 67 +++++ .../client/fn_addCheckQueueSelfAction.sqf | 28 ++ functions/reinsert/client/fn_initClient.sqf | 53 ++++ .../reinsert/client/fn_requestShowQueue.sqf | 3 + functions/reinsert/fn_getBaseName.sqf | 8 + functions/reinsert/fn_getNearestBase.sqf | 10 + functions/reinsert/server/fn_addToQueue.sqf | 56 ++++ .../reinsert/server/fn_globalShowQueue.sqf | 70 +++++ functions/reinsert/server/fn_initServer.sqf | 50 +++ .../reinsert/server/fn_removeFromQueue.sqf | 57 ++++ .../fn_returnReinsertQueueNotification.sqf | 109 +++++++ .../reinsert/server/fn_validateQueue.sqf | 57 ++++ functions/respawn/fn_getNearestBase.sqf | 15 - functions/respawn/fn_init.sqf | 284 ------------------ .../fn_showReinsertQueueNotification.sqf | 56 ---- functions/settings/fn_addCBASettings.sqf | 75 ++++- functions/util/fn_addPlayerInfoToArray.sqf | 11 + functions/util/fn_getPlayerLogString.sqf | 33 +- functions/util/fn_log.sqf | 24 ++ 20 files changed, 714 insertions(+), 375 deletions(-) create mode 100644 functions/reinsert/client/fn_addAceSelfActions.sqf create mode 100644 functions/reinsert/client/fn_addCheckQueueSelfAction.sqf create mode 100644 functions/reinsert/client/fn_initClient.sqf create mode 100644 functions/reinsert/client/fn_requestShowQueue.sqf create mode 100644 functions/reinsert/fn_getBaseName.sqf create mode 100644 functions/reinsert/fn_getNearestBase.sqf create mode 100644 functions/reinsert/server/fn_addToQueue.sqf create mode 100644 functions/reinsert/server/fn_globalShowQueue.sqf create mode 100644 functions/reinsert/server/fn_initServer.sqf create mode 100644 functions/reinsert/server/fn_removeFromQueue.sqf create mode 100644 functions/reinsert/server/fn_returnReinsertQueueNotification.sqf create mode 100644 functions/reinsert/server/fn_validateQueue.sqf delete mode 100644 functions/respawn/fn_getNearestBase.sqf delete mode 100644 functions/respawn/fn_init.sqf delete mode 100644 functions/respawn/fn_showReinsertQueueNotification.sqf create mode 100644 functions/util/fn_addPlayerInfoToArray.sqf create mode 100644 functions/util/fn_log.sqf diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index e5f54d5..7951b16 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -73,14 +73,31 @@ class milsim class util { class getPlayerLogString {}; + class addPlayerInfoToArray {}; + class log {}; }; }; class milsim_respawn { class functions { - file = "functions\respawn"; - class init { postInit = 1; }; - class showReinsertQueueNotification {}; + file = "functions\reinsert"; + class getBaseName {}; class getNearestBase {}; }; + class server { + file = "functions\reinsert\server"; + class initServer { postInit = 1; }; + class addToQueue {}; + class globalShowQueue {}; + class removeFromQueue {}; + class returnReinsertQueueNotification {}; + class validateQueue {}; + }; + class client { + file = "functions\reinsert\client"; + class initClient { postInit = 1; }; + class addAceSelfActions {}; + class addCheckQueueSelfAction {}; + class requestShowQueue {}; + }; }; \ No newline at end of file diff --git a/functions/reinsert/client/fn_addAceSelfActions.sqf b/functions/reinsert/client/fn_addAceSelfActions.sqf new file mode 100644 index 0000000..fe4091a --- /dev/null +++ b/functions/reinsert/client/fn_addAceSelfActions.sqf @@ -0,0 +1,67 @@ +params ["_type"]; // string of the object's classname +if (!(_type isKindOf "CAManBase")) exitWith {}; + +if ( + (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]) + find _type != -1 +) exitWith {}; + +private _fileForReinsertAction = [ + "milsim_respawn_fileReinsertRequest", + "File Re-insert Request", + "\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa", + { // statement + params ["_target", "_player", "_params"]; + // find nearest base or location + private _base = [_player] call milsim_respawn_fnc_getNearestBase; + private _baseName = [_base] call milsim_respawn_fnc_getBaseName; + // send event to server + ["milsim_respawn_fileReinsertRequest", [_player, _base]] call CBA_fnc_serverEvent; + // notify player their request was filed + [["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify; + }, + { // condition + params ["_target", "_player", "_params"]; + // find nearest base or location + private _base = [_player] call milsim_respawn_fnc_getNearestBase; + private _baseDistance = _player distance _base; + + private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; + private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + + // check if module is enabled, player is near a base, and player is not already in the queue + // (serverTime - milsim_respawn_missionStartServerTime) > 60*5 && // only allow after 15 minutes + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + (_baseDistance < _maxRangeToReady) && + not (_player in (_existingQueue apply {_x#0})) + } +] call ace_interact_menu_fnc_createAction; +[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; + +private _removeFileForReinsertAction = [ + "milsim_respawn_removeReinsertRequest", + "Remove Re-insert Request", + "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", + { // statement + params ["_target", "_player", "_params"]; + // send event to server + ["milsim_respawn_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; + // notify player their request was rescinded + "Re-insert Request Rescinded" call CBA_fnc_notify; + }, + { // condition + params ["_target", "_player", "_params"]; + private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + + // check if module is enabled, player is in the queue + // (serverTime - milsim_respawn_missionStartServerTime) > 60*5 && // only allow after 15 minutes + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + (_player in (_existingQueue apply {_x#0})) + } +] call ace_interact_menu_fnc_createAction; +[_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; + +private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]); +_classesActionsAddedTo pushBackUnique _type; +localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", _classesActionsAddedTo]; + diff --git a/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf b/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf new file mode 100644 index 0000000..87f0746 --- /dev/null +++ b/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf @@ -0,0 +1,28 @@ +params ["_type"]; // string of the object's classname +if (!(_type isKindOf "CAManBase")) exitWith {}; + +if ( + (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]) + find _type != -1 +) exitWith {}; + +private _checkReinsertQueueAction = [ + "milsim_respawn_checkReinsertQueue", + "[PILOT] Check Re-insert Queue", + "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", + { + params ["_target", "_player", "_params"]; + // request notification from the server + call milsim_respawn_fnc_requestShowQueue; + // reset last check time + localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + }, + { + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] + } // always allow +] call ace_interact_menu_fnc_createAction; +[_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass; + +private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]); +_classesActionsAddedTo pushBackUnique _type; +localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", _classesActionsAddedTo]; \ No newline at end of file diff --git a/functions/reinsert/client/fn_initClient.sqf b/functions/reinsert/client/fn_initClient.sqf new file mode 100644 index 0000000..8a96f23 --- /dev/null +++ b/functions/reinsert/client/fn_initClient.sqf @@ -0,0 +1,53 @@ +if (!hasInterface) exitWith {}; + +// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS +localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", []]; +// add actions to current class +[typeOf player] call milsim_respawn_fnc_addAceSelfActions; +// add actions to future classes +["ace_interact_menu_newControllableObject", { + _this call milsim_respawn_fnc_addAceSelfActions; +}] call CBA_fnc_addEventHandler; + +///////////////////////////////////////////////////// +// PILOTS ONLY +// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS +if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { + localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]; + localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + + // add actions to current class + [typeOf player] call milsim_respawn_fnc_addCheckQueueSelfAction; + // add actions to future classes + ["ace_interact_menu_newControllableObject", { + _this call milsim_respawn_fnc_addCheckQueueSelfAction; + }] call CBA_fnc_addEventHandler; +}; +///////////////////////////////////////////////////// + + +// ADD TIMER FOR PILOTS - IF REINSERT LIST NOT CHECKED FOR 20 MINUTES, SHOW NOTIFICATION AUTOMATICALLY +if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { + [{ + // if module not enabled and pilot forced check not enabled, exit + if (not ( + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", true] + )) exitWith {}; + + // if last check was less than X minutes ago, skip + private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + private _requiredCheckInterval = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", 60*20]; + if ( + diag_tickTime - _lastCheck < + _requiredCheckInterval + ) exitWith {}; // if last check was less than X minutes ago, skip + + // last check was greater than X minutes ago + // reset last check time + localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + // request notification from the server + call milsim_respawn_fnc_requestShowQueue; + }, 30] call CBA_fnc_addPerFrameHandler; +}; +///////////////////////////////////////////////////// \ No newline at end of file diff --git a/functions/reinsert/client/fn_requestShowQueue.sqf b/functions/reinsert/client/fn_requestShowQueue.sqf new file mode 100644 index 0000000..11a8d03 --- /dev/null +++ b/functions/reinsert/client/fn_requestShowQueue.sqf @@ -0,0 +1,3 @@ +if (!hasInterface) exitWith {}; + +[] remoteExec ["milsim_respawn_fnc_returnReinsertQueueNotification", 2]; \ No newline at end of file diff --git a/functions/reinsert/fn_getBaseName.sqf b/functions/reinsert/fn_getBaseName.sqf new file mode 100644 index 0000000..ab2cbf8 --- /dev/null +++ b/functions/reinsert/fn_getBaseName.sqf @@ -0,0 +1,8 @@ +params [["_base", objNull, [objNull]]]; +if (_base == objNull) exitWith {""}; + +// get base name +private _baseName = _base getVariable ["name", ""]; +if (_baseName == "") then {_baseName = format["near %1", text (nearestLocation [_base, ["NameCity", "NameLocal"]])]}; + +_baseName; \ No newline at end of file diff --git a/functions/reinsert/fn_getNearestBase.sqf b/functions/reinsert/fn_getNearestBase.sqf new file mode 100644 index 0000000..3d955ba --- /dev/null +++ b/functions/reinsert/fn_getNearestBase.sqf @@ -0,0 +1,10 @@ +params [["_player", objNull, [objNull]]]; +if (isNull _player) exitWith {objNull}; + +private _bases = missionNamespace getVariable ["milsim_respawn_bases", []]; +if (count _bases == 0) exitWith {objNull}; + +// get nearest base (Module_Respawn_F) +private _closestBase = [_bases, _player] call BIS_fnc_nearestPosition; +if (isNull _closestBase) exitWith {objNull}; +_closestBase; \ No newline at end of file diff --git a/functions/reinsert/server/fn_addToQueue.sqf b/functions/reinsert/server/fn_addToQueue.sqf new file mode 100644 index 0000000..24f63ad --- /dev/null +++ b/functions/reinsert/server/fn_addToQueue.sqf @@ -0,0 +1,56 @@ +params [ + ["_player", objNull, [objNull]], + ["_base", objNull, [objNull]], + ["_timeFiled", diag_tickTime, [25]] +]; + +if (!isServer) exitWith { + [ + "respawn_reinsertion", + "ATTEMPTED RUN ON CLIENT", + [ + ["player", _player], + ["base", _base] + ] + ] call milsim_fnc_log; +}; +if ( + isNull _player || + isNull _base +) exitWith { + [ + "respawn_reinsertion", + "NULL PARAMETERS", + [ + ["player", _player], + ["base", _base] + ] + ] call milsim_fnc_log; +}; + + +private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; +// nearest base here is the same as the base sent +private _nearestBase = _base; + +milsim_respawn_reinsertionQueue pushBackUnique [ + _player, _base, _timeFiled +]; +// broadcast new list to all machines +publicVariable "milsim_respawn_reinsertionQueue"; + +// log to rpt +private _logParams = [ + ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBaseDistance", _player distance _base], + ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBaseDistance", _player distance _nearestBase], + ["maxDistanceSetting", _maxRangeToReady], + ["inQueueDuration", diag_tickTime - _timeFiled] +]; +_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray; +[ + "respawn_reinsertion", + "PLAYER FILED REQUEST", + _logParams +] call milsim_fnc_log; \ No newline at end of file diff --git a/functions/reinsert/server/fn_globalShowQueue.sqf b/functions/reinsert/server/fn_globalShowQueue.sqf new file mode 100644 index 0000000..566a780 --- /dev/null +++ b/functions/reinsert/server/fn_globalShowQueue.sqf @@ -0,0 +1,70 @@ +if (!isServer) exitWith {}; + +// if at least 1 player in the queue has been waiting longer than the configured timeout, notify all players +private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_max_wait", 60*20]; // default 20 minutes +private _timeoutPlayers = milsim_respawn_reinsertionQueue select { + _x params ["_player", "_base", "_timeFiled"]; + alive (_player) && + (diag_tickTime - (_timeFiled)) > _timeout +}; +if (count _timeoutPlayers > 0) then { + // GLOBAL CBA NOTIFY + private _playerLines = [["Players are still waiting for Re-insert!", 1.2, [1, 0.64, 0, 1]]]; + private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; + + // get base objects from queue + private _basesWithPeople = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; + // get unique base objects + private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople; + + { + private _thisBase = _x; + + // Add line for base name + _playerLines pushBack ([[_thisBase] call milsim_respawn_fnc_getBaseName, 1, [0,1,0,1]]); + + // Get players under this base + private _thisBasePlayers = _timeoutPlayers select {_x#1 isEqualTo _thisBase}; + // sort _timeoutPlayers by time in queue, descending + _thisBasePlayers = [_thisBasePlayers, [], { + _x params ["_player", "_base", "_timeFiled"]; + _timeFiled; + }, "DESCEND"] call BIS_fnc_sortBy; + + + { // for each player under this base, add a line + _x params ["_player", "_base", "_timeFiled"]; + // get the closest base to the player + private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; + + // add player to array of players under bases + _playerLines pushBack ([format [ + "%1: %2 [%3]", + groupID (group (_player)), + name (_player), + [diag_tickTime - (_timeFiled), "MM:SS"] call BIS_fnc_secondsToString + ], 0.8, [0.8, 0.8, 0.8, 1]]); + + // log to rpt + private _logParams = [ + ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBaseDistance", _player distance _base], + ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBaseDistance", _player distance _nearestBase], + ["maxDistanceSetting", _maxRangeToReady], + ["inQueueDuration", diag_tickTime - _timeFiled] + ]; + _logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray; + [ + "respawn_reinsertion", + "PLAYER WAITING OVER TIMEOUT", + _logParams + ] call milsim_fnc_log; + } forEach _thisBasePlayers; + } forEach _basesWithPeople; + + // SEND NOTIFY + _playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated]; + // RESET NOTIFICATION TIMER + milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; +}; \ No newline at end of file diff --git a/functions/reinsert/server/fn_initServer.sqf b/functions/reinsert/server/fn_initServer.sqf new file mode 100644 index 0000000..a93a91a --- /dev/null +++ b/functions/reinsert/server/fn_initServer.sqf @@ -0,0 +1,50 @@ +// if a player files for reinsert using self-interaction +// they're added to the queue along with their nearest base location and the time they filed +// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around +// the player's time in the queue stating how long they have been waiting, their name, and their group's name + +if (!isServer) exitWith {}; + +// array of all respawn modules in the mission, used as 'base' locations for reinsertion +milsim_respawn_bases = allMissionObjects "ModuleRespawnPosition_F"; +publicVariable "milsim_respawn_bases"; + +// register queue +milsim_respawn_reinsertionQueue = []; +publicVariable "milsim_respawn_reinsertionQueue"; + + +// server mission start time +milsim_respawn_missionStartServerTime = serverTime; + +// FILE REQUEST CBA HANDLER +["milsim_respawn_fileReinsertRequest", { + params ["_player", "_base"]; + [_player, _base] call milsim_respawn_fnc_addToQueue; +}] call CBA_fnc_addEventHandler; + +// REMOVE REQUEST CBA HANDLER +["milsim_respawn_removeReinsertRequest", { + params ["_player"]; + [_player] call milsim_respawn_fnc_removeFromQueue; +}] call CBA_fnc_addEventHandler; + + +// automated wait threshold timer +milsim_respawn_reinsertionOverTimeoutLastNotificationTime = 0; + +[{ // every 60 seconds + + // validate queue + call milsim_respawn_fnc_validateQueue; + + // check if last overTimeout notification was sent more than X minutes ago + if ( + diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5 + ) then { + // show global queue notification with any players that are over timeout + call milsim_respawn_fnc_globalShowQueue; + }; + +}, 60] call CBA_fnc_addPerFrameHandler; + diff --git a/functions/reinsert/server/fn_removeFromQueue.sqf b/functions/reinsert/server/fn_removeFromQueue.sqf new file mode 100644 index 0000000..f230c63 --- /dev/null +++ b/functions/reinsert/server/fn_removeFromQueue.sqf @@ -0,0 +1,57 @@ +params [["_player", objNull, [objNull]]]; + +if (!isServer) exitWith { + [ + "respawn_reinsertion", + "ATTEMPTED RUN ON CLIENT", + [ + ["player", _player] + ] + ] call milsim_fnc_log; +}; +if (isNull _player) exitWith { + [ + "respawn_reinsertion", + "NULL PARAMETERS", + [ + ["player", _player] + ] + ] call milsim_fnc_log; +}; + +// get entries for this player from queue +private _unitArrs = milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _player}; +// if player not in queue, skip +if (count _unitArrs isEqualTo 0) exitWith {}; + +private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; + +// remove player from queue +milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue - _unitArrs; +// broadcast new list to all machines +publicVariable "milsim_respawn_reinsertionQueue"; + +// sort _unitArrs by time in queue, descending, to get longest wait (if for some reason there's a duplicate) +[_unitArrs, [], { + _x#2 +}, "DESCEND"] call BIS_fnc_sortBy; + +// get first entry (longest wait) +(_unitArrs#0) params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, base, timeInQueue] +// get the closest base to the player +private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; +// log to rpt +private _logParams = [ + ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBaseDistance", _player distance _base], + ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBaseDistance", _player distance _nearestBase], + ["maxDistanceSetting", _maxRangeToReady], + ["inQueueDuration", diag_tickTime - _timeFiled] +]; +_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray; +[ + "respawn_reinsertion", + "PLAYER RESCINDED REQUEST", + _logParams +] call milsim_fnc_log; \ No newline at end of file diff --git a/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf b/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf new file mode 100644 index 0000000..e7eaf0a --- /dev/null +++ b/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf @@ -0,0 +1,109 @@ +/* + Function: milsim_respawn_fnc_showReinsertQueueNotification + + Description: + Designed to be remoteExecuted on the server. Will show a CBA notification on the remoteExecutedOwner's screen with the current reinsertion queue and log this occurrence in the server RPT. + + Author: IndigoFox +*/ + +if (not isRemoteExecuted) exitWith { + diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE NOT REMOTE EXECUTED"]; +}; +if (not isServer) exitWith { + diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE NOT RUN ON SERVER"]; +}; + +private _users = allUsers apply {getUserInfo _x} select {count _x > 0}; +private _userIndex = _users findIf {_x#1 isEqualTo remoteExecutedOwner}; +if (_userIndex isEqualTo -1) exitWith { + diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE USER NOT FOUND"]; +}; +private _userObject = _users select _userIndex select 10; +if (isNull _userObject) exitWith { + diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE USER OBJECT NOT FOUND"]; +}; + +// log to rpt +private _logParams = [_userObject, []] call milsim_fnc_addPlayerInfoToArray; +[ + "respawn_reinsertion", + "SHOW QUEUE REQUESTED", + _logParams +] call milsim_fnc_log; + +private _queue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; +// get base objects from queue +private _basesWithPeople = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; +// get unique base objects +private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople; + +// text array to use in notification +private _par = [["Players Awaiting Reinsert", 1.2, [1,0.64,0,1]]]; + +if (count _basesWithPeople isEqualTo 0) then { + _par pushBack ["[QUEUE EMPTY]", 1, [1,1,1,1]]; +}; + +// forEach _basesWithPeople +{ + private _thisBase = _x; + private _baseName = [_thisBase] call milsim_respawn_fnc_getBaseName; + + // generate player lines for this base + private _playerLines = _queue select { + _x#1 isEqualTo _thisBase + } apply { + _x params ["_player", "_base", "_timeFiled"]; + [ + format [ + "%1: %2 [%3]", + groupId (group _player), + name _player, + [diag_tickTime - _timeFiled, "MM:SS"] call BIS_fnc_secondsToString + ], + 0.8, + [1,1,1,1] + ]; + }; + + // determine suffix for player count based on count + private _playerCountText = ""; + switch (count _playerLines) do { + case 0: { + _playerCountText = "No players"; + }; + case 1: { + _playerCountText = "1 player"; + }; + default { + _playerCountText = format ["%1 players", count _playerLines]; + }; + }; + + // add base name and player count to notification lines + _par pushBack [ + format ["Location: %1 (%2)", + _baseName, + _playerCountText + ], + 1, + [0,1,0,1] + ]; + + // sort by text (first piece of text is group name) + _playerLines = [ + _playerLines, + [], + {_x#0} + ] call BIS_fnc_sortBy; + + // add to notification lines + { + _par pushBack _x; + } forEach _playerLines; +} forEach _basesWithPeople; + +_par remoteExec ["CBA_fnc_notify", remoteExecutedOwner]; + +true; \ No newline at end of file diff --git a/functions/reinsert/server/fn_validateQueue.sqf b/functions/reinsert/server/fn_validateQueue.sqf new file mode 100644 index 0000000..cce9bac --- /dev/null +++ b/functions/reinsert/server/fn_validateQueue.sqf @@ -0,0 +1,57 @@ +// revalidate any players in the queue +// compare their distance to the nearest base, and remove them if they're too far away (or dead) +private _stillValid = []; +private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; +{ + _x params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] + + private _distanceToOriginalBase = _player distance _base; + // get the closest base to the player + private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; + private _isCloseEnoughToAnyBase = (_player distance _nearestBase) < _maxRangeToReady; + + if (not _isCloseEnoughToAnyBase || not (alive _player)) then { + // don't include player in updated queue + // log to rpt + private _logParams = [ + ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBaseDistance", _player distance _base], + ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBaseDistance", _player distance _nearestBase], + ["maxDistanceSetting", _maxRangeToReady], + ["inQueueDuration", diag_tickTime - _timeFiled] + ]; + _logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray; + [ + "respawn_reinsertion", + "PLAYER DEQUEUED AUTOMATICALLY", + _logParams + ] call milsim_fnc_log; + // continue loop + continue + }; + + // include player in updated queue, and update their location to nearest base + _stillValid pushBackUnique [_player, _nearestBase, _timeFiled]; + // if player's base has changed, log to rpt + if (_base != _nearestBase) then { + private _logParams = [ + ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBaseDistance", _player distance _base], + ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBaseDistance", _player distance _nearestBase], + ["maxDistanceSetting", _maxRangeToReady], + ["inQueueDuration", diag_tickTime - _timeFiled] + ]; + _logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray; + [ + "respawn_reinsertion", + "PLAYER BASE WAS UPDATED", + _logParams + ] call milsim_fnc_log; + }; +} forEach milsim_respawn_reinsertionQueue; + +// broadcast new list to all machines +milsim_respawn_reinsertionQueue = _stillValid; +publicVariable "milsim_respawn_reinsertionQueue"; \ No newline at end of file diff --git a/functions/respawn/fn_getNearestBase.sqf b/functions/respawn/fn_getNearestBase.sqf deleted file mode 100644 index c9039aa..0000000 --- a/functions/respawn/fn_getNearestBase.sqf +++ /dev/null @@ -1,15 +0,0 @@ -params [["_player", objNull, [objNull]]]; -if (isNull _player) exitWith {[99999, ""]}; - -private _bases = missionNamespace getVariable ["milsim_respawn_bases", []]; -if (count _bases == 0) exitWith {[99999, ""]}; - -// get nearest base (Module_Respawn_F) -private _closestBase = [_bases, _player] call BIS_fnc_nearestPosition; -// get distance -private _nearestDistance = _closestBase distance _player; -// get base name -private _baseName = _closestBase getVariable ["name", ""]; -if (_baseName == "") then {_baseName = format["near %1", text (nearestLocation [_closestBase, ""])]}; - -[_nearestDistance, _baseName]; \ No newline at end of file diff --git a/functions/respawn/fn_init.sqf b/functions/respawn/fn_init.sqf deleted file mode 100644 index 56a6836..0000000 --- a/functions/respawn/fn_init.sqf +++ /dev/null @@ -1,284 +0,0 @@ - -// if a player files for reinsert using self-interaction -// they're added to the queue along with their nearest base location and the time they filed -// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around -// the player's time in the queue stating how long they have been waiting, their name, and their group's name - -// execute for all -if (isNil "milsim_respawn_setting_reinsertion_maxRangeToReady") then { - // configured in CBA settings - milsim_respawn_setting_reinsertion_maxRangeToReady = 400; // distance in meters from a base at which players can ready up for pickup. players removed from the queue if they move further away than this distance -}; -milsim_respawn_bases = allMissionObjects "ModuleRespawnPosition_F"; // array of all respawn modules in the mission - - -// on the server, initialize the queue and register the CBA event handler by which players can ready up -if (isServer) then { - // register queue - milsim_respawn_reinsertionQueue = []; - publicVariable "milsim_respawn_reinsertionQueue"; - - milsim_respawn_reinsertionOverTimeoutLastNotificationTime = 0; - - // register event handlers - ["milsim_respawn_fileReinsertRequest", { - params ["_unit", "_closestBaseName"]; - milsim_respawn_reinsertionQueue pushBackUnique [ - _unit, _closestBaseName, diag_tickTime - ]; - diag_log text format [ - "[milsim] (respawn_reinsertion) PLAYER FILED REQUEST :: filedAtBase=""%1"" %2", - _closestBaseName, - [_unit] call milsim_fnc_getPlayerLogString - ]; - publicVariable "milsim_respawn_reinsertionQueue"; - }] call CBA_fnc_addEventHandler; - ["milsim_respawn_removeReinsertRequest", { - params ["_unit"]; - private _unitArrs = milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _unit}; - if (count _unitArrs isEqualTo 0) exitWith {}; - - milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue - _unitArrs; - // sort _unitArrs by time in queue, descending - [_unitArrs, [], { - _x#2 - }, "DESCEND"] call BIS_fnc_sortBy; - (_unitArrs#0) params ["_unit", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] - private _timeInQueue = diag_tickTime - (_timeFiled); - diag_log text format ["[milsim] (respawn_reinsertion) PLAYER RESCINDED REQUEST :: filedAtBase=""%1"" inQueueDuration=""%2s"" %3", - _baseName, - _timeInQueue, - [_unit] call milsim_fnc_getPlayerLogString - ]; - publicVariable "milsim_respawn_reinsertionQueue"; - }] call CBA_fnc_addEventHandler; - - - - [{ - // every 60 seconds, revalidate any players in the queue - // compare their distance to the nearest base, and remove them if they're too far away (or dead) - private _stillValid = []; - private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; - { - _x params ["_player", "_baseName", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] - - - private _nearBase = _nearestDistance < _maxRangeToReady; - - if (_nearBase && alive _player) then { - _stillValid pushBackUnique _x; - } else { - diag_log text format [ - "[milsim] (respawn_reinsertion) PLAYER DEQUEUED AUTOMATICALLY :: filedAtBase=""%1"" nearestBaseDistance=""%2m"" maxDistanceSetting=""%3m"" inQueueDuration=""%4s"" %5", - _baseName, - _nearestDistance, - _maxRangeToReady, - diag_tickTime - _timeFiled, - [_player] call milsim_fnc_getPlayerLogString - ]; - }; - } forEach milsim_respawn_reinsertionQueue; - - // broadcast new list to all machines - milsim_respawn_reinsertionQueue = _stillValid; - publicVariable "milsim_respawn_reinsertionQueue"; - - - // if at least 1 player in the queue has been waiting longer than the configured timeout, - // show a notification to all players if the last notification was more than 5 minutes ago - private _needNotification = - diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5; // if last notification was more than 5 minutes ago - if (_needNotification) then { - private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_timeout", 60*20]; // default 20 minutes - private _timeoutPlayers = milsim_respawn_reinsertionQueue select { - alive (_x#0) && - (diag_tickTime - (_x#2)) > _timeout - }; - if (count _timeoutPlayers > 0) then { - // sort _timeoutPlayers by time in queue, descending - _timeoutPlayers = [_timeoutPlayers, [], { - _x#2 - }, "DESCEND"] call BIS_fnc_sortBy; - - // GLOBAL CBA NOTIFY - private _playerLines = [["Players are still waiting for Re-insert!"]]; - { - _playerLines pushBack ([format [ - "%1: %2 [%3]", - groupID (group (_x#0)), - name (_x#0), - [diag_tickTime - (_x#2), "MM:SS"] call BIS_fnc_secondsToString - ], 0.8, [0.8, 0.8, 0.8, 1]]); - } forEach _timeoutPlayers; - _playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated]; - - // RESET NOTIFICATION TIMER - milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; - - // LOG TO RPT - { - diag_log text format [ - "[milsim] (respawn_reinsertion) PLAYER WAITING OVER TIMEOUT :: timeout=""%1s"" inQueueDuration=""%2s"" %3", - _timeout, - diag_tickTime - (_x#2), - [_x#0] call milsim_fnc_getPlayerLogString - ]; - } forEach _timeoutPlayers; - }; - }; - }, 60] call CBA_fnc_addPerFrameHandler; -}; - - -// if a player, register the ACE self-interaction to ready up -if (hasInterface) then { - - // ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS - localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", []]; - - private _addReinsertRequestSelfActions = { - params ["_type"]; // string of the object's classname - if (!(_type isKindOf "CAManBase")) exitWith {}; - - if ( - (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]) - find _type != -1 - ) exitWith {}; - - private _fileForReinsertAction = [ - "milsim_respawn_fileReinsertRequest", - "File Re-insert Request", - "\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa", - { - params ["_target", "_player", "_params"]; - // find nearest base or location - ([_player] call milsim_respawn_fnc_getNearestBase) params [ - "_baseDistance", "_baseName" - ]; - // send event to server - ["milsim_respawn_fileReinsertRequest", [_player, _baseName]] call CBA_fnc_serverEvent; - // notify player their request was filed - [["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify; - }, - { - params ["_target", "_player", "_params"]; - // find nearest base or location - ([_player] call milsim_respawn_fnc_getNearestBase) params [ - "_baseDistance", "_baseName" - ]; - - private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; - private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; - - // check if module is enabled, player is near a base, and player is not already in the queue - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - (_baseDistance < _maxRangeToReady) && - not (_player in (_existingQueue apply {_x#0})) - } - ] call ace_interact_menu_fnc_createAction; - [_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; - - private _removeFileForReinsertAction = [ - "milsim_respawn_removeReinsertRequest", - "Remove Re-insert Request", - "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", - { - params ["_target", "_player", "_params"]; - // send event to server - ["milsim_respawn_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; - // notify player their request was rescinded - "Re-insert Request Rescinded" call CBA_fnc_notify; - }, - { - params ["_target", "_player", "_params"]; - - private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; - - // check if module is enabled, player is in the queue - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - (_player in (_existingQueue apply {_x#0})) - } - ] call ace_interact_menu_fnc_createAction; - [_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; - - private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]); - _classesActionsAddedTo pushBackUnique _type; - localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", _classesActionsAddedTo]; - }; - - [typeOf player] call _addReinsertRequestSelfActions; - - ["ace_interact_menu_newControllableObject", { - _thisArgs params ["_fnc"]; - _this call _fnc; - }, [_addReinsertRequestSelfActions]] call CBA_fnc_addEventHandlerArgs; - - - ///////////////////////////////////////////////////// - // PILOTS ONLY - // ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS - localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]; - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - - private _addCheckReinsertQueueSelfAction = { - params ["_type"]; // string of the object's classname - if (!(_type isKindOf "CAManBase")) exitWith {}; - if (!(_type in ["B_Helipilot_F", "B_helicrew_F"])) exitWith {}; - - if ( - (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]) - find _type != -1 - ) exitWith {}; - - private _checkReinsertQueueAction = [ - "milsim_respawn_checkReinsertQueue", - "[PILOT] Check Re-insert Queue", - "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", - { - params ["_target", "_player", "_params"]; - // reset last check time - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - - call milsim_respawn_fnc_showReinsertQueueNotification; - }, - { - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] - } // always allow - ] call ace_interact_menu_fnc_createAction; - [_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass; - - private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]); - _classesActionsAddedTo pushBackUnique _type; - localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", _classesActionsAddedTo]; - }; - - [typeOf player] call _addCheckReinsertQueueSelfAction; - - ["ace_interact_menu_newControllableObject", { - _thisArgs params ["_fnc"]; - _this call _fnc; - }, [_addCheckReinsertQueueSelfAction]] call CBA_fnc_addEventHandlerArgs; - - - // ADD TIMER FOR PILOTS - IF REINSERT LIST NOT CHECKED FOR 20 MINUTES, SHOW NOTIFICATION AUTOMATICALLY - if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { - [{ - if (not ( - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", true] - )) exitWith {}; - private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - if ( - diag_tickTime - _lastCheck < - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", 60*20] - ) exitWith {}; // if last check was less than X minutes ago, skip - - // if last check was greater than 20 minutes ago, we'll prompt the notification now and reset the timer - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - - call milsim_respawn_fnc_showReinsertQueueNotification; - }, 30] call CBA_fnc_addPerFrameHandler; - }; - ///////////////////////////////////////////////////// -}; diff --git a/functions/respawn/fn_showReinsertQueueNotification.sqf b/functions/respawn/fn_showReinsertQueueNotification.sqf deleted file mode 100644 index 4c626a2..0000000 --- a/functions/respawn/fn_showReinsertQueueNotification.sqf +++ /dev/null @@ -1,56 +0,0 @@ -private _par = [["Players Awaiting Reinsert", 1.2, [1,0.64,0,1]]]; -private _baseNames = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; -{ - private _baseName = _x; - private _peopleAtThisBase = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) select { - _x#1 isEqualTo _baseName - } apply { - private _timeInQueue = diag_tickTime - (_x#2); - [ - format [ - "%1: %2 [%3]", - groupId (group (_x#0)), - name (_x#0), - [_timeInQueue, "MM:SS"] call BIS_fnc_secondsToString - ], - 0.7, - [1,1,1,1] - ]; - }; - - _peopleAtThisBase = [ - _peopleAtThisBase, - [], - {_x#0} - ] call BIS_fnc_sortBy; - - private _playerCountText = ""; - switch (count _peopleAtThisBase) do { - case 0: { - _playerCountText = "No players"; - }; - case 1: { - _playerCountText = "1 player"; - }; - default { - _playerCountText = format ["%1 players", count _peopleAtThisBase]; - }; - }; - - _par pushBack [ - format ["Location: %1 (%2)", - _baseName, - _playerCountText - ], - 1, - [0,1,0,1] - ]; - - { - _par pushBack _x; - } forEach _peopleAtThisBase; -} forEach _baseNames; - -_par call CBA_fnc_notify; - -true; \ No newline at end of file diff --git a/functions/settings/fn_addCBASettings.sqf b/functions/settings/fn_addCBASettings.sqf index c541b2b..fc786f5 100644 --- a/functions/settings/fn_addCBASettings.sqf +++ b/functions/settings/fn_addCBASettings.sqf @@ -136,7 +136,17 @@ true, // global setting { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) enabled set to %1", _value]; + [ + "respawn_reinsertion", + "SETTING CHANGED", + [ + [ + "setting", + "milsim_respawn_setting_reinsertion_enabled" + ], + ["newValue", _value] + ] + ] call milsim_fnc_log; } ] call CBA_fnc_addSetting; @@ -149,7 +159,17 @@ true, // global setting { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) maxRangeToReady set to %1", _value]; + [ + "respawn_reinsertion", + "SETTING CHANGED", + [ + [ + "setting", + "milsim_respawn_setting_reinsertion_maxRangeToReady" + ], + ["newValue", _value] + ] + ] call milsim_fnc_log; } ] call CBA_fnc_addSetting; @@ -162,34 +182,63 @@ true, // global setting { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) pilotForcedCheckEnabled set to %1", _value]; + [ + "respawn_reinsertion", + "SETTING CHANGED", + [ + [ + "setting", + "milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled" + ], + ["newValue", _value] + ] + ] call milsim_fnc_log; } ] call CBA_fnc_addSetting; [ "milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", // variable - "SLIDER", // type - ["Pilot Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title + "TIME", // type + ["Pilot Forced Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title ["17th Battalion", "Re-insert Queue"], // category - [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage + [60*5, 60*30, 60*10], // [_min, _max, _default] true, { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) pilotForcedCheckInterval set to %1", _value]; - + [ + "respawn_reinsertion", + "SETTING CHANGED", + [ + [ + "setting", + "milsim_respawn_setting_reinsertion_pilotForcedCheckInterval" + ], + ["newValue", _value] + ] + ] call milsim_fnc_log; } ] call CBA_fnc_addSetting; [ - "milsim_respawn_setting_reinsertion_timeout", // variable - "SLIDER", // type - ["Request Timeout", "How long should at least one person be waiting before prompting a global notification."], // title + "milsim_respawn_setting_reinsertion_max_wait", // variable + "TIME", // type + ["Max Wait Threshold", "How long should at least one person be waiting before prompting a global notification."], // title ["17th Battalion", "Re-insert Queue"], // category - [60*10, 60*30, 60*20, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage + [60*5, 60*30, 60*20], // [_min, _max, _default] true, { params ["_value"]; - diag_log format["[milsim] (respawn_reinsertion) timeout set to %1", _value]; + [ + "respawn_reinsertion", + "SETTING CHANGED", + [ + [ + "setting", + "milsim_respawn_setting_reinsertion_max_wait" + ], + ["newValue", _value] + ] + ] call milsim_fnc_log; } ] call CBA_fnc_addSetting; diff --git a/functions/util/fn_addPlayerInfoToArray.sqf b/functions/util/fn_addPlayerInfoToArray.sqf new file mode 100644 index 0000000..b5e45c5 --- /dev/null +++ b/functions/util/fn_addPlayerInfoToArray.sqf @@ -0,0 +1,11 @@ +params [["_playerObj", objNull], ["_arrayToModify", [], [[]]]]; + +{ + _arrayToModify = [_arrayToModify, _x#0, _x#1] call BIS_fnc_setToPairs; +} forEach [ + ["playerName", name _playerObj], + ["playerUID", getPlayerUID _playerObj], + ["playerGroup", groupId (group _playerObj)] +]; + +_arrayToModify; \ No newline at end of file diff --git a/functions/util/fn_getPlayerLogString.sqf b/functions/util/fn_getPlayerLogString.sqf index d3f5ae0..3b194eb 100644 --- a/functions/util/fn_getPlayerLogString.sqf +++ b/functions/util/fn_getPlayerLogString.sqf @@ -8,10 +8,35 @@ Parameters: 0: _playerObj - The player object to get the string for. + 1: _returnArray - If true, returns a key/value array of the player's name, UID and group name. */ -params [["_playerObj", objNull]]; -if (isNull _playerObj) exitWith { - "playerName=""ERROR"" playerUID=""ERROR"" playerGroup=""ERROR""" +params [["_playerObj", objNull], ["_returnArray", false, [false, true]]]; + +switch (_returnArray) do { + case false: { + if (isNull _playerObj) exitWith { + "playerName=""ERROR"" playerUID=""ERROR"" playerGroup=""ERROR""" + }; + if (true) exitWith { + format["playerName=""%1"" playerUID=""%2"" playerGroup=""%3""", name _playerObj, getPlayerUID _playerObj, groupId (group _playerObj)]; + }; + }; + case true: { + if (isNull _playerObj) exitWith { + [ + ["playerName", "ERROR"], + ["playerUID", "ERROR"], + ["playerGroup", "ERROR"] + ] + }; + if (true) exitWith { + [ + ["playerName", name _playerObj], + ["playerUID", getPlayerUID _playerObj], + ["playerGroup", groupId (group _playerObj)] + ] + }; + }; }; -format["playerName=""%1"" playerUID=""%2"" playerGroup=""%3""", name _playerObj, getPlayerUID _playerObj, groupId (group _playerObj)]; \ No newline at end of file + diff --git a/functions/util/fn_log.sqf b/functions/util/fn_log.sqf new file mode 100644 index 0000000..5b780b4 --- /dev/null +++ b/functions/util/fn_log.sqf @@ -0,0 +1,24 @@ +/* + Function: milsim_fnc_log + + Description: + Used to log messages to the server RPT file. + + Parameters: + 0: STRING - component name. + 1: STRING - message to log. + 2: ARRAY - Key value pairs of data to log. +*/ + +params [ + ["_component", "", [""]], + ["_message", "", [""]], + ["_data", [], [[]]] +]; + +private _hash = createHashMapFromArray _data; + +private _json = [_hash] call CBA_fnc_encodeJSON; +_log = format ["[milsim] (%1) (%2) (%3) :: %4", _component, _fnc_scriptNameParent, _message, _json]; + +diag_log text _log; \ No newline at end of file From 53c1d3b18d013e6ce4815969e36051dc8cd66edd Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Tue, 30 Jan 2024 15:37:04 -0800 Subject: [PATCH 17/17] change milsim_respawn to milsim_reinsert --- functions/CfgFunctions.hpp | 2 +- .../reinsert/client/fn_addAceSelfActions.sqf | 34 +++++++++---------- .../client/fn_addCheckQueueSelfAction.sqf | 14 ++++---- functions/reinsert/client/fn_initClient.sqf | 26 +++++++------- .../reinsert/client/fn_requestShowQueue.sqf | 2 +- functions/reinsert/fn_getNearestBase.sqf | 2 +- functions/reinsert/server/fn_addToQueue.sqf | 10 +++--- .../reinsert/server/fn_globalShowQueue.sqf | 18 +++++----- functions/reinsert/server/fn_initServer.sqf | 26 +++++++------- .../reinsert/server/fn_removeFromQueue.sqf | 14 ++++---- .../fn_returnReinsertQueueNotification.sqf | 8 ++--- .../reinsert/server/fn_validateQueue.sqf | 18 +++++----- functions/settings/fn_addCBASettings.sqf | 20 +++++------ 13 files changed, 97 insertions(+), 97 deletions(-) diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp index 7951b16..cd622c8 100644 --- a/functions/CfgFunctions.hpp +++ b/functions/CfgFunctions.hpp @@ -78,7 +78,7 @@ class milsim }; }; -class milsim_respawn { +class milsim_reinsert { class functions { file = "functions\reinsert"; class getBaseName {}; diff --git a/functions/reinsert/client/fn_addAceSelfActions.sqf b/functions/reinsert/client/fn_addAceSelfActions.sqf index fe4091a..7734e1b 100644 --- a/functions/reinsert/client/fn_addAceSelfActions.sqf +++ b/functions/reinsert/client/fn_addAceSelfActions.sqf @@ -2,36 +2,36 @@ params ["_type"]; // string of the object's classname if (!(_type isKindOf "CAManBase")) exitWith {}; if ( - (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]) + (localNamespace getVariable ["milsim_reinsert_fileForReinsertClassesAdded", []]) find _type != -1 ) exitWith {}; private _fileForReinsertAction = [ - "milsim_respawn_fileReinsertRequest", + "milsim_reinsert_fileReinsertRequest", "File Re-insert Request", "\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa", { // statement params ["_target", "_player", "_params"]; // find nearest base or location - private _base = [_player] call milsim_respawn_fnc_getNearestBase; - private _baseName = [_base] call milsim_respawn_fnc_getBaseName; + private _base = [_player] call milsim_reinsert_fnc_getNearestBase; + private _baseName = [_base] call milsim_reinsert_fnc_getBaseName; // send event to server - ["milsim_respawn_fileReinsertRequest", [_player, _base]] call CBA_fnc_serverEvent; + ["milsim_reinsert_fileReinsertRequest", [_player, _base]] call CBA_fnc_serverEvent; // notify player their request was filed [["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify; }, { // condition params ["_target", "_player", "_params"]; // find nearest base or location - private _base = [_player] call milsim_respawn_fnc_getNearestBase; + private _base = [_player] call milsim_reinsert_fnc_getNearestBase; private _baseDistance = _player distance _base; - private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; - private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400]; + private _existingQueue = missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]; // check if module is enabled, player is near a base, and player is not already in the queue - // (serverTime - milsim_respawn_missionStartServerTime) > 60*5 && // only allow after 15 minutes - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + // (serverTime - milsim_reinsert_missionStartServerTime) > 60*5 && // only allow after 15 minutes + missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] && (_baseDistance < _maxRangeToReady) && not (_player in (_existingQueue apply {_x#0})) } @@ -39,29 +39,29 @@ private _fileForReinsertAction = [ [_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; private _removeFileForReinsertAction = [ - "milsim_respawn_removeReinsertRequest", + "milsim_reinsert_removeReinsertRequest", "Remove Re-insert Request", "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", { // statement params ["_target", "_player", "_params"]; // send event to server - ["milsim_respawn_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; + ["milsim_reinsert_removeReinsertRequest", [_player]] call CBA_fnc_serverEvent; // notify player their request was rescinded "Re-insert Request Rescinded" call CBA_fnc_notify; }, { // condition params ["_target", "_player", "_params"]; - private _existingQueue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; + private _existingQueue = missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]; // check if module is enabled, player is in the queue - // (serverTime - milsim_respawn_missionStartServerTime) > 60*5 && // only allow after 15 minutes - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && + // (serverTime - milsim_reinsert_missionStartServerTime) > 60*5 && // only allow after 15 minutes + missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] && (_player in (_existingQueue apply {_x#0})) } ] call ace_interact_menu_fnc_createAction; [_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; -private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_fileForReinsertClassesAdded", []]); +private _classesActionsAddedTo = (localNamespace getVariable ["milsim_reinsert_fileForReinsertClassesAdded", []]); _classesActionsAddedTo pushBackUnique _type; -localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", _classesActionsAddedTo]; +localNamespace setVariable ["milsim_reinsert_fileForReinsertClassesAdded", _classesActionsAddedTo]; diff --git a/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf b/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf index 87f0746..5897b53 100644 --- a/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf +++ b/functions/reinsert/client/fn_addCheckQueueSelfAction.sqf @@ -2,27 +2,27 @@ params ["_type"]; // string of the object's classname if (!(_type isKindOf "CAManBase")) exitWith {}; if ( - (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]) + (localNamespace getVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []]) find _type != -1 ) exitWith {}; private _checkReinsertQueueAction = [ - "milsim_respawn_checkReinsertQueue", + "milsim_reinsert_checkReinsertQueue", "[PILOT] Check Re-insert Queue", "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", { params ["_target", "_player", "_params"]; // request notification from the server - call milsim_respawn_fnc_requestShowQueue; + call milsim_reinsert_fnc_requestShowQueue; // reset last check time - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + localNamespace setVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime]; }, { - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] + missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] } // always allow ] call ace_interact_menu_fnc_createAction; [_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass; -private _classesActionsAddedTo = (localNamespace getVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]); +private _classesActionsAddedTo = (localNamespace getVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []]); _classesActionsAddedTo pushBackUnique _type; -localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", _classesActionsAddedTo]; \ No newline at end of file +localNamespace setVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", _classesActionsAddedTo]; \ No newline at end of file diff --git a/functions/reinsert/client/fn_initClient.sqf b/functions/reinsert/client/fn_initClient.sqf index 8a96f23..cdee922 100644 --- a/functions/reinsert/client/fn_initClient.sqf +++ b/functions/reinsert/client/fn_initClient.sqf @@ -1,26 +1,26 @@ if (!hasInterface) exitWith {}; // ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS -localNamespace setVariable ["milsim_respawn_fileForReinsertClassesAdded", []]; +localNamespace setVariable ["milsim_reinsert_fileForReinsertClassesAdded", []]; // add actions to current class -[typeOf player] call milsim_respawn_fnc_addAceSelfActions; +[typeOf player] call milsim_reinsert_fnc_addAceSelfActions; // add actions to future classes ["ace_interact_menu_newControllableObject", { - _this call milsim_respawn_fnc_addAceSelfActions; + _this call milsim_reinsert_fnc_addAceSelfActions; }] call CBA_fnc_addEventHandler; ///////////////////////////////////////////////////// // PILOTS ONLY // ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { - localNamespace setVariable ["milsim_respawn_checkReinsertQueueClassesAdded", []]; - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + localNamespace setVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []]; + localNamespace setVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime]; // add actions to current class - [typeOf player] call milsim_respawn_fnc_addCheckQueueSelfAction; + [typeOf player] call milsim_reinsert_fnc_addCheckQueueSelfAction; // add actions to future classes ["ace_interact_menu_newControllableObject", { - _this call milsim_respawn_fnc_addCheckQueueSelfAction; + _this call milsim_reinsert_fnc_addCheckQueueSelfAction; }] call CBA_fnc_addEventHandler; }; ///////////////////////////////////////////////////// @@ -31,13 +31,13 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { [{ // if module not enabled and pilot forced check not enabled, exit if (not ( - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_enabled", true] && - missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", true] + missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] && + missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled", true] )) exitWith {}; // if last check was less than X minutes ago, skip - private _lastCheck = localNamespace getVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; - private _requiredCheckInterval = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", 60*20]; + private _lastCheck = localNamespace getVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime]; + private _requiredCheckInterval = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_pilotForcedCheckInterval", 60*20]; if ( diag_tickTime - _lastCheck < _requiredCheckInterval @@ -45,9 +45,9 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then { // last check was greater than X minutes ago // reset last check time - localNamespace setVariable ["milsim_respawn_lastReinsertQueueCheck", diag_tickTime]; + localNamespace setVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime]; // request notification from the server - call milsim_respawn_fnc_requestShowQueue; + call milsim_reinsert_fnc_requestShowQueue; }, 30] call CBA_fnc_addPerFrameHandler; }; ///////////////////////////////////////////////////// \ No newline at end of file diff --git a/functions/reinsert/client/fn_requestShowQueue.sqf b/functions/reinsert/client/fn_requestShowQueue.sqf index 11a8d03..1afed4e 100644 --- a/functions/reinsert/client/fn_requestShowQueue.sqf +++ b/functions/reinsert/client/fn_requestShowQueue.sqf @@ -1,3 +1,3 @@ if (!hasInterface) exitWith {}; -[] remoteExec ["milsim_respawn_fnc_returnReinsertQueueNotification", 2]; \ No newline at end of file +[] remoteExec ["milsim_reinsert_fnc_returnReinsertQueueNotification", 2]; \ No newline at end of file diff --git a/functions/reinsert/fn_getNearestBase.sqf b/functions/reinsert/fn_getNearestBase.sqf index 3d955ba..049cc04 100644 --- a/functions/reinsert/fn_getNearestBase.sqf +++ b/functions/reinsert/fn_getNearestBase.sqf @@ -1,7 +1,7 @@ params [["_player", objNull, [objNull]]]; if (isNull _player) exitWith {objNull}; -private _bases = missionNamespace getVariable ["milsim_respawn_bases", []]; +private _bases = missionNamespace getVariable ["milsim_reinsert_bases", []]; if (count _bases == 0) exitWith {objNull}; // get nearest base (Module_Respawn_F) diff --git a/functions/reinsert/server/fn_addToQueue.sqf b/functions/reinsert/server/fn_addToQueue.sqf index 24f63ad..ce662d1 100644 --- a/functions/reinsert/server/fn_addToQueue.sqf +++ b/functions/reinsert/server/fn_addToQueue.sqf @@ -29,21 +29,21 @@ if ( }; -private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; +private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400]; // nearest base here is the same as the base sent private _nearestBase = _base; -milsim_respawn_reinsertionQueue pushBackUnique [ +milsim_reinsert_reinsertionQueue pushBackUnique [ _player, _base, _timeFiled ]; // broadcast new list to all machines -publicVariable "milsim_respawn_reinsertionQueue"; +publicVariable "milsim_reinsert_reinsertionQueue"; // log to rpt private _logParams = [ - ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBase", [_base] call milsim_reinsert_fnc_getBaseName], ["filedAtBaseDistance", _player distance _base], - ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBase", [_nearestBase] call milsim_reinsert_fnc_getBaseName], ["closestBaseDistance", _player distance _nearestBase], ["maxDistanceSetting", _maxRangeToReady], ["inQueueDuration", diag_tickTime - _timeFiled] diff --git a/functions/reinsert/server/fn_globalShowQueue.sqf b/functions/reinsert/server/fn_globalShowQueue.sqf index 566a780..a85462e 100644 --- a/functions/reinsert/server/fn_globalShowQueue.sqf +++ b/functions/reinsert/server/fn_globalShowQueue.sqf @@ -1,8 +1,8 @@ if (!isServer) exitWith {}; // if at least 1 player in the queue has been waiting longer than the configured timeout, notify all players -private _timeout = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_max_wait", 60*20]; // default 20 minutes -private _timeoutPlayers = milsim_respawn_reinsertionQueue select { +private _timeout = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_max_wait", 60*20]; // default 20 minutes +private _timeoutPlayers = milsim_reinsert_reinsertionQueue select { _x params ["_player", "_base", "_timeFiled"]; alive (_player) && (diag_tickTime - (_timeFiled)) > _timeout @@ -10,10 +10,10 @@ private _timeoutPlayers = milsim_respawn_reinsertionQueue select { if (count _timeoutPlayers > 0) then { // GLOBAL CBA NOTIFY private _playerLines = [["Players are still waiting for Re-insert!", 1.2, [1, 0.64, 0, 1]]]; - private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; + private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400]; // get base objects from queue - private _basesWithPeople = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; + private _basesWithPeople = (missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]) apply {_x#1}; // get unique base objects private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople; @@ -21,7 +21,7 @@ if (count _timeoutPlayers > 0) then { private _thisBase = _x; // Add line for base name - _playerLines pushBack ([[_thisBase] call milsim_respawn_fnc_getBaseName, 1, [0,1,0,1]]); + _playerLines pushBack ([[_thisBase] call milsim_reinsert_fnc_getBaseName, 1, [0,1,0,1]]); // Get players under this base private _thisBasePlayers = _timeoutPlayers select {_x#1 isEqualTo _thisBase}; @@ -35,7 +35,7 @@ if (count _timeoutPlayers > 0) then { { // for each player under this base, add a line _x params ["_player", "_base", "_timeFiled"]; // get the closest base to the player - private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; + private _nearestBase = [_player] call milsim_reinsert_fnc_getNearestBase; // add player to array of players under bases _playerLines pushBack ([format [ @@ -47,9 +47,9 @@ if (count _timeoutPlayers > 0) then { // log to rpt private _logParams = [ - ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBase", [_base] call milsim_reinsert_fnc_getBaseName], ["filedAtBaseDistance", _player distance _base], - ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBase", [_nearestBase] call milsim_reinsert_fnc_getBaseName], ["closestBaseDistance", _player distance _nearestBase], ["maxDistanceSetting", _maxRangeToReady], ["inQueueDuration", diag_tickTime - _timeFiled] @@ -66,5 +66,5 @@ if (count _timeoutPlayers > 0) then { // SEND NOTIFY _playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated]; // RESET NOTIFICATION TIMER - milsim_respawn_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; + milsim_reinsert_reinsertionOverTimeoutLastNotificationTime = diag_tickTime; }; \ No newline at end of file diff --git a/functions/reinsert/server/fn_initServer.sqf b/functions/reinsert/server/fn_initServer.sqf index a93a91a..9dd329f 100644 --- a/functions/reinsert/server/fn_initServer.sqf +++ b/functions/reinsert/server/fn_initServer.sqf @@ -6,44 +6,44 @@ if (!isServer) exitWith {}; // array of all respawn modules in the mission, used as 'base' locations for reinsertion -milsim_respawn_bases = allMissionObjects "ModuleRespawnPosition_F"; -publicVariable "milsim_respawn_bases"; +milsim_reinsert_bases = allMissionObjects "ModuleRespawnPosition_F"; +publicVariable "milsim_reinsert_bases"; // register queue -milsim_respawn_reinsertionQueue = []; -publicVariable "milsim_respawn_reinsertionQueue"; +milsim_reinsert_reinsertionQueue = []; +publicVariable "milsim_reinsert_reinsertionQueue"; // server mission start time -milsim_respawn_missionStartServerTime = serverTime; +milsim_reinsert_missionStartServerTime = serverTime; // FILE REQUEST CBA HANDLER -["milsim_respawn_fileReinsertRequest", { +["milsim_reinsert_fileReinsertRequest", { params ["_player", "_base"]; - [_player, _base] call milsim_respawn_fnc_addToQueue; + [_player, _base] call milsim_reinsert_fnc_addToQueue; }] call CBA_fnc_addEventHandler; // REMOVE REQUEST CBA HANDLER -["milsim_respawn_removeReinsertRequest", { +["milsim_reinsert_removeReinsertRequest", { params ["_player"]; - [_player] call milsim_respawn_fnc_removeFromQueue; + [_player] call milsim_reinsert_fnc_removeFromQueue; }] call CBA_fnc_addEventHandler; // automated wait threshold timer -milsim_respawn_reinsertionOverTimeoutLastNotificationTime = 0; +milsim_reinsert_reinsertionOverTimeoutLastNotificationTime = 0; [{ // every 60 seconds // validate queue - call milsim_respawn_fnc_validateQueue; + call milsim_reinsert_fnc_validateQueue; // check if last overTimeout notification was sent more than X minutes ago if ( - diag_tickTime - milsim_respawn_reinsertionOverTimeoutLastNotificationTime > 60*5 + diag_tickTime - milsim_reinsert_reinsertionOverTimeoutLastNotificationTime > 60*5 ) then { // show global queue notification with any players that are over timeout - call milsim_respawn_fnc_globalShowQueue; + call milsim_reinsert_fnc_globalShowQueue; }; }, 60] call CBA_fnc_addPerFrameHandler; diff --git a/functions/reinsert/server/fn_removeFromQueue.sqf b/functions/reinsert/server/fn_removeFromQueue.sqf index f230c63..0e24679 100644 --- a/functions/reinsert/server/fn_removeFromQueue.sqf +++ b/functions/reinsert/server/fn_removeFromQueue.sqf @@ -20,16 +20,16 @@ if (isNull _player) exitWith { }; // get entries for this player from queue -private _unitArrs = milsim_respawn_reinsertionQueue select {_x#0 isEqualTo _player}; +private _unitArrs = milsim_reinsert_reinsertionQueue select {_x#0 isEqualTo _player}; // if player not in queue, skip if (count _unitArrs isEqualTo 0) exitWith {}; -private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; +private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400]; // remove player from queue -milsim_respawn_reinsertionQueue = milsim_respawn_reinsertionQueue - _unitArrs; +milsim_reinsert_reinsertionQueue = milsim_reinsert_reinsertionQueue - _unitArrs; // broadcast new list to all machines -publicVariable "milsim_respawn_reinsertionQueue"; +publicVariable "milsim_reinsert_reinsertionQueue"; // sort _unitArrs by time in queue, descending, to get longest wait (if for some reason there's a duplicate) [_unitArrs, [], { @@ -39,12 +39,12 @@ publicVariable "milsim_respawn_reinsertionQueue"; // get first entry (longest wait) (_unitArrs#0) params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, base, timeInQueue] // get the closest base to the player -private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; +private _nearestBase = [_player] call milsim_reinsert_fnc_getNearestBase; // log to rpt private _logParams = [ - ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBase", [_base] call milsim_reinsert_fnc_getBaseName], ["filedAtBaseDistance", _player distance _base], - ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBase", [_nearestBase] call milsim_reinsert_fnc_getBaseName], ["closestBaseDistance", _player distance _nearestBase], ["maxDistanceSetting", _maxRangeToReady], ["inQueueDuration", diag_tickTime - _timeFiled] diff --git a/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf b/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf index e7eaf0a..d114ad2 100644 --- a/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf +++ b/functions/reinsert/server/fn_returnReinsertQueueNotification.sqf @@ -1,5 +1,5 @@ /* - Function: milsim_respawn_fnc_showReinsertQueueNotification + Function: milsim_reinsert_fnc_showReinsertQueueNotification Description: Designed to be remoteExecuted on the server. Will show a CBA notification on the remoteExecutedOwner's screen with the current reinsertion queue and log this occurrence in the server RPT. @@ -32,9 +32,9 @@ private _logParams = [_userObject, []] call milsim_fnc_addPlayerInfoToArray; _logParams ] call milsim_fnc_log; -private _queue = missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]; +private _queue = missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]; // get base objects from queue -private _basesWithPeople = (missionNamespace getVariable ["milsim_respawn_reinsertionQueue", []]) apply {_x#1}; +private _basesWithPeople = (missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]) apply {_x#1}; // get unique base objects private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople; @@ -48,7 +48,7 @@ if (count _basesWithPeople isEqualTo 0) then { // forEach _basesWithPeople { private _thisBase = _x; - private _baseName = [_thisBase] call milsim_respawn_fnc_getBaseName; + private _baseName = [_thisBase] call milsim_reinsert_fnc_getBaseName; // generate player lines for this base private _playerLines = _queue select { diff --git a/functions/reinsert/server/fn_validateQueue.sqf b/functions/reinsert/server/fn_validateQueue.sqf index cce9bac..9c59209 100644 --- a/functions/reinsert/server/fn_validateQueue.sqf +++ b/functions/reinsert/server/fn_validateQueue.sqf @@ -1,22 +1,22 @@ // revalidate any players in the queue // compare their distance to the nearest base, and remove them if they're too far away (or dead) private _stillValid = []; -private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting_reinsertion_maxRangeToReady", 400]; +private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400]; { _x params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue] private _distanceToOriginalBase = _player distance _base; // get the closest base to the player - private _nearestBase = [_player] call milsim_respawn_fnc_getNearestBase; + private _nearestBase = [_player] call milsim_reinsert_fnc_getNearestBase; private _isCloseEnoughToAnyBase = (_player distance _nearestBase) < _maxRangeToReady; if (not _isCloseEnoughToAnyBase || not (alive _player)) then { // don't include player in updated queue // log to rpt private _logParams = [ - ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBase", [_base] call milsim_reinsert_fnc_getBaseName], ["filedAtBaseDistance", _player distance _base], - ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBase", [_nearestBase] call milsim_reinsert_fnc_getBaseName], ["closestBaseDistance", _player distance _nearestBase], ["maxDistanceSetting", _maxRangeToReady], ["inQueueDuration", diag_tickTime - _timeFiled] @@ -36,9 +36,9 @@ private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting // if player's base has changed, log to rpt if (_base != _nearestBase) then { private _logParams = [ - ["filedAtBase", [_base] call milsim_respawn_fnc_getBaseName], + ["filedAtBase", [_base] call milsim_reinsert_fnc_getBaseName], ["filedAtBaseDistance", _player distance _base], - ["closestBase", [_nearestBase] call milsim_respawn_fnc_getBaseName], + ["closestBase", [_nearestBase] call milsim_reinsert_fnc_getBaseName], ["closestBaseDistance", _player distance _nearestBase], ["maxDistanceSetting", _maxRangeToReady], ["inQueueDuration", diag_tickTime - _timeFiled] @@ -50,8 +50,8 @@ private _maxRangeToReady = missionNamespace getVariable ["milsim_respawn_setting _logParams ] call milsim_fnc_log; }; -} forEach milsim_respawn_reinsertionQueue; +} forEach milsim_reinsert_reinsertionQueue; // broadcast new list to all machines -milsim_respawn_reinsertionQueue = _stillValid; -publicVariable "milsim_respawn_reinsertionQueue"; \ No newline at end of file +milsim_reinsert_reinsertionQueue = _stillValid; +publicVariable "milsim_reinsert_reinsertionQueue"; \ No newline at end of file diff --git a/functions/settings/fn_addCBASettings.sqf b/functions/settings/fn_addCBASettings.sqf index fc786f5..2f22ebf 100644 --- a/functions/settings/fn_addCBASettings.sqf +++ b/functions/settings/fn_addCBASettings.sqf @@ -128,7 +128,7 @@ //--------------------- // Respawn Settings [ - "milsim_respawn_setting_reinsertion_enabled", // variable + "milsim_reinsert_setting_reinsertion_enabled", // variable "CHECKBOX", // type ["Enabled", "Whether or not players can file for reinsert and pilots can check the reinsert queue"], // title ["17th Battalion", "Re-insert Queue"], // category @@ -142,7 +142,7 @@ [ [ "setting", - "milsim_respawn_setting_reinsertion_enabled" + "milsim_reinsert_setting_reinsertion_enabled" ], ["newValue", _value] ] @@ -151,7 +151,7 @@ ] call CBA_fnc_addSetting; [ - "milsim_respawn_setting_reinsertion_maxRangeToReady", // variable + "milsim_reinsert_setting_reinsertion_maxRangeToReady", // variable "SLIDER", // type ["Max Request Filing Range", "Maximum distance from a respawn point a player can be to ready up"], // title ["17th Battalion", "Re-insert Queue"], // category @@ -165,7 +165,7 @@ [ [ "setting", - "milsim_respawn_setting_reinsertion_maxRangeToReady" + "milsim_reinsert_setting_reinsertion_maxRangeToReady" ], ["newValue", _value] ] @@ -174,7 +174,7 @@ ] call CBA_fnc_addSetting; [ - "milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled", // variable + "milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled", // variable "CHECKBOX", // type ["Enabled", "Whether or not pilots are forced to view the contents of the reinsertion queue per interval"], // title ["17th Battalion", "Re-insert Queue"], // category @@ -188,7 +188,7 @@ [ [ "setting", - "milsim_respawn_setting_reinsertion_pilotForcedCheckEnabled" + "milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled" ], ["newValue", _value] ] @@ -197,7 +197,7 @@ ] call CBA_fnc_addSetting; [ - "milsim_respawn_setting_reinsertion_pilotForcedCheckInterval", // variable + "milsim_reinsert_setting_reinsertion_pilotForcedCheckInterval", // variable "TIME", // type ["Pilot Forced Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title ["17th Battalion", "Re-insert Queue"], // category @@ -211,7 +211,7 @@ [ [ "setting", - "milsim_respawn_setting_reinsertion_pilotForcedCheckInterval" + "milsim_reinsert_setting_reinsertion_pilotForcedCheckInterval" ], ["newValue", _value] ] @@ -220,7 +220,7 @@ ] call CBA_fnc_addSetting; [ - "milsim_respawn_setting_reinsertion_max_wait", // variable + "milsim_reinsert_setting_reinsertion_max_wait", // variable "TIME", // type ["Max Wait Threshold", "How long should at least one person be waiting before prompting a global notification."], // title ["17th Battalion", "Re-insert Queue"], // category @@ -234,7 +234,7 @@ [ [ "setting", - "milsim_respawn_setting_reinsertion_max_wait" + "milsim_reinsert_setting_reinsertion_max_wait" ], ["newValue", _value] ]