From 0ba542dd002b8587c497949ed0a3cf0f99de6ec4 Mon Sep 17 00:00:00 2001 From: Crowdedlight Date: Mon, 4 Mar 2024 19:17:51 +0100 Subject: [PATCH] battlegroup ai fix. PR #942 --- Missionframework/CfgFunctions.hpp | 1 + .../fn_LAMBS_enableReinforcements.sqf | 24 ++++++++ .../functions/fn_spawnVehicle.sqf | 3 +- .../scripts/server/ai/battlegroup_ai.sqf | 60 +++++++------------ .../server/battlegroup/spawn_battlegroup.sqf | 22 +++---- .../scripts/server/init_server.sqf | 8 +++ .../sector_liberated_remote_call.sqf | 2 +- .../server/sector/attack_in_progress_fob.sqf | 2 +- .../sector/attack_in_progress_sector.sqf | 2 +- 9 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 Missionframework/functions/fn_LAMBS_enableReinforcements.sqf diff --git a/Missionframework/CfgFunctions.hpp b/Missionframework/CfgFunctions.hpp index 3c49c9277..2faccd1f0 100644 --- a/Missionframework/CfgFunctions.hpp +++ b/Missionframework/CfgFunctions.hpp @@ -65,6 +65,7 @@ class KPLIB { class isBigtownActive {}; class isClassUAV {}; class isRadio {}; + class lambs_enableReinforcements{}; class log {}; class potatoScan {}; class protectObject {}; diff --git a/Missionframework/functions/fn_LAMBS_enableReinforcements.sqf b/Missionframework/functions/fn_LAMBS_enableReinforcements.sqf new file mode 100644 index 000000000..77e701b5b --- /dev/null +++ b/Missionframework/functions/fn_LAMBS_enableReinforcements.sqf @@ -0,0 +1,24 @@ +/* + File: fn_LAMBS_enableReinforcements.sqf + Author: Jenna + Date: 2023-10-21 + Last Update: 2023-10-21 + License: MIT License - http://www.opensource.org/licenses/MIT + Description: + Enables LAMBS reinforcements + radio on a given group + Parameter(s): + _grp - Group to enable features on [Group, defaults to grpNull] + Returns: + Nothing +*/ + +params [ + ["_grp", grpNull, [grpNull]] +]; + +if (isNull _grp) exitwith { + ["Attempted to set LAMBS Reinforcements on null group.", "ERROR"] remoteExecCall ["KPLIB_fnc_log", 2]; +}; + +(leader _grp) setVariable ["lambs_danger_dangerRadio", true,true]; +_grp setVariable ["lambs_danger_enableGroupReinforce", true, true]; \ No newline at end of file diff --git a/Missionframework/functions/fn_spawnVehicle.sqf b/Missionframework/functions/fn_spawnVehicle.sqf index db9a107c6..fc9bebaab 100644 --- a/Missionframework/functions/fn_spawnVehicle.sqf +++ b/Missionframework/functions/fn_spawnVehicle.sqf @@ -27,7 +27,6 @@ params [ if (_pos isEqualTo [0, 0, 0]) exitWith {["No or zero pos given"] call BIS_fnc_error; objNull}; if (_classname isEqualTo "") exitWith {["Empty string given"] call BIS_fnc_error; objNull}; -if (!canSuspend) exitWith {_this spawn KPLIB_fnc_spawnVehicle}; private _newvehicle = objNull; private _spawnpos = []; @@ -41,7 +40,7 @@ if (_precise) then { while {_spawnPos isEqualTo []} do { _i = _i + 1; _spawnpos = (_pos getPos [random 150, random 360]) findEmptyPosition [10, 100, _classname]; - if (_i isEqualTo 10) exitWith {}; + if (_i isEqualTo 10) exitWith {_spawnPos = zeroPos}; }; }; diff --git a/Missionframework/scripts/server/ai/battlegroup_ai.sqf b/Missionframework/scripts/server/ai/battlegroup_ai.sqf index b9e7167cd..0d665ce52 100644 --- a/Missionframework/scripts/server/ai/battlegroup_ai.sqf +++ b/Missionframework/scripts/server/ai/battlegroup_ai.sqf @@ -3,9 +3,6 @@ params [ ]; if (isNull _grp) exitWith {}; -if (isNil "reset_battlegroups_ai") then {reset_battlegroups_ai = false}; - -sleep (5 + (random 5)); private _objPos = [getPos (leader _grp)] call KPLIB_fnc_getNearestBluforObjective; @@ -14,40 +11,23 @@ private _objPos = [getPos (leader _grp)] call KPLIB_fnc_getNearestBluforObjectiv private _startpos = getPos (leader _grp); private _waypoint = []; -while {((getPos (leader _grp)) distance _startpos) < 100} do { - - while {!((waypoints _grp) isEqualTo [])} do {deleteWaypoint ((waypoints _grp) select 0);}; - {_x doFollow leader _grp} forEach units _grp; - - _startpos = getPos (leader _grp); - - _waypoint = _grp addWaypoint [_objPos, 100]; - _waypoint setWaypointType "MOVE"; - _waypoint setWaypointSpeed "NORMAL"; - _waypoint setWaypointBehaviour "AWARE"; - _waypoint setWaypointCombatMode "YELLOW"; - _waypoint setWaypointCompletionRadius 30; - - _waypoint = _grp addWaypoint [_objPos, 100]; - _waypoint setWaypointType "SAD"; - _waypoint = _grp addWaypoint [_objPos, 100]; - _waypoint setWaypointType "SAD"; - _waypoint = _grp addWaypoint [_objPos, 100]; - _waypoint setWaypointType "SAD"; - _waypoint = _grp addWaypoint [_objPos, 100]; - _waypoint setWaypointType "CYCLE"; - - sleep 90; -}; - -waitUntil { - sleep 5; - (((units _grp) select {alive _x}) isEqualTo []) || reset_battlegroups_ai -}; - -sleep (5 + (random 5)); -reset_battlegroups_ai = false; - -if (!((units _grp) isEqualTo []) && (GRLIB_endgame == 0)) then { - [_grp] spawn battlegroup_ai; -}; +{ deleteWaypoint _x } forEachReversed waypoints _grp; +{_x doFollow leader _grp} forEach units _grp; + +_startpos = getPos (leader _grp); + +_waypoint = _grp addWaypoint [_objPos, 100]; +_waypoint setWaypointType "MOVE"; +_waypoint setWaypointSpeed "NORMAL"; +_waypoint setWaypointBehaviour "AWARE"; +_waypoint setWaypointCombatMode "YELLOW"; +_waypoint setWaypointCompletionRadius 30; + +_waypoint = _grp addWaypoint [_objPos, 100]; +_waypoint setWaypointType "SAD"; +_waypoint = _grp addWaypoint [_objPos, 100]; +_waypoint setWaypointType "SAD"; +_waypoint = _grp addWaypoint [_objPos, 100]; +_waypoint setWaypointType "SAD"; +_waypoint = _grp addWaypoint [_objPos, 100]; +_waypoint setWaypointType "CYCLE"; \ No newline at end of file diff --git a/Missionframework/scripts/server/battlegroup/spawn_battlegroup.sqf b/Missionframework/scripts/server/battlegroup/spawn_battlegroup.sqf index 244285c0e..c4e4ec909 100644 --- a/Missionframework/scripts/server/battlegroup/spawn_battlegroup.sqf +++ b/Missionframework/scripts/server/battlegroup/spawn_battlegroup.sqf @@ -24,22 +24,22 @@ if !(_spawn_marker isEqualTo "") then { if (_infOnly) then { // Infantry units to choose from - private _infClasses = [KPLIB_o_inf_classes, militia_squad] select (combat_readiness < 50); + private _infClasses = [KPLIB_o_inf_classes, KPLIB_o_militiaInfantry] select (KPLIB_enemyReadiness < 50); // Adjust target size for infantry _target_size = 12 max (_target_size * 4); + private _squadNumber = round (_target_size/8); + for "_i" from 1 to _squadNumber do { // Create infantry groups with up to 8 units per squad - private _grp = createGroup [GRLIB_side_enemy, true]; - for "_i" from 0 to (_target_size - 1) do { - if (_i > 0 && {(_i % 8) isEqualTo 0}) then { - _bg_groups pushBack _grp; - _grp = createGroup [GRLIB_side_enemy, true]; - }; + private _grp = createGroup [kplib_side_enemy, true]; + for "_i" from 0 to 7 do { [selectRandom _infClasses, markerPos _spawn_marker, _grp] call KPLIB_fnc_createManagedUnit; }; - [_grp] spawn battlegroup_ai; - _bg_groups pushBack _grp; + [_grp] call KPLIB_fnc_LAMBS_enableReinforcements; + [_grp] call battlegroup_ai; + _grp setVariable ["KPLIB_isBattleGroup",true]; + }; } else { private _vehicle_pool = [opfor_battlegroup_vehicles, opfor_battlegroup_vehicles_low_intensity] select (combat_readiness < 50); @@ -55,8 +55,8 @@ if !(_spawn_marker isEqualTo "") then { sleep 0.5; (crew _vehicle) joinSilent _nextgrp; - [_nextgrp] spawn battlegroup_ai; - _bg_groups pushback _nextgrp; + [_nextgrp] call battlegroup_ai; + _nextgrp setVariable ["KPLIB_isBattleGroup",true]; if ((_x in opfor_troup_transports) && ([] call KPLIB_fnc_getOpforCap < GRLIB_battlegroup_cap)) then { if (_vehicle isKindOf "Air") then { diff --git a/Missionframework/scripts/server/init_server.sqf b/Missionframework/scripts/server/init_server.sqf index 8f44dcb73..89b921c5d 100644 --- a/Missionframework/scripts/server/init_server.sqf +++ b/Missionframework/scripts/server/init_server.sqf @@ -132,3 +132,11 @@ execVM "scripts\server\offloading\group_diag.sqf"; if (KP_liberation_restart > 0) then { execVM "scripts\server\game\server_restart.sqf"; }; + +["KPLIB_ResetBattleGroups", { + { + if (_x getVariable ["KPLIB_isBattleGroup",false]) then { + [_x] call battlegroup_ai; + } + } foreach allGroups; +}] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/Missionframework/scripts/server/remotecall/sector_liberated_remote_call.sqf b/Missionframework/scripts/server/remotecall/sector_liberated_remote_call.sqf index 525dd4ea5..795b785b4 100644 --- a/Missionframework/scripts/server/remotecall/sector_liberated_remote_call.sqf +++ b/Missionframework/scripts/server/remotecall/sector_liberated_remote_call.sqf @@ -17,7 +17,7 @@ stats_readiness_earned = stats_readiness_earned + _combat_readiness_increase; blufor_sectors pushback _liberated_sector; publicVariable "blufor_sectors"; stats_sectors_liberated = stats_sectors_liberated + 1; -reset_battlegroups_ai = true; publicVariable "reset_battlegroups_ai"; +["KPLIB_ResetBattleGroups"] call CBA_fnc_serverEvent; if (_liberated_sector in sectors_factory) then { { diff --git a/Missionframework/scripts/server/sector/attack_in_progress_fob.sqf b/Missionframework/scripts/server/sector/attack_in_progress_fob.sqf index 847ae9c1d..989d59d3e 100644 --- a/Missionframework/scripts/server/sector/attack_in_progress_fob.sqf +++ b/Missionframework/scripts/server/sector/attack_in_progress_fob.sqf @@ -49,7 +49,7 @@ if ( GRLIB_endgame == 0 ) then { sleep 3; GRLIB_all_fobs = GRLIB_all_fobs - [_thispos]; publicVariable "GRLIB_all_fobs"; - reset_battlegroups_ai = true; + ["KPLIB_ResetBattleGroups"] call CBA_fnc_serverEvent; [_thispos] call KPLIB_fnc_destroyFob; [] spawn KPLIB_fnc_doSave; stats_fobs_lost = stats_fobs_lost + 1; diff --git a/Missionframework/scripts/server/sector/attack_in_progress_sector.sqf b/Missionframework/scripts/server/sector/attack_in_progress_sector.sqf index 4fe522eab..f86d53b3b 100644 --- a/Missionframework/scripts/server/sector/attack_in_progress_sector.sqf +++ b/Missionframework/scripts/server/sector/attack_in_progress_sector.sqf @@ -50,7 +50,7 @@ if ( GRLIB_endgame == 0 ) then { blufor_sectors = blufor_sectors - [ _sector ]; publicVariable "blufor_sectors"; [_sector, 2] remoteExec ["remote_call_sector"]; - reset_battlegroups_ai = true; + ["KPLIB_ResetBattleGroups"] call CBA_fnc_serverEvent; [] spawn KPLIB_fnc_doSave; stats_sectors_lost = stats_sectors_lost + 1; {