mirror of
https://github.com/Teh-Dango/Sarge-AI.git
synced 2024-08-30 16:32:11 +00:00
3ac749d64b
This is the latest stable version of Sarge AI for Arma 3: Exile.
298 lines
8.6 KiB
Plaintext
298 lines
8.6 KiB
Plaintext
private ["_cycle","_grp","_members","_grpmission","_grpstatus","_grpid","_Ucthis","_lastcurrpos","_lastpos","_lastattackpos","_areamarker","_npc","_driver","_buildingdist","_deadbodiesnear","_stuck","_makenewtarget","_targetpos","_attackpos","_dist","_target","_wptype","_traveldist","_targetdist","_speedmode","_behaviour","_combatmode","_currPos","_grpcomposition","_typeofgrp","_capacityofgrp","_assignedvehicle","_supstatus","_TargetSearch"];
|
|
|
|
while {true} do
|
|
{
|
|
_cycle = ((random 1) + 1.5);
|
|
{
|
|
If (!IsNull _x) then
|
|
{
|
|
_grp = _x;
|
|
|
|
_members = (_grp getvariable "UPSMON_Origin") select 4;
|
|
|
|
_grpmission = _grp getvariable "UPSMON_GrpMission";
|
|
_grpstatus = _grp getvariable "UPSMON_Grpstatus";
|
|
|
|
_grpid = _grp getVariable "UPSMON_grpid";
|
|
_Ucthis = _grp getvariable "UPSMON_Ucthis";
|
|
|
|
_lastcurrpos = (_grp getvariable "UPSMON_Lastinfos") select 0;
|
|
_lastpos = (_grp getvariable "UPSMON_Lastinfos") select 1;
|
|
_lastattackpos = _grp getvariable ["UPSMON_Lastattackpos",[]];
|
|
|
|
_areamarker = _Ucthis select 1;
|
|
|
|
if (({alive _x && !(captive _x)} count units _grp) == 0 || _grp getvariable ["UPSMON_Removegroup",false]) exitwith
|
|
{
|
|
[_grp,_UCthis] call UPSMON_RESPAWN;
|
|
};
|
|
|
|
_npc = leader _grp;
|
|
_driver = driver (vehicle _npc);
|
|
|
|
// did the leader die?
|
|
_npc = [_npc,_grp] call UPSMON_getleader;
|
|
if (!alive _npc || isplayer _npc) exitwith {[_grp,_UCthis] call UPSMON_Respawngrp;};
|
|
|
|
_buildingdist = 50;
|
|
_deadbodiesnear = false;
|
|
_stuck = false;
|
|
_makenewtarget = false;
|
|
_targetpos = [0,0];
|
|
_Attackpos = [];
|
|
_wptype = "MOVE";
|
|
_targetdist = 1000;
|
|
_traveldist = 0;
|
|
_dist = 10000;
|
|
_safemode = ["CARELESS","SAFE"];
|
|
|
|
_target = ObjNull;
|
|
|
|
_speedmode = speedmode _npc;
|
|
_behaviour = behaviour _npc;
|
|
_combatmode = "YELLOW";
|
|
|
|
|
|
// current position
|
|
_currPos = getposATL _npc;
|
|
|
|
If (count(waypoints _grp) != 0) then
|
|
{
|
|
_wppos = waypointPosition [_grp,count(waypoints _grp)-1];
|
|
_targetpos = _wppos;
|
|
_wptype = waypointType [_grp,count(waypoints _grp)-1];
|
|
_targetdist = [_currpos,_targetpos] call UPSMON_distancePosSqr;
|
|
};
|
|
|
|
_grpcomposition = [_grp] call UPSMON_analysegrp;
|
|
_typeofgrp = _grpcomposition select 0;
|
|
_capacityofgrp = _grpcomposition select 1;
|
|
_assignedvehicle = _grpcomposition select 2;
|
|
|
|
_supstatus = [_grp] call UPSMON_supstatestatus;
|
|
_nowp = [_grp,_target,_supstatus] call UPSMON_NOWP;
|
|
|
|
If (_grp getvariable ["UPSMON_GrpHostility",0] > 0) then
|
|
{
|
|
_TargetSearch = [_grp,_areamarker] call UPSMON_TargetAcquisitionCiv;
|
|
_target = _TargetSearch select 0;
|
|
_dist = _TargetSearch select 1;
|
|
_attackpos = _TargetSearch select 2;
|
|
|
|
If (_grp getvariable ["UPSMON_Grpmission",""] != "HARASS") then
|
|
{
|
|
If (!Isnull _target) then
|
|
{
|
|
_grp setvariable ["UPSMON_Grpmission","HARASS"]
|
|
};
|
|
}
|
|
else
|
|
{
|
|
If (Isnull _target) then
|
|
{
|
|
[_grp] call UPSMON_BackToNormal;
|
|
};
|
|
};
|
|
};
|
|
|
|
//If in safe mode if find dead bodies change behaviour
|
|
{
|
|
if (alive _x) then
|
|
{
|
|
if (vehicle _x == _x) then
|
|
{
|
|
If (!(_x getvariable ["UPSMON_Civfleeing",false])) then
|
|
{
|
|
If ((_x getvariable ["UPSMON_SUPSTATUS",""]) == "") then
|
|
{
|
|
If (UPSMON_deadBodiesReact)then
|
|
{
|
|
_dead = [_x,_buildingdist] call UPSMON_deadbodies;
|
|
if (!IsNull _dead) exitwith
|
|
{
|
|
["FLEE",_x,Objnull] spawn UPSMON_Civaction;
|
|
};
|
|
};
|
|
}
|
|
else
|
|
{
|
|
["FLEE",_x,Objnull] spawn UPSMON_Civaction;
|
|
};
|
|
|
|
};
|
|
};
|
|
};
|
|
} foreach units _grp;
|
|
|
|
//Stuck control
|
|
If (!(_npc getvariable ["UPSMON_Civdisable",false])) then
|
|
{
|
|
_stuck = [_npc,_lastcurrpos,_currpos] call UPSMON_Isgrpstuck;
|
|
};
|
|
|
|
//*********************************************************************************************************************
|
|
// ORDERS
|
|
//*********************************************************************************************************************
|
|
|
|
switch (_grp getvariable "UPSMON_GrpMission") do
|
|
{
|
|
case "PATROL":
|
|
{
|
|
_speedmode = Speedmode _npc;
|
|
_behaviour = Behaviour _npc;
|
|
_wpformation = Formation _npc;
|
|
|
|
If (!(_grp getvariable ["UPSMON_InTransport",false])) then
|
|
{
|
|
|
|
If (!(_grp getvariable ["UPSMON_searchingpos",false])) then
|
|
{
|
|
If (!([_targetpos,_areamarker] call UPSMON_pos_fnc_isBlacklisted)
|
|
|| _stuck
|
|
|| _targetdist <= 5
|
|
|| count(waypoints _grp) == 0
|
|
|| ((("tank" in _typeofgrp) || ("ship" in _typeofgrp) || ("apc" in _typeofgrp) ||("car" in _typeofgrp)) && _targetdist <= 25)
|
|
|| (("air" in _typeofgrp && !(_grp getVariable ["UPSMON_landing",false])) && (_targetdist <= 70 || Unitready _driver))) then
|
|
{
|
|
_makenewtarget=true;
|
|
};
|
|
};
|
|
};
|
|
|
|
// Search new patrol pos
|
|
if (_makenewtarget) then
|
|
{
|
|
if (UPSMON_Debug > 0) then {diag_log format ["Grp%1 search newpos",_grp getvariable ["UPSMON_grpid",0]];};
|
|
[_grp,_wpformation,_speedmode,_areamarker,_Behaviour,_combatmode,_typeofgrp] spawn UPSMON_DOPATROL;
|
|
};
|
|
};
|
|
|
|
case "RELAX":
|
|
{
|
|
[_grp,_areamarker] call UPSMON_DORELAX;
|
|
};
|
|
|
|
case "HARASS":
|
|
{
|
|
{
|
|
If (alive _x) then
|
|
{
|
|
If (canmove _x) then
|
|
{
|
|
If (vehicle _x == _x) then
|
|
{
|
|
If (!(_x getvariable ["UPSMON_Civfleeing",false])) then
|
|
{
|
|
If (_x getvariable ["UPSMON_Throwstone",time] <= time) then
|
|
{
|
|
If (!IsNull _target) then
|
|
{
|
|
If (_dist > 100 && !([_x,_target,100,130] call UPSMON_Haslos)) then
|
|
{
|
|
If (_x getvariable ["UPSMON_Civdisable",false]) then
|
|
{
|
|
_x switchmove "";
|
|
_x enableAI "MOVE";
|
|
_x setvariable ["UPSMON_Civdisable",false];
|
|
};
|
|
|
|
If (_x getvariable ["UPSMON_Movingtotarget",time] <= time) then
|
|
{
|
|
Dostop _x;
|
|
_x domove _attackpos;
|
|
_x setDestination [_attackpos, "LEADER PLANNED", true];
|
|
_time = time + 120;
|
|
_x setvariable ["UPSMON_Movingtotarget",_time];
|
|
};
|
|
}
|
|
else
|
|
{
|
|
[_x,_attackpos] spawn UPSMON_throw_stone;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
sleep 0.2;
|
|
} foreach units _grp;
|
|
};
|
|
|
|
case "STATIC":
|
|
{
|
|
|
|
};
|
|
|
|
};
|
|
|
|
If (count(waypoints _grp) != 0) then
|
|
{
|
|
_wppos = waypointPosition [_grp,count(waypoints _grp)-1];
|
|
_targetpos = _wppos;
|
|
_wptype = waypointType [_grp,count(waypoints _grp)-1];
|
|
_targetdist = [_currpos,_targetpos] call UPSMON_distancePosSqr;
|
|
};
|
|
|
|
if (!_nowp) then
|
|
{
|
|
If (_grp getvariable "UPSMON_GrpMission" == "PATROL") then
|
|
{
|
|
///////////////////////////////////////////////////////////////////////////
|
|
/////////// Disembarking //////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
If (!(_grp getvariable ["UPSMON_disembarking",false])) then
|
|
{
|
|
If (!(_grp getvariable ["UPSMON_searchingpos",false])) then
|
|
{
|
|
If (_targetpos select 0 != 0 && _targetpos select 1 != 0) then
|
|
{
|
|
If (!(_npc getvariable ["UPSMON_Civfleeing",false])) then
|
|
{
|
|
If (count _assignedvehicle > 0) then
|
|
{
|
|
[_grp,_assignedvehicle,_dist,_targetdist,_supstatus] call UPSMON_Disembarkment;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
///////////////////////////////////////////////////////////////////////////
|
|
/////////// Embarking //////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
If (!(_grp getvariable ["UPSMON_embarking",false])) then
|
|
{
|
|
if (!(_grp getvariable ["UPSMON_Disembarking",false])) then
|
|
{
|
|
If (!(_grp getvariable ["UPSMON_searchingpos",false])) then
|
|
{
|
|
If (!(_grp getVariable ["UPSMON_landing",false])) then
|
|
{
|
|
[_grp,_typeofgrp,_targetpos,_dist,_targetdist,_assignedvehicle,_supstatus,_speedmode,_behaviour] call UPSMON_Embarkment;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};// !NOWP
|
|
|
|
if (({alive _x && !(captive _x)} count units _grp) == 0 || _grp getvariable ["UPSMON_Removegroup",false]) exitwith
|
|
{
|
|
[_grp,_UCthis] call UPSMON_RESPAWN;
|
|
};
|
|
|
|
_grp setvariable ["UPSMON_Grpstatus",_grpstatus];
|
|
_grp setvariable ["UPSMON_Lastinfos",[_currpos,_targetpos]];
|
|
_grp setvariable ["UPSMON_Lastattackpos",_attackpos];
|
|
_grp setvariable ["UPSMON_LastGrpmission",_grp getvariable ["UPSMON_Grpmission",""]];
|
|
|
|
sleep 0.1;
|
|
|
|
};
|
|
|
|
} foreach UPSMON_Civs;
|
|
If (ObjNull in UPSMON_NPCs) then {UPSMON_NPCs = UPSMON_NPCs - [ObjNull]};
|
|
sleep _cycle;
|
|
}; |