From 4ede8063f53fc7bacbd0da8c3bac381893a7f2ae Mon Sep 17 00:00:00 2001 From: atcz <86995996+atcz@users.noreply.github.com> Date: Sun, 17 Nov 2024 08:50:41 -0800 Subject: [PATCH 1/5] Cleaned up extraneous spaces and some formatting --- CTLD.lua | 272 +++++++++++++++++++++++++++---------------------------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index 568be17..e5d88d3 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -94,7 +94,7 @@ ctld.troopPickupAtFOB = true -- if true, troops can also be picked up at a creat ctld.buildTimeFOB = 120 --time in seconds for the FOB to be built - ctld.crateWaitTime = 40 -- time in seconds to wait before you can spawn another crate +ctld.crateWaitTime = 40 -- time in seconds to wait before you can spawn another crate ctld.forceCrateToBeMoved = true -- a crate must be picked up at least once and moved before it can be unpacked. Helps to reduce crate spam @@ -484,15 +484,15 @@ ctld.vehicleTransportEnabled = { "Hercules", } - -- ************** Units able to use DCS dynamic cargo system ****************** - -- DCS (version) added the ability to load and unload cargo from aircraft. - -- Units listed here will spawn a cargo static that can be loaded with the standard DCS cargo system - -- We will also use this to make modifications to the menu and other checks and messages - ctld.dynamicCargoUnits = { - "CH-47Fbl1", - } - - +-- ************** Units able to use DCS dynamic cargo system ****************** +-- DCS (version) added the ability to load and unload cargo from aircraft. +-- Units listed here will spawn a cargo static that can be loaded with the standard DCS cargo system +-- We will also use this to make modifications to the menu and other checks and messages +ctld.dynamicCargoUnits = { + "CH-47Fbl1", +} + + -- ************** Maximum Units SETUP for UNITS ****************** -- Put the name of the Unit you want to limit group sizes too @@ -692,113 +692,113 @@ ctld.loadableGroups = { -- Weights must be unique as we use the weight to change the cargo to the correct unit -- when we unpack -- - ctld.spawnableCrates = { - -- name of the sub menu on F10 for spawning crates - ["Combat Vehicles"] = { - --crates you can spawn - -- weight in KG - -- Desc is the description on the F10 MENU - -- unit is the model name of the unit to spawn - -- cratesRequired - if set requires that many crates of the same type within 100m of each other in order build the unit - -- side is optional but 2 is BLUE and 1 is RED +ctld.spawnableCrates = { + -- name of the sub menu on F10 for spawning crates + ["Combat Vehicles"] = { + --crates you can spawn + -- weight in KG + -- Desc is the description on the F10 MENU + -- unit is the model name of the unit to spawn + -- cratesRequired - if set requires that many crates of the same type within 100m of each other in order build the unit + -- side is optional but 2 is BLUE and 1 is RED - -- Some descriptions are filtered to determine if JTAC or not! + -- Some descriptions are filtered to determine if JTAC or not! - --- BLUE - { weight = 1000, desc = "Humvee - MG", unit = "M1043 HMMWV Armament", side = 2 }, --careful with the names as the script matches the desc to JTAC types - { weight = 1001, desc = "Humvee - TOW", unit = "M1045 HMMWV TOW", side = 2, cratesRequired = 2 }, - { weight = 1002, desc = "Light Tank - MRAP", unit="MaxxPro_MRAP", side = 2, cratesRequired = 2 }, - { weight = 1003, desc = "Med Tank - LAV-25", unit="LAV-25", side = 2, cratesRequired = 3 }, - { weight = 1004, desc = "Heavy Tank - Abrams", unit="M1A2C_SEP_V3", side = 2, cratesRequired = 4 }, + --- BLUE + { weight = 1000, desc = "Humvee - MG", unit = "M1043 HMMWV Armament", side = 2 }, --careful with the names as the script matches the desc to JTAC types + { weight = 1001, desc = "Humvee - TOW", unit = "M1045 HMMWV TOW", side = 2, cratesRequired = 2 }, + { weight = 1002, desc = "Light Tank - MRAP", unit="MaxxPro_MRAP", side = 2, cratesRequired = 2 }, + { weight = 1003, desc = "Med Tank - LAV-25", unit="LAV-25", side = 2, cratesRequired = 3 }, + { weight = 1004, desc = "Heavy Tank - Abrams", unit="M1A2C_SEP_V3", side = 2, cratesRequired = 4 }, + + --- RED + { weight = 1005, desc = "BTR-D", unit = "BTR_D", side = 1 }, + { weight = 1006, desc = "BRDM-2", unit = "BRDM-2", side = 1 }, + -- need more redfor! + }, + ["Support"] = { + --- BLUE + { weight = 1007, desc = "Hummer - JTAC", unit = "Hummer", side = 2, cratesRequired = 2 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled + { weight = 1008, desc = "M-818 Ammo Truck", unit = "M 818", side = 2, cratesRequired = 2 }, --- RED - { weight = 1005, desc = "BTR-D", unit = "BTR_D", side = 1 }, - { weight = 1006, desc = "BRDM-2", unit = "BRDM-2", side = 1 }, - -- need more redfor! - }, - ["Support"] = { - --- BLUE - { weight = 1007, desc = "Hummer - JTAC", unit = "Hummer", side = 2, cratesRequired = 2 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled - { weight = 1008, desc = "M-818 Ammo Truck", unit = "M 818", side = 2, cratesRequired = 2 }, + { weight = 1009, desc = "SKP-11 - JTAC", unit = "SKP-11", side = 1 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled + { weight = 1010, desc = "Ural-375 Ammo Truck", unit = "Ural-375", side = 1, cratesRequired = 2 }, - --- RED - { weight = 1009, desc = "SKP-11 - JTAC", unit = "SKP-11", side = 1 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled - { weight = 1010, desc = "Ural-375 Ammo Truck", unit = "Ural-375", side = 1, cratesRequired = 2 }, + --- Both + { weight = 1011, desc = "EWR Radar", unit="FPS-117", cratesRequired = 3 }, + { weight = 1012, desc = "FOB Crate - Small", unit = "FOB-SMALL" }, -- Builds a FOB! - requires 3 * ctld.cratesRequiredForFOB - --- Both - { weight = 1011, desc = "EWR Radar", unit="FPS-117", cratesRequired = 3 }, - { weight = 1012, desc = "FOB Crate - Small", unit = "FOB-SMALL" }, -- Builds a FOB! - requires 3 * ctld.cratesRequiredForFOB + }, + ["Artillery"] = { + --- BLUE + { weight = 1013, desc = "MLRS", unit = "MLRS", side=2, cratesRequired = 3 }, + { weight = 1014, desc = "SpGH DANA", unit = "SpGH_Dana", side=2, cratesRequired = 3 }, + { weight = 1015, desc = "T155 Firtina", unit = "T155_Firtina", side=2, cratesRequired = 3 }, + { weight = 1016, desc = "Howitzer", unit = "M-109", side=2, cratesRequired = 3 }, - }, - ["Artillery"] = { - --- BLUE - { weight = 1013, desc = "MLRS", unit = "MLRS", side=2, cratesRequired = 3 }, - { weight = 1014, desc = "SpGH DANA", unit = "SpGH_Dana", side=2, cratesRequired = 3 }, - { weight = 1015, desc = "T155 Firtina", unit = "T155_Firtina", side=2, cratesRequired = 3 }, - { weight = 1016, desc = "Howitzer", unit = "M-109", side=2, cratesRequired = 3 }, + --- RED + { weight = 1017, desc = "SPH 2S19 Msta", unit = "SAU Msta", side = 1, cratesRequired = 3 }, - --- RED - { weight = 1017, desc = "SPH 2S19 Msta", unit = "SAU Msta", side = 1, cratesRequired = 3 }, + }, + ["SAM short range"] = { + --- BLUE + { weight = 1018, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 3 }, - }, - ["SAM short range"] = { - --- BLUE - { weight = 1018, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 3 }, + --- RED + { weight = 1019, desc = "Strela-1 9P31", unit = "Strela-1 9P31", side = 1, cratesRequired = 3 }, - --- RED - { weight = 1019, desc = "Strela-1 9P31", unit = "Strela-1 9P31", side = 1, cratesRequired = 3 }, + }, + ["SAM mid range"] = { + --- BLUE + -- HAWK System + { weight = 1020, desc = "HAWK Launcher", unit = "Hawk ln", side = 2}, + { weight = 1021, desc = "HAWK Search Radar", unit = "Hawk sr", side = 2 }, + { weight = 1022, desc = "HAWK Track Radar", unit = "Hawk tr", side = 2 }, + { weight = 1023, desc = "HAWK PCP", unit = "Hawk pcp" , side = 2 }, + { weight = 1024, desc = "HAWK CWAR", unit = "Hawk cwar" , side = 2 }, + { weight = 1025, desc = "HAWK Repair", unit = "HAWK Repair" , side = 2 }, + -- End of HAWK - }, - ["SAM mid range"] = { - --- BLUE - -- HAWK System - { weight = 1020, desc = "HAWK Launcher", unit = "Hawk ln", side = 2}, - { weight = 1021, desc = "HAWK Search Radar", unit = "Hawk sr", side = 2 }, - { weight = 1022, desc = "HAWK Track Radar", unit = "Hawk tr", side = 2 }, - { weight = 1023, desc = "HAWK PCP", unit = "Hawk pcp" , side = 2 }, - { weight = 1024, desc = "HAWK CWAR", unit = "Hawk cwar" , side = 2 }, - { weight = 1025, desc = "HAWK Repair", unit = "HAWK Repair" , side = 2 }, - -- End of HAWK + --- RED + -- KUB SYSTEM + { weight = 1026, desc = "KUB Launcher", unit = "Kub 2P25 ln", side = 1}, + { weight = 1027, desc = "KUB Radar", unit = "Kub 1S91 str", side = 1 }, + { weight = 1028, desc = "KUB Repair", unit = "KUB Repair", side = 1}, + -- End of KUB - --- RED - -- KUB SYSTEM - { weight = 1026, desc = "KUB Launcher", unit = "Kub 2P25 ln", side = 1}, - { weight = 1027, desc = "KUB Radar", unit = "Kub 1S91 str", side = 1 }, - { weight = 1028, desc = "KUB Repair", unit = "KUB Repair", side = 1}, - -- End of KUB - - }, - ["SAM long range"] = { - --- BLUE - -- Patriot System - { weight = 1029, desc = "Patriot Launcher", unit = "Patriot ln", side = 2 }, - { weight = 1030, desc = "Patriot Radar", unit = "Patriot str" , side = 2 }, - { weight = 1031, desc = "Patriot ECS", unit = "Patriot ECS", side = 2 }, - { weight = 1032, desc = "Patriot AMG (optional)", unit = "Patriot AMG" , side = 2 }, - { weight = 1033, desc = "Patriot Repair", unit = "Patriot Repair" , side = 2 }, - -- End of Patriot - }, + }, + ["SAM long range"] = { + --- BLUE + -- Patriot System + { weight = 1029, desc = "Patriot Launcher", unit = "Patriot ln", side = 2 }, + { weight = 1030, desc = "Patriot Radar", unit = "Patriot str" , side = 2 }, + { weight = 1031, desc = "Patriot ECS", unit = "Patriot ECS", side = 2 }, + { weight = 1032, desc = "Patriot AMG (optional)", unit = "Patriot AMG" , side = 2 }, + { weight = 1033, desc = "Patriot Repair", unit = "Patriot Repair" , side = 2 }, + -- End of Patriot + }, } - ctld.spawnableCratesModels = { - ["load"] = { - ["category"] = "Fortifications", - ["type"] = "Cargo04", - ["canCargo"] = false, - }, - ["sling"] = { - ["category"] = "Cargos", - ["shape_name"] = "bw_container_cargo", - ["type"] = "container_cargo", - ["canCargo"] = true - }, - ["dynamic"] = { +ctld.spawnableCratesModels = { + ["load"] = { + ["category"] = "Fortifications", + ["type"] = "Cargo04", + ["canCargo"] = false, + }, + ["sling"] = { ["category"] = "Cargos", - ["type"] = "ammo_cargo", - ["canCargo"] = true - } - } - + ["shape_name"] = "bw_container_cargo", + ["type"] = "container_cargo", + ["canCargo"] = true + }, + ["dynamic"] = { + ["category"] = "Cargos", + ["type"] = "ammo_cargo", + ["canCargo"] = true + } +} + --[[ Placeholder for different type of cargo containers. Let's say pipes and trunks, fuel for FOB building ["shape_name"] = "ab-212_cargo", @@ -1776,7 +1776,7 @@ function ctld.getTransportUnit(_unitName) return nil end - function ctld.spawnCrateStatic(_country, _unitId, _point, _name, _weight, _side,_hdg, _model_type) +function ctld.spawnCrateStatic(_country, _unitId, _point, _name, _weight, _side, _hdg,_model_type) local _crate local _spawnedCrate @@ -1812,13 +1812,13 @@ end _spawnedCrate = Unit.getByName(_name) else - if _model_type ~= nil then - _crate = mist.utils.deepCopy(ctld.spawnableCratesModels[_model_type]) - elseif ctld.slingLoad then - _crate = mist.utils.deepCopy(ctld.spawnableCratesModels["sling"]) - else - _crate = mist.utils.deepCopy(ctld.spawnableCratesModels["load"]) - end + if _model_type ~= nil then + _crate = mist.utils.deepCopy(ctld.spawnableCratesModels[_model_type]) + elseif ctld.slingLoad then + _crate = mist.utils.deepCopy(ctld.spawnableCratesModels["sling"]) + else + _crate = mist.utils.deepCopy(ctld.spawnableCratesModels["load"]) + end _crate["y"] = _point.z _crate["x"] = _point.x @@ -2237,9 +2237,9 @@ function ctld.generateTroopTypes(_side, _countOrTemplate, _country) if _countOrTemplate.inf then if _side == 2 then - _troops = ctld.insertIntoTroopsArray("Soldier M4 GRG",_countOrTemplate.inf,_troops) + _troops = ctld.insertIntoTroopsArray("Soldier M4 GRG",_countOrTemplate.inf,_troops) else - _troops = ctld.insertIntoTroopsArray("Infantry AK",_countOrTemplate.inf,_troops) + _troops = ctld.insertIntoTroopsArray("Infantry AK",_countOrTemplate.inf,_troops) end _weight = _weight + getSoldiersWeight(_countOrTemplate.inf, ctld.RIFLE_WEIGHT) end @@ -2265,9 +2265,9 @@ function ctld.generateTroopTypes(_side, _countOrTemplate, _country) if _countOrTemplate.jtac then if _side == 2 then - _troops = ctld.insertIntoTroopsArray("Soldier M4 GRG",_countOrTemplate.jtac,_troops, "JTAC") + _troops = ctld.insertIntoTroopsArray("Soldier M4 GRG",_countOrTemplate.jtac,_troops, "JTAC") else - _troops = ctld.insertIntoTroopsArray("Infantry AK",_countOrTemplate.jtac,_troops, "JTAC") + _troops = ctld.insertIntoTroopsArray("Infantry AK",_countOrTemplate.jtac,_troops, "JTAC") end _hasJTAC = true _weight = _weight + getSoldiersWeight(_countOrTemplate.jtac, ctld.JTAC_WEIGHT + ctld.RIFLE_WEIGHT) @@ -2276,7 +2276,7 @@ function ctld.generateTroopTypes(_side, _countOrTemplate, _country) else for _i = 1, _countOrTemplate do - local _unitType = "Infantry AK" + local _unitType = "Infantry AK" if _side == 2 then if _i <=2 then @@ -2289,7 +2289,7 @@ function ctld.generateTroopTypes(_side, _countOrTemplate, _country) _unitType = "Soldier stinger" _weight = _weight + getSoldiersWeight(1, ctld.MANPAD_WEIGHT) else - _unitType = "Soldier M4 GRG" + _unitType = "Soldier M4 GRG" _weight = _weight + getSoldiersWeight(1, ctld.RIFLE_WEIGHT) end else @@ -2866,7 +2866,7 @@ function ctld.checkHoverStatus() ctld.inTransitSlingLoadCrates[_name] = ctld.inTransitSlingLoadCrates[_name] or {} --only check transports that are hovering and not planes - if _transUnit ~= nil and #ctld.inTransitSlingLoadCrates[_name] < _cargoCapacity and ctld.inAir(_transUnit) and ctld.unitCanCarryVehicles(_transUnit) == false and not ctld.unitDynamicCargoCapable(_transUnit) then + if _transUnit ~= nil and #ctld.inTransitSlingLoadCrates[_name] < _cargoCapacity and ctld.inAir(_transUnit) and ctld.unitCanCarryVehicles(_transUnit) == false and not ctld.unitDynamicCargoCapable(_transUnit) then local _crates = ctld.getCratesAndDistance(_transUnit) @@ -3281,7 +3281,7 @@ function ctld.getClosestCrate(_heli, _crates, _type) if (_crate.details.unit == _type or _type == nil) then _distance = _crate.dist - if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) and _distance > _minimumDistance then + if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) and _distance > _minimumDistance then _shortestDistance = _distance _closetCrate = _crate end @@ -3375,7 +3375,7 @@ function ctld.unpackCrates(_arguments) elseif _crate ~= nil and _crate.dist < 200 then - if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] and not ctld.unitDynamicCargoCapable(_heli) then + if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] and not ctld.unitDynamicCargoCapable(_heli) then ctld.displayMessageToGroup(_heli,"Sorry you must move this crate before you unpack it!", 20) return end @@ -3442,7 +3442,7 @@ function ctld.unpackCrates(_arguments) else - ctld.displayMessageToGroup(_heli, "No friendly crates close enough to unpack, or crate too close to aircraft.", 20) + ctld.displayMessageToGroup(_heli, "No friendly crates close enough to unpack, or crate too close to aircraft.", 20) end end end, _arguments) @@ -5047,7 +5047,7 @@ function ctld.unitCanCarryVehicles(_unit) for _, _name in ipairs(ctld.vehicleTransportEnabled) do local _nameLower = string.lower(_name) - if string.find(_type, _nameLower, 1, true) then + if string.find(_type, _nameLower, 1, true) then return true end end @@ -5055,7 +5055,7 @@ function ctld.unitCanCarryVehicles(_unit) return false end - function ctld.unitDynamicCargoCapable(_unit) +function ctld.unitDynamicCargoCapable(_unit) local cache = {} local _type = string.lower(_unit:getTypeName()) local result = cache[_type] @@ -5073,8 +5073,8 @@ end ctld.logDebug("result=[%s]", ctld.p(result)) end return result - end - +end + function ctld.isJTACUnitType(_type) _type = string.lower(_type) @@ -6688,21 +6688,21 @@ function ctld.setJTAC9Line(_args) end ctld.jtacSpecialOptions._9Line.setter = ctld.setJTAC9Line - function ctld.setGrpROE(_grp, _ROE) - if _ROE == nil then - _ROE = AI.Option.Ground.val.ROE.OPEN_FIRE - end +function ctld.setGrpROE(_grp, _ROE) + if _ROE == nil then + _ROE = AI.Option.Ground.val.ROE.OPEN_FIRE + end - _grp = ctld.getAliveGroup(_grp) + _grp = ctld.getAliveGroup(_grp) if _grp ~= nil then - 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.ROE, _ROE) - _controller:setTask(_grp) - end - end - + 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.ROE, _ROE) + _controller:setTask(_grp) + end +end + function ctld.isInfantry(_unit) local _typeName = _unit:getTypeName() From a1f7663a4a0ccf5bed4367dbc1a3017c547a86bb Mon Sep 17 00:00:00 2001 From: atcz <86995996+atcz@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:01:40 -0800 Subject: [PATCH 2/5] Fixed spacing in addTransportF10MenuOptions --- CTLD.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index e5d88d3..2dab351 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -5237,22 +5237,22 @@ function ctld.addTransportF10MenuOptions(_unitName) local itemNb = 0 local menuPath = _troopCommandsPath for _,_loadGroup in pairs(ctld.loadableGroups) do - if not _loadGroup.side or _loadGroup.side == _unit:getCoalition() then + if not _loadGroup.side or _loadGroup.side == _unit:getCoalition() then - -- check size & unit - if _transportLimit >= _loadGroup.total then - -- add the menu item - itemNb = itemNb + 1 - if itemNb > 8 then -- page limit reached (first item is "unload") - menuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", menuPath) - itemNb = 1 + -- check size & unit + if _transportLimit >= _loadGroup.total then + -- add the menu item + itemNb = itemNb + 1 + if itemNb > 8 then -- page limit reached (first item is "unload") + menuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", menuPath) + itemNb = 1 + end + missionCommands.addCommandForGroup(_groupId, "Load ".._loadGroup.name, menuPath, ctld.loadTroopsFromZone, { _unitName, true,_loadGroup,false }) end - missionCommands.addCommandForGroup(_groupId, "Load ".._loadGroup.name, menuPath, ctld.loadTroopsFromZone, { _unitName, true,_loadGroup,false }) end end - end - if ctld.unitCanCarryVehicles(_unit) then + if ctld.unitCanCarryVehicles(_unit) then local _vehicleCommandsPath = missionCommands.addSubMenuForGroup(_groupId, "Vehicle / FOB Transport", _rootPath) From 5b6d3c3f6c0ef749d2a528b232a435fc4c524fe3 Mon Sep 17 00:00:00 2001 From: atcz <86995996+atcz@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:36:43 -0800 Subject: [PATCH 3/5] Additions to units, several fixes - Overhauled crate number/weight system to make it easier to add new units - Added short range SAM for red and blue - Added NASAMS and BUK SAM mid range - Added S-300 SAM long range - Fixed Hawk component count for rearming - Use true heading for unpackAASystem - Only create sub-menus if there are more than 10 items. --- CTLD.lua | 195 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 125 insertions(+), 70 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index 2dab351..bb0ed9c 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -705,78 +705,111 @@ ctld.spawnableCrates = { -- Some descriptions are filtered to determine if JTAC or not! --- BLUE - { weight = 1000, desc = "Humvee - MG", unit = "M1043 HMMWV Armament", side = 2 }, --careful with the names as the script matches the desc to JTAC types - { weight = 1001, desc = "Humvee - TOW", unit = "M1045 HMMWV TOW", side = 2, cratesRequired = 2 }, - { weight = 1002, desc = "Light Tank - MRAP", unit="MaxxPro_MRAP", side = 2, cratesRequired = 2 }, - { weight = 1003, desc = "Med Tank - LAV-25", unit="LAV-25", side = 2, cratesRequired = 3 }, - { weight = 1004, desc = "Heavy Tank - Abrams", unit="M1A2C_SEP_V3", side = 2, cratesRequired = 4 }, + { weight = 1000.01, desc = "Humvee - MG", unit = "M1043 HMMWV Armament", side = 2 }, --careful with the names as the script matches the desc to JTAC types + { weight = 1000.02, desc = "Humvee - TOW", unit = "M1045 HMMWV TOW", side = 2, cratesRequired = 2 }, + { weight = 1000.03, desc = "Light Tank - MRAP", unit="MaxxPro_MRAP", side = 2, cratesRequired = 2 }, + { weight = 1000.04, desc = "Med Tank - LAV-25", unit="LAV-25", side = 2, cratesRequired = 3 }, + { weight = 1000.05, desc = "Heavy Tank - Abrams", unit="M1A2C_SEP_V3", side = 2, cratesRequired = 4 }, --- RED - { weight = 1005, desc = "BTR-D", unit = "BTR_D", side = 1 }, - { weight = 1006, desc = "BRDM-2", unit = "BRDM-2", side = 1 }, + { weight = 1000.11, desc = "BTR-D", unit = "BTR_D", side = 1 }, + { weight = 1000.12, desc = "BRDM-2", unit = "BRDM-2", side = 1 }, -- need more redfor! }, ["Support"] = { --- BLUE - { weight = 1007, desc = "Hummer - JTAC", unit = "Hummer", side = 2, cratesRequired = 2 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled - { weight = 1008, desc = "M-818 Ammo Truck", unit = "M 818", side = 2, cratesRequired = 2 }, + { weight = 1001.01, desc = "Hummer - JTAC", unit = "Hummer", side = 2, cratesRequired = 2 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled + { weight = 1001.02, desc = "M-818 Ammo Truck", unit = "M 818", side = 2, cratesRequired = 2 }, + { weight = 1001.03, desc = "M-978 Tanker", unit = "M978 HEMTT Tanker", side = 2, cratesRequired = 2 }, --- RED - { weight = 1009, desc = "SKP-11 - JTAC", unit = "SKP-11", side = 1 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled - { weight = 1010, desc = "Ural-375 Ammo Truck", unit = "Ural-375", side = 1, cratesRequired = 2 }, + { weight = 1001.11, desc = "SKP-11 - JTAC", unit = "SKP-11", side = 1 }, -- used as jtac and unarmed, not on the crate list if JTAC is disabled + { weight = 1001.12, desc = "Ural-375 Ammo Truck", unit = "Ural-375", side = 1, cratesRequired = 2 }, + { weight = 1001.13, desc = "KAMAZ Ammo Truck", unit = "KAMAZ Truck", side = 1, cratesRequired = 2 }, --- Both - { weight = 1011, desc = "EWR Radar", unit="FPS-117", cratesRequired = 3 }, - { weight = 1012, desc = "FOB Crate - Small", unit = "FOB-SMALL" }, -- Builds a FOB! - requires 3 * ctld.cratesRequiredForFOB + { weight = 1001.21, desc = "EWR Radar", unit="FPS-117", cratesRequired = 3 }, + { weight = 1001.22, desc = "FOB Crate - Small", unit = "FOB-SMALL" }, -- Builds a FOB! - requires 3 * ctld.cratesRequiredForFOB }, ["Artillery"] = { --- BLUE - { weight = 1013, desc = "MLRS", unit = "MLRS", side=2, cratesRequired = 3 }, - { weight = 1014, desc = "SpGH DANA", unit = "SpGH_Dana", side=2, cratesRequired = 3 }, - { weight = 1015, desc = "T155 Firtina", unit = "T155_Firtina", side=2, cratesRequired = 3 }, - { weight = 1016, desc = "Howitzer", unit = "M-109", side=2, cratesRequired = 3 }, + { weight = 1002.01, desc = "MLRS", unit = "MLRS", side=2, cratesRequired = 3 }, + { weight = 1002.02, desc = "SpGH DANA", unit = "SpGH_Dana", side=2, cratesRequired = 3 }, + { weight = 1002.03, desc = "T155 Firtina", unit = "T155_Firtina", side=2, cratesRequired = 3 }, + { weight = 1002.04, desc = "Howitzer", unit = "M-109", side=2, cratesRequired = 3 }, --- RED - { weight = 1017, desc = "SPH 2S19 Msta", unit = "SAU Msta", side = 1, cratesRequired = 3 }, + { weight = 1002.11, desc = "SPH 2S19 Msta", unit = "SAU Msta", side = 1, cratesRequired = 3 }, }, ["SAM short range"] = { --- BLUE - { weight = 1018, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 3 }, + { weight = 1003.01, desc = "M1097 Avenger", unit = "M1097 Avenger", side = 2, cratesRequired = 3 }, + { weight = 1003.02, desc = "M48 Chaparral", unit = "M48 Chaparral", side = 2, cratesRequired = 2 }, + { weight = 1003.03, desc = "Roland ADS", unit = "Roland ADS", side = 2, cratesRequired = 3 }, + { weight = 1003.04, desc = "Gepard AAA", unit = "Gepard", side = 2, cratesRequired = 3 }, + { weight = 1003.05, desc = "LPWS C-RAM", unit = "HEMTT_C-RAM_Phalanx", side = 2, cratesRequired = 3 }, --- RED - { weight = 1019, desc = "Strela-1 9P31", unit = "Strela-1 9P31", side = 1, cratesRequired = 3 }, - + { weight = 1003.11, desc = "9K33 Osa", unit = "Osa 9A33 ln", side = 1, cratesRequired = 3 }, + { weight = 1003.12, desc = "9P31 Strela-1", unit = "Strela-1 9P31", side = 1, cratesRequired = 3 }, + { weight = 1003.13, desc = "9K35M Strela-10", unit = "Strela-10M3", side = 1, cratesRequired = 3 }, + { weight = 1003.14, desc = "9K331 Tor", unit = "Tor 9A331", side = 1, cratesRequired = 3 }, + { weight = 1003.15, desc = "2K22 Tunguska", unit = "2S6 Tunguska", side = 1, cratesRequired = 3 }, }, ["SAM mid range"] = { --- BLUE -- HAWK System - { weight = 1020, desc = "HAWK Launcher", unit = "Hawk ln", side = 2}, - { weight = 1021, desc = "HAWK Search Radar", unit = "Hawk sr", side = 2 }, - { weight = 1022, desc = "HAWK Track Radar", unit = "Hawk tr", side = 2 }, - { weight = 1023, desc = "HAWK PCP", unit = "Hawk pcp" , side = 2 }, - { weight = 1024, desc = "HAWK CWAR", unit = "Hawk cwar" , side = 2 }, - { weight = 1025, desc = "HAWK Repair", unit = "HAWK Repair" , side = 2 }, + { weight = 1004.01, desc = "HAWK Launcher", unit = "Hawk ln", side = 2}, + { weight = 1004.02, desc = "HAWK Search Radar", unit = "Hawk sr", side = 2 }, + { weight = 1004.03, desc = "HAWK Track Radar", unit = "Hawk tr", side = 2 }, + { weight = 1004.04, desc = "HAWK PCP", unit = "Hawk pcp" , side = 2 }, + { weight = 1004.05, desc = "HAWK CWAR", unit = "Hawk cwar" , side = 2 }, + { weight = 1004.06, desc = "HAWK Repair", unit = "HAWK Repair" , side = 2 }, -- End of HAWK + + -- NASAMS Sysyem + { weight = 1004.11, desc = "NASAMS Launcher 120C", unit = "NASAMS_LN_C", side = 2}, + { weight = 1004.12, desc = "NASAMS Search/Track Radar", unit = "NASAMS_Radar_MPQ64F1", side = 2 }, + { weight = 1004.13, desc = "NASAMS Command Post", unit = "NASAMS_Command_Post", side = 2 }, + { weight = 1004.14, desc = "NASAMS Repair", unit = "NASAMS Repair", side = 2 }, + -- End of NASAMS --- RED -- KUB SYSTEM - { weight = 1026, desc = "KUB Launcher", unit = "Kub 2P25 ln", side = 1}, - { weight = 1027, desc = "KUB Radar", unit = "Kub 1S91 str", side = 1 }, - { weight = 1028, desc = "KUB Repair", unit = "KUB Repair", side = 1}, + { weight = 1004.21, desc = "KUB Launcher", unit = "Kub 2P25 ln", side = 1}, + { weight = 1004.22, desc = "KUB Radar", unit = "Kub 1S91 str", side = 1 }, + { weight = 1004.23, desc = "KUB Repair", unit = "KUB Repair", side = 1}, -- End of KUB + -- BUK System + { weight = 1004.31, desc = "BUK Launcher", unit = "SA-11 Buk LN 9A310M1", side = 1}, + { weight = 1004.32, desc = "BUK Search Radar", unit = "SA-11 Buk SR 9S18M1", side = 1}, + { weight = 1004.33, desc = "BUK CC Radar", unit = "SA-11 Buk CC 9S470M1", side = 1}, + { weight = 1004.34, desc = "BUK Repair", unit = "BUK Repair", side = 1}, + -- END of BUK }, ["SAM long range"] = { --- BLUE -- Patriot System - { weight = 1029, desc = "Patriot Launcher", unit = "Patriot ln", side = 2 }, - { weight = 1030, desc = "Patriot Radar", unit = "Patriot str" , side = 2 }, - { weight = 1031, desc = "Patriot ECS", unit = "Patriot ECS", side = 2 }, - { weight = 1032, desc = "Patriot AMG (optional)", unit = "Patriot AMG" , side = 2 }, - { weight = 1033, desc = "Patriot Repair", unit = "Patriot Repair" , side = 2 }, + { weight = 1005.01, desc = "Patriot Launcher", unit = "Patriot ln", side = 2 }, + { weight = 1005.02, desc = "Patriot Radar", unit = "Patriot str" , side = 2 }, + { weight = 1005.03, desc = "Patriot ECS", unit = "Patriot ECS", side = 2 }, + -- { weight = 1005.04, desc = "Patriot ICC", unit = "Patriot cp", side = 2 }, + -- { weight = 1005.05, desc = "Patriot EPP", unit = "Patriot EPP", side = 2 }, + { weight = 1005.06, desc = "Patriot AMG (optional)", unit = "Patriot AMG" , side = 2 }, + { weight = 1005.07, desc = "Patriot Repair", unit = "Patriot Repair" , side = 2 }, -- End of Patriot + + -- S-300 SYSTEM + { weight = 1005.11, desc = "S-300 Grumble TEL C", unit = "S-300PS 5P85C ln", side = 1 }, + { weight = 1005.12, desc = "S-300 Grumble Flap Lid-A TR", unit = "S-300PS 40B6M tr", side = 1 }, + { weight = 1005.13, desc = "S-300 Grumble Clam Shell SR", unit = "S-300PS 40B6MD sr", side = 1 }, + { weight = 1005.14, desc = "S-300 Grumble Big Bird SR", unit = "S-300PS 64H6E sr", side = 1 }, + { weight = 1005.15, desc = "S-300 Grumble C2", unit = "S-300PS 54K6 cp", side = 1 }, + { weight = 1005.16, desc = "S-300 Repair", unit = "S-300 Repair", side = 1 }, + -- End of S-300 }, } @@ -1601,7 +1634,7 @@ ctld.AASystemTemplate = { { name = "HAWK AA System", - count = 4, + count = 5, parts = { {name = "Hawk ln", desc = "HAWK Launcher", launcher = true}, {name = "Hawk tr", desc = "HAWK Track Radar", amount = 2}, @@ -1618,6 +1651,8 @@ ctld.AASystemTemplate = { {name = "Patriot ln", desc = "Patriot Launcher", launcher = true, amount = 8}, {name = "Patriot ECS", desc = "Patriot Control Unit"}, {name = "Patriot str", desc = "Patriot Search and Track Radar", amount = 2}, + --{name = "Patriot cp", desc = "Patriot ICC", NoCrate = true}, + --{name = "Patriot EPP", desc = "Patriot EPP", NoCrate = true}, {name = "Patriot AMG", desc = "Patriot AMG DL relay", NoCrate = true}, }, repair = "Patriot Repair", @@ -1641,6 +1676,19 @@ ctld.AASystemTemplate = { }, repair = "KUB Repair", }, + { + name = "S-300 AA System", + count = 6, + parts = { + { desc = "S-300 Grumble TEL C", name = "S-300PS 5P85C ln", launcher = true, amount = 1 }, + { desc = "S-300 Grumble TEL D", name = "S-300PS 5P85D ln", NoCrate = true, amount = 2 }, + { desc = "S-300 Grumble Flap Lid-A TR", name = "S-300PS 40B6M tr"}, + { desc = "S-300 Grumble Clam Shell SR", name = "S-300PS 40B6MD sr"}, + { desc = "S-300 Grumble Big Bird SR", name = "S-300PS 64H6E sr"}, + { desc = "S-300 Grumble C2", name = "S-300PS 54K6 cp"}, + }, + repair = "S-300 Repair", + }, } @@ -1987,7 +2035,7 @@ function ctld.spawnCrate(_arguments) -- add to move table ctld.crateMove[_name] = _name - ctld.displayMessageToGroup(_heli, string.format("A %s crate weighing %s kg has been brought out and is at your %s o'clock ", _crateType.desc, _crateType.weight, _position), 20) + ctld.displayMessageToGroup(_heli, string.format("A %s crate weighing %.0f kg has been brought out and is at your %s o'clock ", _crateType.desc, _crateType.weight, _position), 20) else env.info("Couldn't find crate item to spawn") @@ -2816,7 +2864,7 @@ function ctld.getWeightOfCargo(unitName) if _inTransit then local _troops = _inTransit.troops if _troops and _troops.units then - _description = _description .. string.format("%s troops onboard (%s kg)\n", #_troops.units, _troops.weight) + _description = _description .. string.format("%s troops onboard (%.0f kg)\n", #_troops.units, _troops.weight) _weight = _weight + _troops.weight end local _vehicles = _inTransit.vehicles @@ -2824,7 +2872,7 @@ function ctld.getWeightOfCargo(unitName) for _, _unit in pairs(_vehicles.units) do _weight = _weight + _unit.weight end - _description = _description .. string.format("%s vehicles onboard (%s kg)\n", #_vehicles.units, _weight) + _description = _description .. string.format("%s vehicles onboard (%.0f kg)\n", #_vehicles.units, _weight) end end end @@ -2832,7 +2880,7 @@ function ctld.getWeightOfCargo(unitName) -- add FOB crates weight if ctld.inTransitFOBCrates[unitName] then _weight = _weight + FOB_CRATE_WEIGHT - _description = _description .. string.format("1 FOB Crate oboard (%s kg)\n", FOB_CRATE_WEIGHT) + _description = _description .. string.format("1 FOB Crate oboard (%.0f kg)\n", FOB_CRATE_WEIGHT) end -- add simulated slingload crates weight @@ -2840,11 +2888,11 @@ function ctld.getWeightOfCargo(unitName) local _crate = ctld.inTransitSlingLoadCrates[unitName][i] if _crate and _crate.simulatedSlingload then _weight = _weight + _crate.weight - _description = _description .. string.format("%s crate onboard (%s kg)\n", _crate.desc, _crate.weight) + _description = _description .. string.format("%s crate onboard (%.0f kg)\n", _crate.desc, _crate.weight) end end if _description ~= "" then - _description = _description .. string.format("Total weight of cargo : %s kg\n", _weight) + _description = _description .. string.format("Total weight of cargo : %.0f kg\n", _weight) else _description = "No cargo." end @@ -4123,7 +4171,7 @@ function ctld.unpackAASystem(_heli, _nearestCrate, _nearbyCrates,_aaSystemTempla local crateUnit = _nearbyCrate.crateUnit table.insert(_systemParts[_name].crates, _nearbyCrate) table.insert(_cratePositions[_name], crateUnit:getPoint()) - table.insert(_crateHdg[_name], mist.getHeading(crateUnit)) + table.insert(_crateHdg[_name], mist.getHeading(crateUnit, true)) end end end @@ -4150,7 +4198,7 @@ function ctld.unpackAASystem(_heli, _nearestCrate, _nearbyCrates,_aaSystemTempla end end - local spawnDistance = 50 -- circle diameter to spawn units in a circle and randomize position relative to the crate location + local spawnDistance = 50 -- circle radius to spawn units in a circle and randomize position relative to the crate location local arcRad = math.pi * 2 local _txt = "" @@ -4436,7 +4484,7 @@ function ctld.unpackMultiCrate(_heli, _nearestCrate, _nearbyCrates) local _spawnedGroup = ctld.spawnCrateGroup(_heli, { _point }, { _nearestCrate.details.unit }, { _crateHdg }) - ctld.setGrpROE(_spawnedGroup) + --ctld.setGrpROE(_spawnedGroup) ctld.processCallback({unit = _heli, crate = _nearestCrate , spawnedGroup = _spawnedGroup, action = "unpack"}) local _txt = string.format("%s successfully deployed %s to the field using %d crates", ctld.getPlayerNameOrType(_heli), _nearestCrate.details.desc, #_nearbyMultiCrates) @@ -5235,22 +5283,25 @@ function ctld.addTransportF10MenuOptions(_unitName) -- local _loadPath = missionCommands.addSubMenuForGroup(_groupId, "Load From Zone", _troopCommandsPath) local _transportLimit = ctld.getTransportLimit(_unitTypename) local itemNb = 0 + local menuEntries = {} local menuPath = _troopCommandsPath for _,_loadGroup in pairs(ctld.loadableGroups) do if not _loadGroup.side or _loadGroup.side == _unit:getCoalition() then - -- check size & unit if _transportLimit >= _loadGroup.total then - -- add the menu item - itemNb = itemNb + 1 - if itemNb > 8 then -- page limit reached (first item is "unload") - menuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", menuPath) - itemNb = 1 - end - missionCommands.addCommandForGroup(_groupId, "Load ".._loadGroup.name, menuPath, ctld.loadTroopsFromZone, { _unitName, true,_loadGroup,false }) + table.insert(menuEntries, { text = "Load ".._loadGroup.name, group = _loadGroup }) end end end + for _, _menu in ipairs(menuEntries) do + -- add the menu item + itemNb = itemNb + 1 + if itemNb > 8 and #menuEntries > 9 then -- page limit reached (first item is "unload") + menuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", menuPath) + itemNb = 1 + end + missionCommands.addCommandForGroup(_groupId, _menu.text, menuPath, ctld.loadTroopsFromZone, { _unitName, true,_menu.group,false }) + end if ctld.unitCanCarryVehicles(_unit) then @@ -5272,20 +5323,20 @@ function ctld.addTransportF10MenuOptions(_unitName) if ctld.enableCrates and _unitActions.crates then if ctld.unitCanCarryVehicles(_unit) == false then - -- sort the crate categories alphabetically - local crateCategories = {} - for category, _ in pairs(ctld.spawnableCrates) do - table.insert(crateCategories, category) - end - table.sort(crateCategories) - ctld.logTrace("crateCategories = [%s]", ctld.p(crateCategories)) + -- sort the crate categories alphabetically + local crateCategories = {} + for category, _ in pairs(ctld.spawnableCrates) do + table.insert(crateCategories, category) + end + table.sort(crateCategories) + ctld.logTrace("crateCategories = [%s]", ctld.p(crateCategories)) -- add menu for spawning crates local itemNbMain = 0 local _cratesMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Vehicle / FOB Crates", _rootPath) - for i = 1, #crateCategories do - local _subMenuName = crateCategories[i] - local _crates = ctld.spawnableCrates[_subMenuName] + for i = 1, #crateCategories do + local _subMenuName = crateCategories[i] + local _crates = ctld.spawnableCrates[_subMenuName] -- add the submenu item itemNbMain = itemNbMain + 1 @@ -5294,6 +5345,7 @@ function ctld.addTransportF10MenuOptions(_unitName) itemNbMain = 1 end local itemNbSubmenu = 0 + local menuEntries = {} local _subMenuPath = missionCommands.addSubMenuForGroup(_groupId, _subMenuName, _cratesMenuPath) for _, _crate in pairs(_crates) do if ctld.isJTACUnitType(_crate.unit) == false @@ -5304,16 +5356,19 @@ function ctld.addTransportF10MenuOptions(_unitName) if _crate.cratesRequired ~= nil and _crate.cratesRequired > 1 then _crateRadioMsg = _crateRadioMsg.." (".._crate.cratesRequired..")" end - -- add the submenu item - itemNbSubmenu = itemNbSubmenu + 1 - if itemNbSubmenu > 9 then -- page limit reached - _subMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", _subMenuPath) - itemNbSubmenu = 1 - end - missionCommands.addCommandForGroup(_groupId,_crateRadioMsg, _subMenuPath, ctld.spawnCrate, { _unitName, _crate.weight }) + table.insert(menuEntries, { text = _crateRadioMsg, crate = _crate }) end end end + for _, _menu in ipairs(menuEntries) do + -- add the submenu item + itemNbSubmenu = itemNbSubmenu + 1 + if itemNbSubmenu > 9 and #menuEntries > 10 then -- page limit reached + _subMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", _subMenuPath) + itemNbSubmenu = 1 + end + missionCommands.addCommandForGroup(_groupId, _menu.text, _subMenuPath, ctld.spawnCrate, { _unitName, _menu.crate.weight }) + end end end end From 62e4566cfd16565073e624b3c2ca755827d71974 Mon Sep 17 00:00:00 2001 From: atcz <86995996+atcz@users.noreply.github.com> Date: Mon, 18 Nov 2024 07:41:31 -0800 Subject: [PATCH 4/5] Add "Next page" when exceeding the limit for any sub --- CTLD.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index bb0ed9c..4370cea 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -5293,10 +5293,10 @@ function ctld.addTransportF10MenuOptions(_unitName) end end end - for _, _menu in ipairs(menuEntries) do + for _i, _menu in ipairs(menuEntries) do -- add the menu item itemNb = itemNb + 1 - if itemNb > 8 and #menuEntries > 9 then -- page limit reached (first item is "unload") + if itemNb == 9 and _i < #menuEntries then -- page limit reached (first item is "unload") menuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", menuPath) itemNb = 1 end @@ -5334,13 +5334,13 @@ function ctld.addTransportF10MenuOptions(_unitName) -- add menu for spawning crates local itemNbMain = 0 local _cratesMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Vehicle / FOB Crates", _rootPath) - for i = 1, #crateCategories do - local _subMenuName = crateCategories[i] + for _i, _category in ipairs(crateCategories) do + local _subMenuName = _category local _crates = ctld.spawnableCrates[_subMenuName] -- add the submenu item itemNbMain = itemNbMain + 1 - if itemNbMain > 9 then -- page limit reached + if itemNbMain == 10 and _i < #crateCategories then -- page limit reached _cratesMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", _cratesMenuPath) itemNbMain = 1 end @@ -5360,10 +5360,10 @@ function ctld.addTransportF10MenuOptions(_unitName) end end end - for _, _menu in ipairs(menuEntries) do + for _i, _menu in ipairs(menuEntries) do -- add the submenu item itemNbSubmenu = itemNbSubmenu + 1 - if itemNbSubmenu > 9 and #menuEntries > 10 then -- page limit reached + if itemNbSubmenu == 10 and _i < #menuEntries then -- page limit reached _subMenuPath = missionCommands.addSubMenuForGroup(_groupId, "Next page", _subMenuPath) itemNbSubmenu = 1 end From db40326c112ecb5461a9bc696ec0335e0681c634 Mon Sep 17 00:00:00 2001 From: atcz <86995996+atcz@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:51:29 -0800 Subject: [PATCH 5/5] Add NASAMS to AASystemTemplate --- CTLD.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CTLD.lua b/CTLD.lua index 4370cea..c01180f 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -1658,6 +1658,16 @@ ctld.AASystemTemplate = { repair = "Patriot Repair", }, { + name = "NASAMS AA System", + count = 3, + parts = { + {name = "NASAMS_LN_C", desc = "NASAMS Launcher 120C", launcher = true}, + {name = "NASAMS_Radar_MPQ64F1", desc = "NASAMS Search/Track Radar"}, + {name = "NASAMS_Command_Post", desc = "NASAMS Command Post"}, + }, + repair = "NASAMS Repair", + }, + { name = "BUK AA System", count = 3, parts = {