diff --git a/Script/DCS extensions/Zones.lua b/Script/DCS extensions/Zones.lua index a0d01e8..5a2a79f 100644 --- a/Script/DCS extensions/Zones.lua +++ b/Script/DCS extensions/Zones.lua @@ -2,6 +2,7 @@ -- DCSEX.ZONES - FUNCTIONS RELATED TO MAP TRIGGER ZONES -- ==================================================================================== -- DCSEx.zones.drawOnMap(zoneTable, lineColor, fillColor, lineType, drawName, readOnly) +-- DCSEx.zones.getAirbases(zone, coalition) -- DCSEx.zones.getAll() -- DCSEx.zones.getByName(name) -- DCSEx.zones.getCenter(zoneTable) @@ -72,6 +73,30 @@ function DCSEx.zones.drawOnMap(zoneTable, lineColor, fillColor, lineType, drawNa return markerID end +------------------------------------- +-- Returns all airbases in the zone +------------------------------------- +-- @param zoneTable Table of the zone in which to search +-- @param coalition Coalition (from the coalition.side enum) the airbase must belong to. Default is nil, which means "all coalitions" +-- @return Table of airbases +------------------------------------- +function DCSEx.zones.getAirbases(zoneTable, coalition) + coalition = coalition or nil + + local coalitions = { coalition.side.RED, coalition.side.BLUE } + if coalition then coalitions = { coalition } end + + local validAirbases = {} + for _,side in ipairs(coalitions) do + for _,ab in ipairs(coalition.getAirbases(side)) do + if DCSEx.zones.isPointInside(zoneTable, ab:getPoint()) then + table.insert(validAirbases, ab) + end + end + end + return validAirbases +end + ------------------------------------- -- Returns all trigger zones ------------------------------------- diff --git a/Script/The Universal Mission/ObjectivesMaker.lua b/Script/The Universal Mission/ObjectivesMaker.lua index 7fb597d..2f6e518 100644 --- a/Script/The Universal Mission/ObjectivesMaker.lua +++ b/Script/The Universal Mission/ObjectivesMaker.lua @@ -41,20 +41,6 @@ do return possiblePoints[1] end - local function getEnemyAirbaseInZone(zone) - local validAirbases = {} - - for _,ab in ipairs(coalition.getAirbases(TUM.settings.getEnemyCoalition())) do - if DCSEx.zones.isPointInside(zone, ab:getPoint()) then - table.insert(validAirbases, ab) - end - end - - if #validAirbases == 0 then return nil end - - return DCSEx.table.getRandom(validAirbases) - end - function TUM.objectivesMaker.create() local zone = DCSEx.zones.getByName(TUM.settings.getValue(TUM.settings.id.TARGET_LOCATION, true)) @@ -83,20 +69,22 @@ do spawnPoint2 = DCSEx.math.vec3ToVec2(spawnPoint3) isSceneryTarget = true elseif DCSEx.table.contains(objectiveDB.flags, DCSEx.enums.taskFlag.AIRBASE_TARGET) then - local pickedAirbase = getEnemyAirbaseInZone(zone) - if not pickedAirbase then + local validAirbases = DCSEx.zones.getAirbases(zone, TUM.settings.getEnemyCoalition()) + if #validAirbases == 0 then TUM.log("Failed to find a valid airbase to use as target.", TUM.logger.logLevel.WARNING) return nil end + local pickedAirbase = DCSEx.table.getRandom(validAirbases) spawnPoint3 = DCSEx.table.deepCopy(pickedAirbase:getPoint()) spawnPoint2 = DCSEx.math.vec3ToVec2(spawnPoint3) isAirbaseTarget = true elseif DCSEx.table.contains(objectiveDB.flags, DCSEx.enums.taskFlag.PARKED_AIRCRAFT_TARGET) then - local pickedAirbase = getEnemyAirbaseInZone(zone) - if not pickedAirbase then + local validAirbases = DCSEx.zones.getAirbases(zone, TUM.settings.getEnemyCoalition()) + if #validAirbases == 0 then TUM.log("Failed to find a valid airbase to use as target.", TUM.logger.logLevel.WARNING) return nil end + local pickedAirbase = DCSEx.table.getRandom(validAirbases) local parkings = pickedAirbase:getParking() local validParkings = {} for _,p in pairs(parkings) do