New Version 1.34

Added 2 new AA systems that can be deployed
By default the HAWK is currently disabled due to bugs in 1.5 and has
been replaced by the KUB
You can also comment in the BUK system and build that
This commit is contained in:
Ciaran Fisher
2015-10-21 20:32:02 +01:00
parent 8801b65d22
commit 2ab5fe35bb
3 changed files with 190 additions and 71 deletions

261
CTLD.lua
View File

@@ -13,7 +13,9 @@
Contributors: Contributors:
- Steggles - https://github.com/Bob7heBuilder - Steggles - https://github.com/Bob7heBuilder
Version: 1.32 - 14/10/2015 - Bug fix for Waypoint after troops dropped Version: 1.34 - 19/10/2015 - Added ctld.unloadInProximityToEnemy - can be used with a continuous trigger
- Added KUB launcher system instead of HAWK for Red side
- Added optional BUK launcher system
]] ]]
@@ -362,14 +364,28 @@ ctld.spawnableCrates = {
{ weight = 210, desc = "Stinger", unit = "Stinger manpad", side = 2 }, { weight = 210, desc = "Stinger", unit = "Stinger manpad", side = 2 },
{ weight = 215, desc = "Igla", unit = "SA-18 Igla manpad", side = 1 }, { weight = 215, desc = "Igla", unit = "SA-18 Igla manpad", side = 1 },
{ weight = 1000, desc = "HAWK Launcher", unit = "Hawk ln" }, -- HAWK System
{ weight = 1010, desc = "HAWK Search Radar", unit = "Hawk sr" }, -- { weight = 1000, desc = "HAWK Launcher", unit = "Hawk ln", side = 2},
{ weight = 1020, desc = "HAWK Track Radar", unit = "Hawk tr" }, -- { weight = 1010, desc = "HAWK Search Radar", unit = "Hawk sr", side = 2 },
{ weight = 1021, desc = "HAWK Repair", unit = "HAWK Repair" }, -- { weight = 1020, desc = "HAWK Track Radar", unit = "Hawk tr", side = 2 },
-- -- { weight = 1021, desc = "HAWK Repair", unit = "HAWK Repair" , side = 2 },
-- End of HAWK
{ weight = 505, desc = "Strela-1 9P31", unit = "Strela-1 9P31", side = 1, cratesRequired = 4 }, -- BUK System
{ weight = 506, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 4 }, -- { weight = 1022, desc = "BUK Launcher", unit = "SA-11 Buk LN 9A310M1"},
-- { weight = 1023, desc = "BUK Search Radar", unit = "SA-11 Buk SR 9S18M1"},
-- { weight = 1024, desc = "BUK CC Radar", unit = "SA-11 Buk CC 9S470M1"},
-- { weight = 1025, desc = "BUK Repair", unit = "BUK Repair"},
-- END of BUK
{ weight = 1026, desc = "KUB Launcher", unit = "Kub 2P25 ln"},
{ weight = 1027, desc = "KUB Radar", unit = "Kub 1S91 str" },
{ weight = 1025, desc = "KUB Repair", unit = "KUB Repair"},
-- KUB System
-- End of KUB
{ weight = 505, desc = "Strela-1 9P31", unit = "Strela-1 9P31", side = 1, cratesRequired = 3 },
{ weight = 506, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 3 },
}, },
} }
@@ -587,7 +603,6 @@ function ctld.createRadioBeaconAtZone(_zone, _coalition, _batteryLife, _name)
end end
------------------------ Steggles Functions-----------------------
-- Activates a pickup zone -- Activates a pickup zone
-- Activates a pickup zone when called from a trigger -- Activates a pickup zone when called from a trigger
-- EG: ctld.activatePickupZone("pickzone3") -- EG: ctld.activatePickupZone("pickzone3")
@@ -663,6 +678,41 @@ function ctld.deactivatePickupZone(_zoneName)
end end
end end
-- Continuous Trigger Function
-- Causes an AI unit with the specified name to unload troops / vehicles when
-- an enemy is detected within a specified distance
-- The enemy must have Line or Sight to the unit to be detected
function ctld.unloadInProximityToEnemy(_unitName,_distance)
local _unit = ctld.getTransportUnit(_unitName)
if _unit ~= nil and _unit:getPlayerName() == nil then
-- no player name means AI!
-- the findNearest visible enemy you'd want to modify as it'll find enemies quite far away
-- limited by ctld.JTAC_maxDistance
local _nearestEnemy = ctld.findNearestVisibleEnemy(_unit,"all",_distance)
if _nearestEnemy ~= nil then
if ctld.troopsOnboard(_unit, true) then
ctld.deployTroops(_unit, true)
return true
end
if ctld.unitCanCarryVehicles(_unit) and ctld.troopsOnboard(_unit, false) then
ctld.deployTroops(_unit, false)
return true
end
end
end
return false
end
-- *************************************************************** -- ***************************************************************
-- **************** BE CAREFUL BELOW HERE ************************ -- **************** BE CAREFUL BELOW HERE ************************
-- *************************************************************** -- ***************************************************************
@@ -1957,17 +2007,18 @@ function ctld.getClosestCrate(_heli, _crates, _type)
return _closetCrate return _closetCrate
end end
function ctld.findNearestHawk(_heli) function ctld.findNearestAASystem(_heli,_type)
local _closestHawkGroup = nil local _closestHawkGroup = nil
local _shortestDistance = -1 local _shortestDistance = -1
local _distance = 0 local _distance = 0
for _groupName, _hawkDetails in pairs(ctld.completeHawkSystems) do for _groupName, _hawkDetails in pairs(ctld.completeAASystems) do
local _hawkGroup = Group.getByName(_groupName) local _hawkGroup = Group.getByName(_groupName)
if _hawkGroup ~= nil and _hawkGroup:getCoalition() == _heli:getCoalition() then -- env.info(_groupName..": "..mist.utils.tableShow(_hawkDetails))
if _hawkGroup ~= nil and _hawkGroup:getCoalition() == _heli:getCoalition() and _hawkDetails[1].groupType == _type then
local _units = _hawkGroup:getUnits() local _units = _hawkGroup:getUnits()
@@ -1989,6 +2040,7 @@ function ctld.findNearestHawk(_heli)
end end
if _closestHawkGroup ~= nil then if _closestHawkGroup ~= nil then
return { group = _closestHawkGroup, dist = _shortestDistance } return { group = _closestHawkGroup, dist = _shortestDistance }
end end
return nil return nil
@@ -2658,20 +2710,24 @@ end
function ctld.isMultiCrate(_crateDetails) function ctld.isMultiCrate(_crateDetails)
if string.match(_crateDetails.desc, "HAWK") if string.match(_crateDetails.desc, "HAWK")
or (_crateDetails.cratesRequired ~= nil and _crateDetails.cratesRequired > 1) then or (_crateDetails.cratesRequired ~= nil and _crateDetails.cratesRequired > 1)
or string.match(_crateDetails.desc,"BUK")
or string.match(_crateDetails.desc,"KUB") then
return true return true
else else
return false return false
end end
end end
function ctld.rearmHawk(_heli, _nearestCrate, _nearbyCrates) function ctld.rearmAASystem(_heli, _nearestCrate, _nearbyCrates,_type)
-- are we adding to existing hawk system? -- are we adding to existing hawk system?
if _nearestCrate.details.unit == "Hawk ln" then if _nearestCrate.details.unit == "Hawk ln"
or string.match(_nearestCrate.details.unit, "Buk LN 9A310M1")
or string.match(_nearestCrate.details.unit,"Kub 2P25 ln") then
-- find nearest COMPLETE hawk system -- find nearest COMPLETE hawk system
local _nearestHawk = ctld.findNearestHawk(_heli) local _nearestHawk = ctld.findNearestAASystem(_heli,_type)
if _nearestHawk ~= nil and _nearestHawk.dist < 300 then if _nearestHawk ~= nil and _nearestHawk.dist < 300 then
@@ -2695,19 +2751,20 @@ function ctld.rearmHawk(_heli, _nearestCrate, _nearbyCrates)
end end
end end
if ctld.countTableEntries(_uniqueTypes) == 3 and #_points >= 3 then if (_type == "kub" and ctld.countTableEntries(_uniqueTypes) == 2 and #_points >= 2)
or (ctld.countTableEntries(_uniqueTypes) == 3 and #_points >= 3) then
-- rearm hawk -- rearm hawk
-- destroy old group -- destroy old group
ctld.completeHawkSystems[_nearestHawk.group:getName()] = nil ctld.completeAASystems[_nearestHawk.group:getName()] = nil
_nearestHawk.group:destroy() _nearestHawk.group:destroy()
local _spawnedGroup = ctld.spawnCrateGroup(_heli, _points, _types) local _spawnedGroup = ctld.spawnCrateGroup(_heli, _points, _types)
ctld.completeHawkSystems[_spawnedGroup:getName()] = ctld.getHawkDetails(_spawnedGroup) ctld.completeAASystems[_spawnedGroup:getName()] = ctld.getAASystemDetails(_spawnedGroup,_type)
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully rearmed a full HAWK AA System in the field", 10) trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully rearmed a full "..string.upper(_type).." AA System in the field", 10)
if _heli:getCoalition() == 1 then if _heli:getCoalition() == 1 then
ctld.spawnedCratesRED[_nearestCrate.crateUnit:getName()] = nil ctld.spawnedCratesRED[_nearestCrate.crateUnit:getName()] = nil
@@ -2728,14 +2785,14 @@ function ctld.rearmHawk(_heli, _nearestCrate, _nearbyCrates)
return false return false
end end
function ctld.getHawkDetails(_hawkGroup) function ctld.getAASystemDetails(_hawkGroup,_type)
local _units = _hawkGroup:getUnits() local _units = _hawkGroup:getUnits()
local _hawkDetails = {} local _hawkDetails = {}
for _, _unit in pairs(_units) do for _, _unit in pairs(_units) do
table.insert(_hawkDetails, { point = _unit:getPoint(), unit = _unit:getTypeName(), name = _unit:getName() }) table.insert(_hawkDetails, { point = _unit:getPoint(), unit = _unit:getTypeName(), name = _unit:getName(), groupType=_type})
end end
return _hawkDetails return _hawkDetails
@@ -2758,27 +2815,50 @@ function ctld.countTableEntries(_table)
return _count return _count
end end
function ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates) function ctld.unpackAASystem(_heli, _nearestCrate, _nearbyCrates,_type)
if ctld.rearmHawk(_heli, _nearestCrate, _nearbyCrates) then if ctld.rearmAASystem(_heli, _nearestCrate, _nearbyCrates,_type) then
-- rearmed hawk -- rearmed hawk
return return
end end
-- are there all the pieces close enough together -- are there all the pieces close enough together
local _hawkParts = { ["Hawk ln"] = false, ["Hawk tr"] = false, ["Hawk sr"] = false } local _hawkParts = nil
if _type == "hawk" then
_hawkParts = { ["Hawk ln"] = false, ["Hawk tr"] = false, ["Hawk sr"] = false }
elseif _type == "buk" then
_hawkParts = { ["Buk SR 9S18M1"] = false, ["Buk CC 9S470M1"] = false, ["Buk LN 9A310M1"] = false }
else
_hawkParts = { ["Kub 2P25 ln"] = false, ["Kub 1S91 str"] = false }
end
for _, _nearbyCrate in pairs(_nearbyCrates) do for _, _nearbyCrate in pairs(_nearbyCrates) do
if _nearbyCrate.dist < 500 then if _nearbyCrate.dist < 500 then
if _nearbyCrate.details.unit == "Hawk ln" or _nearbyCrate.details.unit == "Hawk sr" or _nearbyCrate.details.unit == "Hawk tr" then if _type == "hawk" then
if _nearbyCrate.details.unit == "Hawk ln" or _nearbyCrate.details.unit == "Hawk sr" or _nearbyCrate.details.unit == "Hawk tr" then
_hawkParts[_nearbyCrate.details.unit] = _nearbyCrate
else
-- not part of hawk
end
elseif _type == "buk" then
if string.match(_nearbyCrate.details.unit, "Buk SR 9S18M1") then
_hawkParts["Buk SR 9S18M1"] = _nearbyCrate
elseif string.match(_nearbyCrate.details.unit, "Buk CC 9S470M1") then
_hawkParts["Buk CC 9S470M1"] = _nearbyCrate
elseif string.match(_nearbyCrate.details.unit, "Buk LN 9A310M1") then
_hawkParts["Buk LN 9A310M1"] = _nearbyCrate
end
elseif _type == "kub" then
if _nearbyCrate.details.unit == "Kub 2P25 ln" or _nearbyCrate.details.unit == "Kub 1S91 str" then
_hawkParts[_nearbyCrate.details.unit] = _nearbyCrate
end
_hawkParts[_nearbyCrate.details.unit] = _nearbyCrate
else
-- not part of hawk
end end
end end
end end
@@ -2791,17 +2871,40 @@ function ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates)
if _hawkPart == false then if _hawkPart == false then
if _name == "Hawk ln" then if _type == "hawk" then
_txt = "Missing HAWK Launcher\n" if _name == "Hawk ln" then
elseif _name == "Hawk sr" then _txt = "Missing HAWK Launcher\n"
_txt = _txt .. "Missing HAWK Search Radar\n" elseif _name == "Hawk sr" then
else _txt = _txt .. "Missing HAWK Search Radar\n"
_txt = _txt .. "Missing HAWK Track Radar\n" else
_txt = _txt .. "Missing HAWK Track Radar\n"
end
elseif _type == "buk" then
if string.match(_name, "Buk SR 9S18M1") then
_txt = "Missing BUK Search Radar\n"
elseif string.match(_name, "Buk CC 9S470M1") then
_txt = _txt .. "Missing BUK CC Radar\n"
else
_txt = _txt .. "Missing BUK Launcher\n"
end
elseif _type == "kub" then
if string.match(_name, "Kub 1S91 str") then
_txt = "Missing KUB Radar\n"
else
_txt = _txt .. "Missing KUB Launcher\n"
end
end end
else else
-- add back REAL buk part names as the - doesnt match for some reason
if _type == "buk" then
_name = "SA-11 ".._name
end
--handle multiple launchers from one crate --handle multiple launchers from one crate
if _name == "Hawk ln" and ctld.hawkLaunchers > 1 then if (_name == "Hawk ln" or string.match(_name, "Buk LN 9A310M1") or string.match(_name,"Kub 2P25 ln")) and ctld.hawkLaunchers > 1 then
--add multiple launchers --add multiple launchers
for _i = 1, ctld.hawkLaunchers do for _i = 1, ctld.hawkLaunchers do
@@ -2816,7 +2919,7 @@ function ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates)
_point = { x = _point.x + _xOffset, y = _point.y, z = _point.z + _yOffset } _point = { x = _point.x + _xOffset, y = _point.y, z = _point.z + _yOffset }
table.insert(_posArray, _point) table.insert(_posArray, _point)
table.insert(_typeArray, "Hawk ln") table.insert(_typeArray, _name)
end end
else else
table.insert(_posArray, _hawkPart.crateUnit:getPoint()) table.insert(_posArray, _hawkPart.crateUnit:getPoint())
@@ -2826,9 +2929,7 @@ function ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates)
end end
if _txt ~= "" then if _txt ~= "" then
ctld.displayMessageToGroup(_heli, "Cannot build "..string.upper(_type).."\n" .. _txt .. "\n\nOr the crates are not close enough together", 20)
ctld.displayMessageToGroup(_heli, "Cannot build Hawk\n" .. _txt .. "\n\nOr the crates are not close enough together", 20)
return return
else else
@@ -2847,23 +2948,25 @@ function ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates)
end end
end end
-- HAWK READY! -- HAWK / BUK READY!
local _spawnedGroup = ctld.spawnCrateGroup(_heli, _posArray, _typeArray) local _spawnedGroup = ctld.spawnCrateGroup(_heli, _posArray, _typeArray)
ctld.completeHawkSystems[_spawnedGroup:getName()] = ctld.getHawkDetails(_spawnedGroup) ctld.completeAASystems[_spawnedGroup:getName()] = ctld.getAASystemDetails(_spawnedGroup,_type)
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully deployed a full "..string.upper(_type).." AA System to the field", 10)
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully deployed a full HAWK AA System to the field", 10)
end end
end end
function ctld.repairHawk(_heli, _nearestCrate)
-- find nearest COMPLETE hawk system function ctld.repairAASystem(_heli, _nearestCrate,_type)
local _nearestHawk = ctld.findNearestHawk(_heli)
-- find nearest COMPLETE AA system
local _nearestHawk = ctld.findNearestAASystem(_heli,_type)
if _nearestHawk ~= nil and _nearestHawk.dist < 300 then if _nearestHawk ~= nil and _nearestHawk.dist < 300 then
local _oldHawk = ctld.completeHawkSystems[_nearestHawk.group:getName()] local _oldHawk = ctld.completeAASystems[_nearestHawk.group:getName()]
--spawn new one --spawn new one
@@ -2876,14 +2979,14 @@ function ctld.repairHawk(_heli, _nearestCrate)
end end
--remove old system --remove old system
ctld.completeHawkSystems[_nearestHawk.group:getName()] = nil ctld.completeAASystems[_nearestHawk.group:getName()] = nil
_nearestHawk.group:destroy() _nearestHawk.group:destroy()
local _spawnedGroup = ctld.spawnCrateGroup(_heli, _points, _types) local _spawnedGroup = ctld.spawnCrateGroup(_heli, _points, _types)
ctld.completeHawkSystems[_spawnedGroup:getName()] = ctld.getHawkDetails(_spawnedGroup) ctld.completeAASystems[_spawnedGroup:getName()] = ctld.getAASystemDetails(_spawnedGroup,_type)
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully repaired a full HAWK AA System in the field", 10) trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " successfully repaired a full "..string.upper(_type).." AA System in the field", 10)
if _heli:getCoalition() == 1 then if _heli:getCoalition() == 1 then
ctld.spawnedCratesRED[_nearestCrate.crateUnit:getName()] = nil ctld.spawnedCratesRED[_nearestCrate.crateUnit:getName()] = nil
@@ -2896,20 +2999,29 @@ function ctld.repairHawk(_heli, _nearestCrate)
_nearestCrate.crateUnit:destroy() _nearestCrate.crateUnit:destroy()
end end
else else
ctld.displayMessageToGroup(_heli, "Cannot repair a HAWK System. No damaged HAWK systems within 300m", 10) ctld.displayMessageToGroup(_heli, "Cannot repair a "..string.upper(_type).." System. No damaged "..string.upper(_type).." systems within 300m", 10)
end end
end end
function ctld.unpackMultiCrate(_heli, _nearestCrate, _nearbyCrates) function ctld.unpackMultiCrate(_heli, _nearestCrate, _nearbyCrates)
if string.match(_nearestCrate.details.desc, "HAWK") then local _type = nil
if string.match(_nearestCrate.details.desc, "BUK") then
_type = "buk"
elseif string.match(_nearestCrate.details.desc, "HAWK") then
_type = "hawk"
elseif string.match(_nearestCrate.details.desc, "KUB") then
_type = "kub"
end
if _type ~= nil then
if string.match(_nearestCrate.details.desc, "Repair") then if string.match(_nearestCrate.details.desc, "Repair") then
ctld.repairHawk(_heli, _nearestCrate) ctld.repairAASystem(_heli, _nearestCrate,_type)
else else
ctld.unpackHawk(_heli, _nearestCrate, _nearbyCrates) ctld.unpackAASystem(_heli, _nearestCrate, _nearbyCrates,_type)
end end
return -- stop processing return -- stop processing
@@ -3147,7 +3259,7 @@ function ctld.findNearestEnemy(_side, _point, _searchDistance)
-- no enemy - move to random point -- no enemy - move to random point
if _closestEnemy ~= nil then if _closestEnemy ~= nil then
-- env.info("found enemy") -- env.info("found enemy")
return _closestEnemy return _closestEnemy
else else
@@ -3256,15 +3368,15 @@ function ctld.orderGroupToMoveToPoint(_leader, _destination)
-- delayed 2 second to work around bug -- delayed 2 second to work around bug
timer.scheduleFunction(function(_arg) timer.scheduleFunction(function(_arg)
local _grp = ctld.getAliveGroup(_arg[1]) local _grp = ctld.getAliveGroup(_arg[1])
if _grp ~= nil then if _grp ~= nil then
local _controller = _grp:getController(); local _controller = _grp:getController();
Controller.setOption(_controller, AI.Option.Ground.id.ALARM_STATE, AI.Option.Ground.val.ALARM_STATE.AUTO) Controller.setOption(_controller, AI.Option.Ground.id.ALARM_STATE, AI.Option.Ground.val.ALARM_STATE.AUTO)
Controller.setOption(_controller, AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE) Controller.setOption(_controller, AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE)
_controller:setTask(_arg[2]) _controller:setTask(_arg[2])
end
end end
end
, {_group:getName(), _mission}, timer.getTime() + 2) , {_group:getName(), _mission}, timer.getTime() + 2)
end end
@@ -4111,8 +4223,9 @@ end
-- Find nearest enemy to JTAC that isn't blocked by terrain -- Find nearest enemy to JTAC that isn't blocked by terrain
function ctld.findNearestVisibleEnemy(_jtacUnit, _targetType) function ctld.findNearestVisibleEnemy(_jtacUnit, _targetType,_distance)
local _maxDistance = _distance or ctld.JTAC_maxDistance
local _x = 1 local _x = 1
local _i = 1 local _i = 1
@@ -4120,7 +4233,7 @@ function ctld.findNearestVisibleEnemy(_jtacUnit, _targetType)
local _groupName = nil local _groupName = nil
local _nearestUnit = nil local _nearestUnit = nil
local _nearestDistance = ctld.JTAC_maxDistance local _nearestDistance = _maxDistance
local _enemyGroups local _enemyGroups
@@ -4147,8 +4260,14 @@ function ctld.findNearestVisibleEnemy(_jtacUnit, _targetType)
for _x = 1, #_units do for _x = 1, #_units do
--check to see if a JTAC has already targeted this unit --check to see if a JTAC has already targeted this unit only if a distance
local _targeted = ctld.alreadyTarget(_jtacUnit, _units[_x]) --wasnt passed in
local _targeted = false
if not _distance then
_targeted = ctld.alreadyTarget(_jtacUnit, _units[_x])
end
local _allowedTarget = true local _allowedTarget = true
if _targetType == "vehicle" then if _targetType == "vehicle" then
@@ -4166,7 +4285,7 @@ function ctld.findNearestVisibleEnemy(_jtacUnit, _targetType)
_tempPoint = _units[_x]:getPoint() _tempPoint = _units[_x]:getPoint()
_tempDist = ctld.getDistance(_tempPoint, _jtacPoint) _tempDist = ctld.getDistance(_tempPoint, _jtacPoint)
if _tempDist < ctld.JTAC_maxDistance and _tempDist < _nearestDistance then if _tempDist < _maxDistance and _tempDist < _nearestDistance then
local _offsetEnemyPos = { x = _tempPoint.x, y = _tempPoint.y + 2.0, z = _tempPoint.z } local _offsetEnemyPos = { x = _tempPoint.x, y = _tempPoint.y + 2.0, z = _tempPoint.z }
local _offsetJTACPos = { x = _jtacPoint.x, y = _jtacPoint.y + 2.0, z = _jtacPoint.z } local _offsetJTACPos = { x = _jtacPoint.x, y = _jtacPoint.y + 2.0, z = _jtacPoint.z }
@@ -4574,7 +4693,7 @@ ctld.droppedFOBCratesBLUE = {}
ctld.builtFOBS = {} -- stores fully built fobs ctld.builtFOBS = {} -- stores fully built fobs
ctld.completeHawkSystems = {} -- stores complete spawned groups from multiple crates ctld.completeAASystems = {} -- stores complete spawned groups from multiple crates
ctld.fobBeacons = {} -- stores FOB radio beacon details, refreshed every 60 seconds ctld.fobBeacons = {} -- stores FOB radio beacon details, refreshed every 60 seconds

BIN
Pickup-Dropoff-Demo.miz Normal file

Binary file not shown.

Binary file not shown.