From 06fcbfccae1c52985b3c47e90cc11ae95b7cb65a Mon Sep 17 00:00:00 2001 From: abridgford Date: Sun, 7 Mar 2021 18:39:23 +0000 Subject: [PATCH 1/6] Initiat commit of V1, couple of issues that need fixing. --- .../functions/fnc_handleDelete.sqf | 4 +- addons/ailogistics/$PBOPREFIX$ | 1 + addons/ailogistics/Cfg3den.hpp | 20 +++ addons/ailogistics/CfgEventHandlers.hpp | 17 +++ addons/ailogistics/CfgFactionClasses.hpp | 6 + addons/ailogistics/CfgVehicles.hpp | 120 ++++++++++++++++++ addons/ailogistics/README.md | 3 + addons/ailogistics/XEH_PREP.hpp | 4 + addons/ailogistics/XEH_postInit.sqf | 9 ++ addons/ailogistics/XEH_preInit.sqf | 18 +++ addons/ailogistics/XEH_preStart.sqf | 3 + addons/ailogistics/config.cpp | 26 ++++ .../functions/fnc_handleDelete.sqf | 22 ++++ .../functions/fnc_logisticWaypoints.sqf | 21 +++ .../functions/fnc_logisticsMain.sqf | 110 ++++++++++++++++ addons/ailogistics/functions/fnc_patrol.sqf | 19 +++ .../functions/script_component.hpp | 1 + addons/ailogistics/initSettings.sqf | 24 ++++ addons/ailogistics/script_component.hpp | 9 ++ 19 files changed, 434 insertions(+), 3 deletions(-) create mode 100644 addons/ailogistics/$PBOPREFIX$ create mode 100644 addons/ailogistics/Cfg3den.hpp create mode 100644 addons/ailogistics/CfgEventHandlers.hpp create mode 100644 addons/ailogistics/CfgFactionClasses.hpp create mode 100644 addons/ailogistics/CfgVehicles.hpp create mode 100644 addons/ailogistics/README.md create mode 100644 addons/ailogistics/XEH_PREP.hpp create mode 100644 addons/ailogistics/XEH_postInit.sqf create mode 100644 addons/ailogistics/XEH_preInit.sqf create mode 100644 addons/ailogistics/XEH_preStart.sqf create mode 100644 addons/ailogistics/config.cpp create mode 100644 addons/ailogistics/functions/fnc_handleDelete.sqf create mode 100644 addons/ailogistics/functions/fnc_logisticWaypoints.sqf create mode 100644 addons/ailogistics/functions/fnc_logisticsMain.sqf create mode 100644 addons/ailogistics/functions/fnc_patrol.sqf create mode 100644 addons/ailogistics/functions/script_component.hpp create mode 100644 addons/ailogistics/initSettings.sqf create mode 100644 addons/ailogistics/script_component.hpp diff --git a/addons/aiaircommander/functions/fnc_handleDelete.sqf b/addons/aiaircommander/functions/fnc_handleDelete.sqf index f62f83a6d..95aba725f 100644 --- a/addons/aiaircommander/functions/fnc_handleDelete.sqf +++ b/addons/aiaircommander/functions/fnc_handleDelete.sqf @@ -14,7 +14,5 @@ */ params ["_leader"]; -// TODO: Change this to use a common component for spawned AI deletion - -(_leader getVariable [QEGVAR(common,assignedVehicle), objNull]) call CBA_fnc_deleteEntity; +(vehicle _leader) call CBA_fnc_deleteEntity; (group _leader) call CBA_fnc_deleteEntity; diff --git a/addons/ailogistics/$PBOPREFIX$ b/addons/ailogistics/$PBOPREFIX$ new file mode 100644 index 000000000..cd6eba65b --- /dev/null +++ b/addons/ailogistics/$PBOPREFIX$ @@ -0,0 +1 @@ +u\uksf\addons\ailogistics diff --git a/addons/ailogistics/Cfg3den.hpp b/addons/ailogistics/Cfg3den.hpp new file mode 100644 index 000000000..90352dba2 --- /dev/null +++ b/addons/ailogistics/Cfg3den.hpp @@ -0,0 +1,20 @@ +// class Cfg3DEN { +// class Object { +// class AttributeCategories { +// class uksf_attributes { +// class Attributes { +// class GVAR(excluded) { +// property = QGVAR(excluded); +// control = "Checkbox"; +// displayName = QUOTE(Cleanup exclude); +// tooltip = QUOTE(Excludes object from cleanup); +// expression = QUOTE(_this setVariable [ARR_3(QQGVAR(excluded),_value,true)]); +// typeName = "BOOL"; +// defaultValue = "(false)"; +// condition = "1"; +// }; +// }; +// }; +// }; +// }; +// }; diff --git a/addons/ailogistics/CfgEventHandlers.hpp b/addons/ailogistics/CfgEventHandlers.hpp new file mode 100644 index 000000000..0d3301d6e --- /dev/null +++ b/addons/ailogistics/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/ailogistics/CfgFactionClasses.hpp b/addons/ailogistics/CfgFactionClasses.hpp new file mode 100644 index 000000000..82967ffa1 --- /dev/null +++ b/addons/ailogistics/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class EGVAR(common,eden); + class ADDON: EGVAR(common,eden){ + displayName = "AI Logistics"; + }; +}; diff --git a/addons/ailogistics/CfgVehicles.hpp b/addons/ailogistics/CfgVehicles.hpp new file mode 100644 index 000000000..bf65eacc1 --- /dev/null +++ b/addons/ailogistics/CfgVehicles.hpp @@ -0,0 +1,120 @@ +class CfgVehicles { + class Module_F; + class GVAR(module) : Module_F { + scope = 1; + is3DEN = 1; + functionPriority = 1; + category = ADDON; + class AttributesBase; + }; + class GVAR(logisticsDestination) : GVAR(module) { + scope = 2; + displayName = "(L) Logistics Destination"; + icon = "A3\ui_f\data\map\markers\nato\b_service.paa"; + portrait = "A3\ui_f\data\map\markers\nato\b_service.paa"; + }; + class GVAR(logisticsStart) : GVAR(module) { + scope = 2; + displayName = "(L) Logistics Start"; + icon = "A3\ui_f\data\map\markers\nato\b_installation.paa"; + portrait = "A3\ui_f\data\map\markers\nato\b_installation.paa"; + function = QFUNC(logisticsMain); + class Attributes : AttributesBase { + class GVAR(driverUnitPoolString) { + property = QGVAR(driverUnitPoolString); + displayName = "Driver Pool"; + tooltip = "Class names of units to use as drivers. Comma-separated list of class names in single quotes, no spaces"; + control = "Edit"; + defaultValue = "[]"; + compileString = 1; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(driverUnitPoolString),_value,true)]); + }; + class GVAR(logisticVehiclePoolString) { + property = QGVAR(logisticVehiclePoolString); + displayName = "Vehicle Pool"; + tooltip = "Class names of ground vehicles used for logistics. Comma-separated list of class names in single quotes, no spaces"; + control = "Edit"; + defaultValue = "[]"; + compileString = 1; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticVehiclePoolString),_value,true)]); + }; + class GVAR(routePickets) { + property = QGVAR(routePickets); + displayName = "Route Picket"; + tooltip = "Tick if you want stages of the route to be guarded by patrols."; + control = "Checkbox"; + defaultValue = false; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(routePickets),_value,true)]); + }; + class GVAR(picketLocations) { + property = QGVAR(picketLocations); + displayName = "Picket Locations"; + tooltip = "% of the way along the route patrols will spawn. 0.4 = 40% e.g. [0.4,0.7]. Comma-separated list of numbers, no spaces"; + control = "Edit"; + defaultValue = "[40,70]"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(picketLocations),_value,true)]); + }; + class GVAR(picketUnitPoolString) { + property = QGVAR(picketUnitPoolString); + displayName = "Picket Unit Pool"; + tooltip = "Class names of units used to picket route. Comma-separated list of class names in single quotes, no spaces"; + control = "Edit"; + defaultValue = "[]"; + compileString = 1; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(picketUnitPoolString),_value,true)]); + }; + class GVAR(picketGroupSize) { + property = QGVAR(picketGroupSize); + displayName = "Picket Group Size"; + tooltip = "Number of units in picket group. Comma-separated list of class names in single quotes, no spaces"; + control = "EditShort"; + validate = "NUMBER"; + defaultValue = "4"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(picketGroupSize),_value,true)]); + }; + class GVAR(logisticsObject) { + property = QGVAR(logisticsObject); + displayName = "Logistics Object"; + tooltip = "Logistics from this module will stop if this object is killed / destroyed. Requires static variable name e.g. 'officer1' or 'warehouse2'."; + control = "Edit"; + defaultValue = "Warehouse1"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticsObject),_value,true)]); + }; + class GVAR(logisticalVehicleNumber) { + property = QGVAR(logisticalVehicleNumber); + displayName = "Logistics Vehicle Pool"; + tooltip = "Number of vehicles this logistics module can use, only 1 will be active at any one time. When it reaches 0, logistics will stop. Number i.e. 3"; + control = "EditShort"; + validate = "NUMBER"; + defaultValue = "2"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticalVehicleNumber),_value,true)]); + }; + class GVAR(logisticsTimeout) { + property = QGVAR(logisticsTimeout); + displayName = "Logistics Timeout"; + tooltip = "Time between logistic runs. Uses min, mid, max format."; + control = "Timeout"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticsTimeout),_value,true)]); + }; + class GVAR(side) { + property = QGVAR(side); + displayName = "Side"; + tooltip = "Side of spawned units."; + control = "Combo"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(side),_value,true)]); + typeName = "NUMBER"; + defaultValue = 0; + class values { + class East { + name = "OPFOR"; + value = 0; + }; + class Guer { + name = "Independent"; + value = 1; + }; + }; + }; + }; + }; +}; diff --git a/addons/ailogistics/README.md b/addons/ailogistics/README.md new file mode 100644 index 000000000..79bda5e98 --- /dev/null +++ b/addons/ailogistics/README.md @@ -0,0 +1,3 @@ +# AI Counter Mortar + +An AI system to counter friendly mortars diff --git a/addons/ailogistics/XEH_PREP.hpp b/addons/ailogistics/XEH_PREP.hpp new file mode 100644 index 000000000..a2dcacdd3 --- /dev/null +++ b/addons/ailogistics/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(logisticsMain); +PREP(patrol); +PREP(logisticWaypoints); +PREP(handleDelete); diff --git a/addons/ailogistics/XEH_postInit.sqf b/addons/ailogistics/XEH_postInit.sqf new file mode 100644 index 000000000..a95438352 --- /dev/null +++ b/addons/ailogistics/XEH_postInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +if (GVAR(groundVehiclePool) isEqualTo [] && {GVAR(airVehiclePool) isEqualTo [] && {GVAR(counterBatteryUnits) isEqualTo []}}) exitWith { + WARNING("No counter units defined"); +}; + +["UK3CB_BAF_Static_Mortar_Base", "Fired", {call FUNC(selectResponse)}, true, [], true] call CBA_fnc_addClassEventHandler; diff --git a/addons/ailogistics/XEH_preInit.sqf b/addons/ailogistics/XEH_preInit.sqf new file mode 100644 index 000000000..13883dbe2 --- /dev/null +++ b/addons/ailogistics/XEH_preInit.sqf @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +// #include "initSettings.sqf" + +GVAR(unitPoolString) = []; +GVAR(logisticVehiclePoolString) = []; +GVAR(routePickets) = false; +GVAR(picketLocations) = []; +GVAR(picketUnitPoolString) = []; +GVAR(picketGroupSize) = 0; +GVAR(logisticsObject) = ObjNull; +GVAR(logisticalVehicleNumber) = 0; + +ADDON = true; diff --git a/addons/ailogistics/XEH_preStart.sqf b/addons/ailogistics/XEH_preStart.sqf new file mode 100644 index 000000000..022888575 --- /dev/null +++ b/addons/ailogistics/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/ailogistics/config.cpp b/addons/ailogistics/config.cpp new file mode 100644 index 000000000..dc52fdc8f --- /dev/null +++ b/addons/ailogistics/config.cpp @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = { + QGVAR(logisticsDestination), + QGVAR(logisticsStart) + }; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "uksf_common", + "uksf_mission" + }; + author = QUOTE(UKSF); + authors[] = { "Bridgford.A" }; + url = URL; + VERSION_CONFIG; + }; +}; + +// #include "Cfg3den.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/ailogistics/functions/fnc_handleDelete.sqf b/addons/ailogistics/functions/fnc_handleDelete.sqf new file mode 100644 index 000000000..7c3a252f2 --- /dev/null +++ b/addons/ailogistics/functions/fnc_handleDelete.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Assign the route pickets their patrol routes + + Parameters: + 0: _group + + Return value: + Nothing +*/ + +params ["_leader"]; + +(vehicle _leader) call CBA_fnc_deleteEntity; +{ + _x call CBA_fnc_deleteEntity; +} forEach units (group _leader); + diff --git a/addons/ailogistics/functions/fnc_logisticWaypoints.sqf b/addons/ailogistics/functions/fnc_logisticWaypoints.sqf new file mode 100644 index 000000000..378660678 --- /dev/null +++ b/addons/ailogistics/functions/fnc_logisticWaypoints.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Assign the waypoints for the logistical vehicles. + + Parameters: + 0: _group + + Return value: + Nothing +*/ + +params ["_module", "_group"]; + +private _destination = synchronizedObjects _module; + +[_group, getPos (_destination select 0), 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "", "", [30,45,60]] call CBA_fnc_addWaypoint; +[_group, getPos _module, 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "COLUMN", QUOTE([this] call FUNC(handleDelete)), [10,15,20]] call CBA_fnc_addWaypoint; diff --git a/addons/ailogistics/functions/fnc_logisticsMain.sqf b/addons/ailogistics/functions/fnc_logisticsMain.sqf new file mode 100644 index 000000000..8f36d1fcf --- /dev/null +++ b/addons/ailogistics/functions/fnc_logisticsMain.sqf @@ -0,0 +1,110 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Main function + + Parameters: + + + Return value: + Nothing +*/ + + +if (!isServer) exitWith {}; + +(_this select 1) params ["_module"]; + + +// get all modules parameters +private _destinations = synchronizedObjects _module; +private _time = _module getVariable [QGVAR(logisticsTimeout),0]; +private _groupSize = _module getVariable [QGVAR(picketGroupSize),0]; +private _picketUnits = _module getVariable [QGVAR(picketUnitPoolString),[]]; +private _sideFromModule = _module getVariable [QGVAR(side),0]; + +// get side then update the variable with an actual side, get the updated version +if (_sideFromModule == 0) then { + _module setVariable [QGVAR(side),EAST]; +} else { + _module setVariable [QGVAR(side),INDEPENDENT]; +}; +private _side = _module getVariable [QGVAR(side),EAST]; + + + +// establish the route +private _agent = createAgent ["C_Man_1", getPos _module, [], 0, "NONE"]; +private _car = "B_Quadbike_01_F" createVehicle (getPos _module); +_agent moveInDriver _car; + +_agent setVariable [QGVAR(module),_module]; + +// workaround ai spawning at the end the route due to double execution bug of pathCalculated EH. +// if this is called twice by sync-ing more than one destination module, it only picks route. Seems that you have to wait until the path calc's once before you can do it again. +// if there is a way to do the above, one start module could support multiple destinations 1, would also require multi vehicle support + +_agent setDestination [(_destinations select 0), "LEADER PLANNED", true]; + +_agent addEventHandler ["PathCalculated", { + params ["_agent", "_path"]; + private _module = _agent getVariable [QGVAR(module),objNull]; + if ((_module getVariable [QGVAR(routePickets),false]) == false) exitWith {}; + private _picketLocationsRaw = _module getVariable [QGVAR(picketLocations),[0.5]]; // "[0.4,0.7]" + private _picketLocationsParsed = parseSimpleArray _picketLocationsRaw; + + // this prevents looping + deleteVehicle (vehicle _agent); + deleteVehicle _agent; + + // workout the points in _path + private _picketPoints = []; + { + private _percent = (round(count _path) * _x); + _picketPoints pushBack (_path select _percent); + } forEach _picketLocationsParsed; + + // create the pickets + private _groupSize = _module getVariable [QGVAR(picketGroupSize),0]; + private _side = _module getVariable [QGVAR(side),EAST]; + private _picketUnitsRaw = _module getVariable [QGVAR(picketUnitPoolString),[]]; + private _picketUnitsParsed = parseSimpleArray _picketUnitsRaw; + + { + [_x, 0, _groupSize, _side, _picketUnitsParsed, [], {}, {call FUNC(patrol)}] call EFUNC(common,spawnGroup); // uksf spawn function + } forEach _picketPoints; + +}]; + +private _fnc_createLogisticVehicle = { + + params ["_module","_fnc_createLogisticVehicle"]; + + // private _vehicleNumber = _module getVariable [QGVAR(logisticalVehicleNumber),"0"]; + // private _vehicleNumberParsed = parseNumber _vehicleNumber; + private _time = _module getVariable [QGVAR(logisticsTimeout),0]; + private _logisticsObject = missionNamespace getVariable [QGVAR(logisticsObject), ObjNull]; + private _side = _module getVariable [QGVAR(side),EAST]; + private _logisticVehiclePoolStringRaw = _module getVariable [QGVAR(logisticVehiclePoolString),""]; + private _driverUnitPoolStringRaw = _module getVariable [QGVAR(driverUnitPoolString),""]; + private _logisticVehiclePoolStringParsed = parseSimpleArray _logisticVehiclePoolStringRaw; + private _driverUnitPoolStringParsed = parseSimpleArray _driverUnitPoolStringRaw; + + if ((_vehicleNumberParsed <= 0) || (!alive _logisticsObject) || (isNull _logisticsObject)) exitWith {}; + + // create the logi vehicle + [getPos _module, 1, 1, _side, _driverUnitPoolStringParsed, _logisticVehiclePoolStringParsed, {-1}, {call FUNC(logisticWaypoints)}, [_module]] call EFUNC(common,spawnGroup); // uksf spawn function + + [{ + params ["_module","_fnc_createLogisticVehicle"]; + [_module,_fnc_createLogisticVehicle] call _fnc_createLogisticVehicle; + }, [_module,_fnc_createLogisticVehicle], random _time] call cba_fnc_waitAndExecute; +}; + +[{ + params ["_module","_fnc_createLogisticVehicle"]; + [_module,_fnc_createLogisticVehicle] call _fnc_createLogisticVehicle; +}, [_module,_fnc_createLogisticVehicle], random _time] call cba_fnc_waitAndExecute; diff --git a/addons/ailogistics/functions/fnc_patrol.sqf b/addons/ailogistics/functions/fnc_patrol.sqf new file mode 100644 index 000000000..28e28b1a7 --- /dev/null +++ b/addons/ailogistics/functions/fnc_patrol.sqf @@ -0,0 +1,19 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Assign the route pickets their patrol routes + + Parameters: + 0: _group + + Return value: + Nothing +*/ + +params ["_group"]; + +[_group, getPos (leader _group), 150, 5, "MOVE", "SAFE"] call CBA_fnc_taskPatrol; + diff --git a/addons/ailogistics/functions/script_component.hpp b/addons/ailogistics/functions/script_component.hpp new file mode 100644 index 000000000..569d3e150 --- /dev/null +++ b/addons/ailogistics/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\u\uksf\addons\ailogistics\script_component.hpp" diff --git a/addons/ailogistics/initSettings.sqf b/addons/ailogistics/initSettings.sqf new file mode 100644 index 000000000..b84b34a4b --- /dev/null +++ b/addons/ailogistics/initSettings.sqf @@ -0,0 +1,24 @@ +// [ +// QGVAR(enabled), +// "CHECKBOX", +// ["Cleanup", "Enables cleanup of dead units/vehicles"], +// ["UKSF", QUOTE(COMPONENT_BEAUTIFIED)], +// false, +// 1, +// { +// params ["_value"]; + +// if (isServer && _value) then { +// [{call FUNC(cleanupCheck)}, [], 0] call CBA_fnc_waitAndExecute; +// }; +// } +// ] call CBA_settings_fnc_init; + +// [ +// QGVAR(delay), +// "SLIDER", +// ["Cleanup Delay", "Delay in seconds between death and cleanup"], +// ["UKSF", QUOTE(COMPONENT_BEAUTIFIED)], +// [5, 600, 300, 0], +// 1 +// ] call CBA_settings_fnc_init; diff --git a/addons/ailogistics/script_component.hpp b/addons/ailogistics/script_component.hpp new file mode 100644 index 000000000..6f41b3c6b --- /dev/null +++ b/addons/ailogistics/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT ailogistics +#define COMPONENT_BEAUTIFIED AI Logistsics +#include "\u\uksf\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define CBA_DEBUG_SYNCHRONOUS + +#include "\u\uksf\addons\main\script_macros.hpp" From a9ceeb0be99f8ede06327d6d8668648e818b7437 Mon Sep 17 00:00:00 2001 From: abridgford Date: Sun, 11 Apr 2021 12:51:33 +0100 Subject: [PATCH 2/6] Resolving an issue with not pulling before making changes: - Various fixes - Correcting merge mistakes --- addons/ailogistics/CfgVehicles.hpp | 97 +++++++++------ addons/ailogistics/README.md | 4 +- addons/ailogistics/XEH_PREP.hpp | 8 +- addons/ailogistics/config.cpp | 3 +- .../functions/fnc_createLogisticVehicle.sqf | 40 +++++++ .../functions/fnc_createPickets.sqf | 37 ++++++ .../functions/fnc_logisticsMain.sqf | 110 ------------------ .../functions/fnc_moduleLogisticsStart.sqf | 41 +++++++ addons/ailogistics/functions/fnc_patrol.sqf | 19 --- .../functions/fnc_picketBehaviour.sqf | 25 ++++ addons/air/$PBOPREFIX$.txt | 6 + addons/air/CfgVehicles.hpp | 1 - addons/air/config.cpp | 2 - addons/air/vehicles/CfgWildcat.hpp | 4 +- addons/resupply/$PBOPREFIX$ | 1 - addons/resupply/README.md | 3 - 16 files changed, 221 insertions(+), 180 deletions(-) create mode 100644 addons/ailogistics/functions/fnc_createLogisticVehicle.sqf create mode 100644 addons/ailogistics/functions/fnc_createPickets.sqf delete mode 100644 addons/ailogistics/functions/fnc_logisticsMain.sqf create mode 100644 addons/ailogistics/functions/fnc_moduleLogisticsStart.sqf delete mode 100644 addons/ailogistics/functions/fnc_patrol.sqf create mode 100644 addons/ailogistics/functions/fnc_picketBehaviour.sqf create mode 100644 addons/air/$PBOPREFIX$.txt delete mode 100644 addons/resupply/$PBOPREFIX$ delete mode 100644 addons/resupply/README.md diff --git a/addons/ailogistics/CfgVehicles.hpp b/addons/ailogistics/CfgVehicles.hpp index bf65eacc1..34b9b568d 100644 --- a/addons/ailogistics/CfgVehicles.hpp +++ b/addons/ailogistics/CfgVehicles.hpp @@ -10,15 +10,15 @@ class CfgVehicles { class GVAR(logisticsDestination) : GVAR(module) { scope = 2; displayName = "(L) Logistics Destination"; - icon = "A3\ui_f\data\map\markers\nato\b_service.paa"; - portrait = "A3\ui_f\data\map\markers\nato\b_service.paa"; + icon = "A3\ui_f\data\map\markers\military\end_ca.paa"; + portrait = "A3\ui_f\data\map\markers\military\end_ca.paa"; }; class GVAR(logisticsStart) : GVAR(module) { scope = 2; displayName = "(L) Logistics Start"; - icon = "A3\ui_f\data\map\markers\nato\b_installation.paa"; - portrait = "A3\ui_f\data\map\markers\nato\b_installation.paa"; - function = QFUNC(logisticsMain); + icon = "A3\ui_f\data\map\markers\military\start_ca.paa"; + portrait = "A3\ui_f\data\map\markers\military\start_ca.paa"; + function = QFUNC(moduleLogisticsStart); class Attributes : AttributesBase { class GVAR(driverUnitPoolString) { property = QGVAR(driverUnitPoolString); @@ -46,14 +46,40 @@ class CfgVehicles { defaultValue = false; expression = QUOTE(_this setVariable [ARR_3(QQGVAR(routePickets),_value,true)]); }; - class GVAR(picketLocations) { - property = QGVAR(picketLocations); - displayName = "Picket Locations"; - tooltip = "% of the way along the route patrols will spawn. 0.4 = 40% e.g. [0.4,0.7]. Comma-separated list of numbers, no spaces"; - control = "Edit"; - defaultValue = "[40,70]"; - expression = QUOTE(_this setVariable [ARR_3(QQGVAR(picketLocations),_value,true)]); + class GVAR(logisticsTimeout) { + property = QGVAR(logisticsTimeout); + displayName = "Logistics Timeout"; + tooltip = "Time between logistic runs. Uses min, mid, max format."; + control = "Timeout"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticsTimeout),_value,true)]); }; + class GVAR(side) { + property = QGVAR(side); + displayName = "Side"; + tooltip = "Side of spawned units."; + control = "Combo"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(side),_value,true)]); + typeName = "NUMBER"; + defaultValue = 0; + class values { + class East { + name = "OPFOR"; + value = 0; + }; + class Guer { + name = "Independent"; + value = 1; + }; + }; + }; + }; + }; + class GVAR(logisticsPicketGroup) : GVAR(module) { + scope = 2; + displayName = "(L) Logistics Picket Group"; + icon = "A3\ui_f\data\map\markers\nato\respawn_inf_ca.paa"; + portrait = "A3\ui_f\data\map\markers\nato\respawn_inf_ca.paa"; + class Attributes : AttributesBase { class GVAR(picketUnitPoolString) { property = QGVAR(picketUnitPoolString); displayName = "Picket Unit Pool"; @@ -72,30 +98,6 @@ class CfgVehicles { defaultValue = "4"; expression = QUOTE(_this setVariable [ARR_3(QQGVAR(picketGroupSize),_value,true)]); }; - class GVAR(logisticsObject) { - property = QGVAR(logisticsObject); - displayName = "Logistics Object"; - tooltip = "Logistics from this module will stop if this object is killed / destroyed. Requires static variable name e.g. 'officer1' or 'warehouse2'."; - control = "Edit"; - defaultValue = "Warehouse1"; - expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticsObject),_value,true)]); - }; - class GVAR(logisticalVehicleNumber) { - property = QGVAR(logisticalVehicleNumber); - displayName = "Logistics Vehicle Pool"; - tooltip = "Number of vehicles this logistics module can use, only 1 will be active at any one time. When it reaches 0, logistics will stop. Number i.e. 3"; - control = "EditShort"; - validate = "NUMBER"; - defaultValue = "2"; - expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticalVehicleNumber),_value,true)]); - }; - class GVAR(logisticsTimeout) { - property = QGVAR(logisticsTimeout); - displayName = "Logistics Timeout"; - tooltip = "Time between logistic runs. Uses min, mid, max format."; - control = "Timeout"; - expression = QUOTE(_this setVariable [ARR_3(QQGVAR(logisticsTimeout),_value,true)]); - }; class GVAR(side) { property = QGVAR(side); displayName = "Side"; @@ -115,6 +117,29 @@ class CfgVehicles { }; }; }; + class GVAR(behaviour) { + property = QGVAR(behaviour); + displayName = "Behaviour"; + tooltip = "Patrol radius: 200m - Camp radius: 100m - Defend radius: 200m"; + control = "Combo"; + expression = QUOTE(_this setVariable [ARR_3(QQGVAR(behaviour),_value,true)]); + typeName = "NUMBER"; + defaultValue = 0; + class values { + class Patrol { + name = "Patrol"; + value = 0; + }; + class Camp { + name = "Camp (requires LAMBs)"; + value = 1; + }; + class Defend { + name = "Defend"; + value = 2; + }; + }; + }; }; }; }; diff --git a/addons/ailogistics/README.md b/addons/ailogistics/README.md index 79bda5e98..d4e6bc0dd 100644 --- a/addons/ailogistics/README.md +++ b/addons/ailogistics/README.md @@ -1,3 +1,3 @@ -# AI Counter Mortar +# AI Logistics -An AI system to counter friendly mortars +An AI system for emulating logistics diff --git a/addons/ailogistics/XEH_PREP.hpp b/addons/ailogistics/XEH_PREP.hpp index a2dcacdd3..a45673870 100644 --- a/addons/ailogistics/XEH_PREP.hpp +++ b/addons/ailogistics/XEH_PREP.hpp @@ -1,4 +1,6 @@ -PREP(logisticsMain); -PREP(patrol); -PREP(logisticWaypoints); +PREP(createLogisticVehicle); +PREP(createPickets); PREP(handleDelete); +PREP(logisticWaypoints); +PREP(moduleLogisticsStart); +PREP(picketBehaviour); diff --git a/addons/ailogistics/config.cpp b/addons/ailogistics/config.cpp index dc52fdc8f..e5c103147 100644 --- a/addons/ailogistics/config.cpp +++ b/addons/ailogistics/config.cpp @@ -5,7 +5,8 @@ class CfgPatches { name = COMPONENT_NAME; units[] = { QGVAR(logisticsDestination), - QGVAR(logisticsStart) + QGVAR(logisticsStart), + QGVAR(logisticsPicketGroup) }; weapons[] = {}; requiredVersion = REQUIRED_VERSION; diff --git a/addons/ailogistics/functions/fnc_createLogisticVehicle.sqf b/addons/ailogistics/functions/fnc_createLogisticVehicle.sqf new file mode 100644 index 000000000..1dc3d13c9 --- /dev/null +++ b/addons/ailogistics/functions/fnc_createLogisticVehicle.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Creates the logistical vehicle + + Parameters: + 0: _module + + Return value: + Nothing +*/ + + +if (!isServer) exitWith {}; + +params ["_module"]; + +private _time = _module getVariable [QGVAR(logisticsTimeout), 0]; +// private _logisticsObject = (synchronizedObjects _module) select {!((_x isKindOf "uksf_ailogistics_logisticsPicketGroup") || (_x isKindOf "uksf_ailogistics_logisticsDestination"))}; +private _logisticsObject = (synchronizedObjects _module) select {_x isKindOf "Building"}; +private _side = _module getVariable [QGVAR(side), EAST]; +private _logisticVehiclePoolStringRaw = _module getVariable [QGVAR(logisticVehiclePoolString), ""]; +private _driverUnitPoolStringRaw = _module getVariable [QGVAR(driverUnitPoolString), ""]; +private _logisticVehiclePoolStringParsed = parseSimpleArray _logisticVehiclePoolStringRaw; +private _driverUnitPoolStringParsed = parseSimpleArray _driverUnitPoolStringRaw; + +if (!alive (_logisticsObject select 0)) exitWith {}; + +// create the logi vehicle +[getPos _module, 1, 1, _side, _driverUnitPoolStringParsed, _logisticVehiclePoolStringParsed, {-1}, {call FUNC(logisticWaypoints)}, [_module]] call EFUNC(common,spawnGroup); // uksf spawn function + + +[{ + params ["_module"]; + [_module] call FUNC(createLogisticVehicle); +}, [_module], random _time] call cba_fnc_waitAndExecute; + diff --git a/addons/ailogistics/functions/fnc_createPickets.sqf b/addons/ailogistics/functions/fnc_createPickets.sqf new file mode 100644 index 000000000..46f68a0e1 --- /dev/null +++ b/addons/ailogistics/functions/fnc_createPickets.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Creates the picket groups + _picketLocations is the modules, not their positions + + Parameters: + 0: _picketLocations + + Return value: + Nothing +*/ + + +if (!isServer) exitWith {}; + +params ["_picketLocations"]; + +{ + private _sideFromModule = _x getVariable [QGVAR(side), 0]; + if (_sideFromModule == 0) then { + _x setVariable [QGVAR(side), EAST]; + } else { + _x setVariable [QGVAR(side), INDEPENDENT]; + }; + + private _side = _x getVariable [QGVAR(side), EAST]; + private _groupSize = _x getVariable [QGVAR(picketGroupSize), 0]; + private _picketUnitsRaw = _x getVariable [QGVAR(picketUnitPoolString), []]; + private _picketUnitsParsed = parseSimpleArray _picketUnitsRaw; + private _behaviour = _x getVariable [QGVAR(behaviour), 0]; + + [getPos _x, 0, _groupSize, _side, _picketUnitsParsed, [], {-1}, {call FUNC(picketBehaviour)}, [_behaviour]] call EFUNC(common,spawnGroup); +} forEach _picketLocations; diff --git a/addons/ailogistics/functions/fnc_logisticsMain.sqf b/addons/ailogistics/functions/fnc_logisticsMain.sqf deleted file mode 100644 index 8f36d1fcf..000000000 --- a/addons/ailogistics/functions/fnc_logisticsMain.sqf +++ /dev/null @@ -1,110 +0,0 @@ -#include "script_component.hpp" -/* - Author: - Bridg - - Description: - Main function - - Parameters: - - - Return value: - Nothing -*/ - - -if (!isServer) exitWith {}; - -(_this select 1) params ["_module"]; - - -// get all modules parameters -private _destinations = synchronizedObjects _module; -private _time = _module getVariable [QGVAR(logisticsTimeout),0]; -private _groupSize = _module getVariable [QGVAR(picketGroupSize),0]; -private _picketUnits = _module getVariable [QGVAR(picketUnitPoolString),[]]; -private _sideFromModule = _module getVariable [QGVAR(side),0]; - -// get side then update the variable with an actual side, get the updated version -if (_sideFromModule == 0) then { - _module setVariable [QGVAR(side),EAST]; -} else { - _module setVariable [QGVAR(side),INDEPENDENT]; -}; -private _side = _module getVariable [QGVAR(side),EAST]; - - - -// establish the route -private _agent = createAgent ["C_Man_1", getPos _module, [], 0, "NONE"]; -private _car = "B_Quadbike_01_F" createVehicle (getPos _module); -_agent moveInDriver _car; - -_agent setVariable [QGVAR(module),_module]; - -// workaround ai spawning at the end the route due to double execution bug of pathCalculated EH. -// if this is called twice by sync-ing more than one destination module, it only picks route. Seems that you have to wait until the path calc's once before you can do it again. -// if there is a way to do the above, one start module could support multiple destinations 1, would also require multi vehicle support - -_agent setDestination [(_destinations select 0), "LEADER PLANNED", true]; - -_agent addEventHandler ["PathCalculated", { - params ["_agent", "_path"]; - private _module = _agent getVariable [QGVAR(module),objNull]; - if ((_module getVariable [QGVAR(routePickets),false]) == false) exitWith {}; - private _picketLocationsRaw = _module getVariable [QGVAR(picketLocations),[0.5]]; // "[0.4,0.7]" - private _picketLocationsParsed = parseSimpleArray _picketLocationsRaw; - - // this prevents looping - deleteVehicle (vehicle _agent); - deleteVehicle _agent; - - // workout the points in _path - private _picketPoints = []; - { - private _percent = (round(count _path) * _x); - _picketPoints pushBack (_path select _percent); - } forEach _picketLocationsParsed; - - // create the pickets - private _groupSize = _module getVariable [QGVAR(picketGroupSize),0]; - private _side = _module getVariable [QGVAR(side),EAST]; - private _picketUnitsRaw = _module getVariable [QGVAR(picketUnitPoolString),[]]; - private _picketUnitsParsed = parseSimpleArray _picketUnitsRaw; - - { - [_x, 0, _groupSize, _side, _picketUnitsParsed, [], {}, {call FUNC(patrol)}] call EFUNC(common,spawnGroup); // uksf spawn function - } forEach _picketPoints; - -}]; - -private _fnc_createLogisticVehicle = { - - params ["_module","_fnc_createLogisticVehicle"]; - - // private _vehicleNumber = _module getVariable [QGVAR(logisticalVehicleNumber),"0"]; - // private _vehicleNumberParsed = parseNumber _vehicleNumber; - private _time = _module getVariable [QGVAR(logisticsTimeout),0]; - private _logisticsObject = missionNamespace getVariable [QGVAR(logisticsObject), ObjNull]; - private _side = _module getVariable [QGVAR(side),EAST]; - private _logisticVehiclePoolStringRaw = _module getVariable [QGVAR(logisticVehiclePoolString),""]; - private _driverUnitPoolStringRaw = _module getVariable [QGVAR(driverUnitPoolString),""]; - private _logisticVehiclePoolStringParsed = parseSimpleArray _logisticVehiclePoolStringRaw; - private _driverUnitPoolStringParsed = parseSimpleArray _driverUnitPoolStringRaw; - - if ((_vehicleNumberParsed <= 0) || (!alive _logisticsObject) || (isNull _logisticsObject)) exitWith {}; - - // create the logi vehicle - [getPos _module, 1, 1, _side, _driverUnitPoolStringParsed, _logisticVehiclePoolStringParsed, {-1}, {call FUNC(logisticWaypoints)}, [_module]] call EFUNC(common,spawnGroup); // uksf spawn function - - [{ - params ["_module","_fnc_createLogisticVehicle"]; - [_module,_fnc_createLogisticVehicle] call _fnc_createLogisticVehicle; - }, [_module,_fnc_createLogisticVehicle], random _time] call cba_fnc_waitAndExecute; -}; - -[{ - params ["_module","_fnc_createLogisticVehicle"]; - [_module,_fnc_createLogisticVehicle] call _fnc_createLogisticVehicle; -}, [_module,_fnc_createLogisticVehicle], random _time] call cba_fnc_waitAndExecute; diff --git a/addons/ailogistics/functions/fnc_moduleLogisticsStart.sqf b/addons/ailogistics/functions/fnc_moduleLogisticsStart.sqf new file mode 100644 index 000000000..0109c3111 --- /dev/null +++ b/addons/ailogistics/functions/fnc_moduleLogisticsStart.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Main function + + Parameters: + + + Return value: + Nothing +*/ + + +if (!isServer) exitWith {}; + +(_this select 1) params ["_module"]; + + +// get all modules parameters +private _picketLocations = (synchronizedObjects _module) select {_x isKindOf "uksf_ailogistics_logisticsPicketGroup"}; +private _picketBool = _module getVariable [QGVAR(routePickets), false]; +private _sideFromModule = _module getVariable [QGVAR(side), 0]; + + +// get side then update the variable with an actual side, get the updated version +if (_sideFromModule isEqualTo 0) then { + _module setVariable [QGVAR(side), EAST]; +} else { + _module setVariable [QGVAR(side), INDEPENDENT]; +}; +private _side = _module getVariable [QGVAR(side), EAST]; + + +if (_picketBool) then { + [_picketLocations] call FUNC(createPickets); +}; + +[_module] call FUNC(createLogisticVehicle); diff --git a/addons/ailogistics/functions/fnc_patrol.sqf b/addons/ailogistics/functions/fnc_patrol.sqf deleted file mode 100644 index 28e28b1a7..000000000 --- a/addons/ailogistics/functions/fnc_patrol.sqf +++ /dev/null @@ -1,19 +0,0 @@ -#include "script_component.hpp" -/* - Author: - Bridg - - Description: - Assign the route pickets their patrol routes - - Parameters: - 0: _group - - Return value: - Nothing -*/ - -params ["_group"]; - -[_group, getPos (leader _group), 150, 5, "MOVE", "SAFE"] call CBA_fnc_taskPatrol; - diff --git a/addons/ailogistics/functions/fnc_picketBehaviour.sqf b/addons/ailogistics/functions/fnc_picketBehaviour.sqf new file mode 100644 index 000000000..1cf24cce6 --- /dev/null +++ b/addons/ailogistics/functions/fnc_picketBehaviour.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + Author: + Bridg + + Description: + Assign the behaviour based on selection + 1 - CBA Patrol + 2 - CBA Defend + 3 - LAMBs Camp + + Parameters: + 0: _behaviour + + Return value: + Nothing +*/ + +params ["_behaviour", "_group"]; + +if (_behaviour == 0) exitWith {[_group, _group, 200, 5, "MOVE", "SAFE"] call CBA_fnc_taskPatrol}; + +if (_behaviour == 1) exitWith {[_group, getPos (leader _group), 100, [], true, true] call lambs_wp_fnc_taskCamp}; + +if (_behaviour == 2) exitWith {[_group, _group, 200, 3, 0.25, 0.5] call CBA_fnc_taskDefend}; diff --git a/addons/air/$PBOPREFIX$.txt b/addons/air/$PBOPREFIX$.txt new file mode 100644 index 000000000..020c21a9b --- /dev/null +++ b/addons/air/$PBOPREFIX$.txt @@ -0,0 +1,6 @@ +//<'uksf_air.pbo' properties via Mikero's dos tools, dll version 7.46> +prefix=u\uksf\addons\air; +Mikero=DePbo.dll.7.46; +version=2302dfff; +PboType=Arma Addon; +// diff --git a/addons/air/CfgVehicles.hpp b/addons/air/CfgVehicles.hpp index 499033e4d..5090dcc63 100644 --- a/addons/air/CfgVehicles.hpp +++ b/addons/air/CfgVehicles.hpp @@ -74,7 +74,6 @@ class CfgVehicles { #include "vehicles\CfgC130.hpp" #include "vehicles\CfgChinook.hpp" #include "vehicles\CfgDauphin.hpp" -#include "vehicles\CfgF35.hpp" #include "vehicles\CfgGR9.hpp" #include "vehicles\CfgHC135.hpp" #include "vehicles\CfgMerlin.hpp" diff --git a/addons/air/config.cpp b/addons/air/config.cpp index ca7861113..5dffa6ced 100644 --- a/addons/air/config.cpp +++ b/addons/air/config.cpp @@ -18,7 +18,6 @@ class CfgPatches { "CUP_AirVehicles_AV8B", "CUP_AirVehciles_AW159", "CUP_AirVehicles_CH47", - "CUP_AirVehicles_F35", "CUP_AirVehicles_HC3", "CUP_AirVehicles_L39", "CUP_AirVehicles_Merlin", @@ -31,7 +30,6 @@ class CfgPatches { "rksla3_aw159", "MEA_Panther", "HAFM_EC635", - "uksf_f35_plane", QGVAR(prep) }; author = QUOTE(UKSF); diff --git a/addons/air/vehicles/CfgWildcat.hpp b/addons/air/vehicles/CfgWildcat.hpp index bf6d9f844..c2fb34c16 100644 --- a/addons/air/vehicles/CfgWildcat.hpp +++ b/addons/air/vehicles/CfgWildcat.hpp @@ -17,7 +17,7 @@ class UK3CB_BAF_Wildcat_Base : Heli_light_03_base_F { cyclicAsideForceCoef = 1.2; // 1 cyclicForwardForceCoef = 1.1; // 1 unitInfoType = "RscUnitInfoNoSpeed"; - attenuationEffectType = "SemiOpenHeliAttenuation"; + attenuationEffectType = "HeliAttenuation"; #include "MFDCAS.hpp" class Components : Components { class VehicleSystemsDisplayManagerComponentLeft : DefaultVehicleSystemsDisplayManagerLeft { @@ -328,7 +328,7 @@ class rksla3_aw159_hma2 : rksla3_aw159_base { fuelCapacity = 400; // 742 startDuration = 30; unitInfoType = "RscUnitInfoNoSpeed"; - attenuationEffectType = "SemiOpenHeliAttenuation"; + attenuationEffectType = "HeliAttenuation"; weapons[] = { "UK3CB_BAF_Safe", "CMFlareLauncher" }; magazines[] = { "168Rnd_CMFlare_Chaff_Magazine" }; class ViewPilot : ViewPilot { diff --git a/addons/resupply/$PBOPREFIX$ b/addons/resupply/$PBOPREFIX$ deleted file mode 100644 index ab9c0539d..000000000 --- a/addons/resupply/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -u\uksf\addons\resupply diff --git a/addons/resupply/README.md b/addons/resupply/README.md deleted file mode 100644 index 21b761de1..000000000 --- a/addons/resupply/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Resupply - -UKSF resupply crates, R1–6 and T. From b06ae5acc0a59655555472cbe7c41e3bc6de40e3 Mon Sep 17 00:00:00 2001 From: abridgford Date: Sun, 11 Apr 2021 13:46:42 +0100 Subject: [PATCH 3/6] Add check for nearRaods to use as waypoints. --- addons/ailogistics/functions/fnc_logisticWaypoints.sqf | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/ailogistics/functions/fnc_logisticWaypoints.sqf b/addons/ailogistics/functions/fnc_logisticWaypoints.sqf index 378660678..c788eef62 100644 --- a/addons/ailogistics/functions/fnc_logisticWaypoints.sqf +++ b/addons/ailogistics/functions/fnc_logisticWaypoints.sqf @@ -15,7 +15,13 @@ params ["_module", "_group"]; -private _destination = synchronizedObjects _module; +private _destinationModule = (synchronizedObjects _module) select {_x isKindOf "uksf_ailogistics_logisticsDestination"}; +private _picketGroupModules = (synchronizedObjects _module) select {_x isKindOf "uksf_ailogistics_logisticsPicketGroup"}; +private _picketGroupModulesDistances = _picketGroupModules apply {[_x distance2D _module, (getPos _x) nearRoads 100]}; +_picketGroupModulesDistances sort true; -[_group, getPos (_destination select 0), 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "", "", [30,45,60]] call CBA_fnc_addWaypoint; +{ + [_group, getPos ((_x select 1) select 0), 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "", "", [0,0,0], 300] call CBA_fnc_addWaypoint; +} forEach _picketGroupModulesDistances; +[_group, getPos (_destinationModule select 0), 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "COLUMN", "", [45,60,75]] call CBA_fnc_addWaypoint; [_group, getPos _module, 0, "MOVE", "CARELESS", "YELLOW", "LIMITED", "COLUMN", QUOTE([this] call FUNC(handleDelete)), [10,15,20]] call CBA_fnc_addWaypoint; From b7bf54d482553bc823bfbc0bf1fd2ef8af47c69f Mon Sep 17 00:00:00 2001 From: Tim Beswick Date: Sun, 11 Apr 2021 18:12:17 +0100 Subject: [PATCH 4/6] Restore addons/resupply/$PBOPREFIX$ --- addons/resupply/$PBOPREFIX$ | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/resupply/$PBOPREFIX$ diff --git a/addons/resupply/$PBOPREFIX$ b/addons/resupply/$PBOPREFIX$ new file mode 100644 index 000000000..ab9c0539d --- /dev/null +++ b/addons/resupply/$PBOPREFIX$ @@ -0,0 +1 @@ +u\uksf\addons\resupply From cf64f031157980575990a21279fa16e0c8e818b4 Mon Sep 17 00:00:00 2001 From: Tim Beswick Date: Sun, 11 Apr 2021 18:12:22 +0100 Subject: [PATCH 5/6] Restore addons/resupply/README.md --- addons/resupply/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 addons/resupply/README.md diff --git a/addons/resupply/README.md b/addons/resupply/README.md new file mode 100644 index 000000000..21b761de1 --- /dev/null +++ b/addons/resupply/README.md @@ -0,0 +1,3 @@ +# Resupply + +UKSF resupply crates, R1–6 and T. From 06fd0fad95e95a642f2a94a5a3bf09a4ace22891 Mon Sep 17 00:00:00 2001 From: Tim Beswick Date: Sun, 11 Apr 2021 18:12:32 +0100 Subject: [PATCH 6/6] Delete $PBOPREFIX$.txt --- addons/air/$PBOPREFIX$.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 addons/air/$PBOPREFIX$.txt diff --git a/addons/air/$PBOPREFIX$.txt b/addons/air/$PBOPREFIX$.txt deleted file mode 100644 index 020c21a9b..000000000 --- a/addons/air/$PBOPREFIX$.txt +++ /dev/null @@ -1,6 +0,0 @@ -//<'uksf_air.pbo' properties via Mikero's dos tools, dll version 7.46> -prefix=u\uksf\addons\air; -Mikero=DePbo.dll.7.46; -version=2302dfff; -PboType=Arma Addon; -//