mirror of
https://github.com/akaAgar/the-universal-mission-for-dcs-world.git
synced 2026-08-25 02:41:51 +00:00
Improved weapon usage RoE, wingmen now rejoin leader if no tasking in queue
This commit is contained in:
@@ -16,11 +16,12 @@ do
|
|||||||
local currentTargetIDorPoint = nil -- ID for groups/statics, point2 for scenery objects
|
local currentTargetIDorPoint = nil -- ID for groups/statics, point2 for scenery objects
|
||||||
local currentTargetType = nil
|
local currentTargetType = nil
|
||||||
|
|
||||||
local function allowWeaponUse(wingmenCtrl, allowUse)
|
local function allowWeaponUse(wingmenCtrl, allowAA, allowAG)
|
||||||
allowUse = allowUse or false
|
allowAA = allowAA or false
|
||||||
|
allowAG = allowAG or false
|
||||||
wingmenCtrl:setOption(AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE)
|
wingmenCtrl:setOption(AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE)
|
||||||
wingmenCtrl:setOption(AI.Option.Air.id.PROHIBIT_AA, not allowUse)
|
wingmenCtrl:setOption(AI.Option.Air.id.PROHIBIT_AA, not allowAA)
|
||||||
wingmenCtrl:setOption(AI.Option.Air.id.PROHIBIT_AG, not allowUse)
|
wingmenCtrl:setOption(AI.Option.Air.id.PROHIBIT_AG, not allowAG)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function doCommandEngageStrikeTargets()
|
local function doCommandEngageStrikeTargets()
|
||||||
@@ -42,8 +43,6 @@ do
|
|||||||
if obj and not obj.completed then
|
if obj and not obj.completed then
|
||||||
local objectiveDB = Library.tasks[obj.taskID]
|
local objectiveDB = Library.tasks[obj.taskID]
|
||||||
if objectiveDB.targetFamilies and #objectiveDB.targetFamilies > 0 then
|
if objectiveDB.targetFamilies and #objectiveDB.targetFamilies > 0 then
|
||||||
allowWeaponUse(wingmenCtrl, true)
|
|
||||||
|
|
||||||
local distanceFromTarget = DCSEx.math.getDistance2D(wingmenPosition, obj.point2)
|
local distanceFromTarget = DCSEx.math.getDistance2D(wingmenPosition, obj.point2)
|
||||||
|
|
||||||
if distanceFromTarget < nearestDistance and distanceFromTarget < MAX_STRUCTURE_ENGAGEMENT_RANGE then
|
if distanceFromTarget < nearestDistance and distanceFromTarget < MAX_STRUCTURE_ENGAGEMENT_RANGE then
|
||||||
@@ -73,6 +72,7 @@ do
|
|||||||
unitId = nearestTarget,
|
unitId = nearestTarget,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
allowWeaponUse(wingmenCtrl, false, true)
|
||||||
wingmenCtrl:setTask(taskTable)
|
wingmenCtrl:setTask(taskTable)
|
||||||
return DCSEx.world.getStaticObjectByID(nearestTarget):getPoint()
|
return DCSEx.world.getStaticObjectByID(nearestTarget):getPoint()
|
||||||
elseif nearestTargetType == "scenery" then
|
elseif nearestTargetType == "scenery" then
|
||||||
@@ -85,6 +85,7 @@ do
|
|||||||
point = nearestTarget,
|
point = nearestTarget,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
allowWeaponUse(wingmenCtrl, false, true)
|
||||||
wingmenCtrl:setTask(taskTable)
|
wingmenCtrl:setTask(taskTable)
|
||||||
return DCSEx.math.vec2ToVec3(nearestTarget, "land")
|
return DCSEx.math.vec2ToVec3(nearestTarget, "land")
|
||||||
end
|
end
|
||||||
@@ -182,7 +183,6 @@ do
|
|||||||
|
|
||||||
local wingmenPosition = DCSEx.world.getGroupCenter(TUM.wingmen.getGroup())
|
local wingmenPosition = DCSEx.world.getGroupCenter(TUM.wingmen.getGroup())
|
||||||
|
|
||||||
|
|
||||||
validTargets = DCSEx.dcs.getNearestObjects(wingmenPosition, validTargets, 1)
|
validTargets = DCSEx.dcs.getNearestObjects(wingmenPosition, validTargets, 1)
|
||||||
local target = validTargets[1]
|
local target = validTargets[1]
|
||||||
currentTargetIDorPoint = DCSEx.dcs.getGroupIDAsNumber(target:getGroup())
|
currentTargetIDorPoint = DCSEx.dcs.getGroupIDAsNumber(target:getGroup())
|
||||||
@@ -203,13 +203,15 @@ do
|
|||||||
groupId = currentTargetIDorPoint,
|
groupId = currentTargetIDorPoint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
allowWeaponUse(wingmenCtrl, true)
|
|
||||||
|
local targetInAir = target:inAir()
|
||||||
|
allowWeaponUse(wingmenCtrl, targetInAir, not targetInAir)
|
||||||
wingmenCtrl:setTask(taskTable)
|
wingmenCtrl:setTask(taskTable)
|
||||||
|
|
||||||
local targetBRAA = "distance unknown"
|
local targetBRAA = "distance unknown"
|
||||||
local targetInfo = nil
|
local targetInfo = nil
|
||||||
local messageSuffix = nil
|
local messageSuffix = nil
|
||||||
if target:inAir() then
|
if targetInAir then
|
||||||
messageSuffix = "Air"
|
messageSuffix = "Air"
|
||||||
targetInfo = Library.objectNames.get(target) -- Library.objectNames.getGeneric(target)
|
targetInfo = Library.objectNames.get(target) -- Library.objectNames.getGeneric(target)
|
||||||
targetBRAA = DCSEx.dcs.getBRAA(target:getPoint(), wingmenPosition, true)
|
targetBRAA = DCSEx.dcs.getBRAA(target:getPoint(), wingmenPosition, true)
|
||||||
@@ -253,7 +255,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
currentTargetIDorPoint = nil
|
currentTargetIDorPoint = nil
|
||||||
allowWeaponUse(wingmenCtrl, false)
|
allowWeaponUse(wingmenCtrl, false, false)
|
||||||
wingmenCtrl:setTask(getOrbitTaskTable(DCSEx.math.vec3ToVec2(mapMarker.pos)))
|
wingmenCtrl:setTask(getOrbitTaskTable(DCSEx.math.vec3ToVec2(mapMarker.pos)))
|
||||||
-- TUM.radio.playForAll("pilotWingmanGoToMarker", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
-- TUM.radio.playForAll("pilotWingmanGoToMarker", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
||||||
end
|
end
|
||||||
@@ -265,16 +267,16 @@ do
|
|||||||
local wingmenCtrl = TUM.wingmen.getController()
|
local wingmenCtrl = TUM.wingmen.getController()
|
||||||
if not wingmenCtrl then return end
|
if not wingmenCtrl then return end
|
||||||
|
|
||||||
allowWeaponUse(wingmenCtrl, false)
|
allowWeaponUse(wingmenCtrl, false, false)
|
||||||
|
|
||||||
currentTargetIDorPoint = nil
|
currentTargetIDorPoint = nil
|
||||||
wingmenCtrl:setTask(getOrbitTaskTable(DCSEx.world.getGroupCenter(TUM.wingmen.getGroup())))
|
wingmenCtrl:setTask(getOrbitTaskTable(DCSEx.world.getGroupCenter(TUM.wingmen.getGroup())))
|
||||||
TUM.radio.playForAll("pilotWingmanOrbit", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
TUM.radio.playForAll("pilotWingmanOrbit", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
||||||
end
|
end
|
||||||
|
|
||||||
function TUM.wingmenTasking.commandRejoin(formationDistance, delayRadioAnswer, silent)
|
function TUM.wingmenTasking.commandRejoin(formationDistance, delayRadioAnswer, silent, taskingComplete)
|
||||||
delayRadioAnswer = delayRadioAnswer or false
|
delayRadioAnswer = delayRadioAnswer or false
|
||||||
silent = silent or false
|
silent = silent or false
|
||||||
|
taskingComplete = taskingComplete or false
|
||||||
if TUM.settings.getValue(TUM.settings.id.MULTIPLAYER) then return end -- No wingmen in multiplayer
|
if TUM.settings.getValue(TUM.settings.id.MULTIPLAYER) then return end -- No wingmen in multiplayer
|
||||||
|
|
||||||
local player = world:getPlayer()
|
local player = world:getPlayer()
|
||||||
@@ -284,10 +286,12 @@ do
|
|||||||
if not wingmenCtrl then return end
|
if not wingmenCtrl then return end
|
||||||
|
|
||||||
currentTargetIDorPoint = nil
|
currentTargetIDorPoint = nil
|
||||||
allowWeaponUse(wingmenCtrl, false)
|
allowWeaponUse(wingmenCtrl, false, false)
|
||||||
wingmenCtrl:setTask(getRejoinTaskTable(formationDistance))
|
wingmenCtrl:setTask(getRejoinTaskTable(formationDistance))
|
||||||
if not silent then
|
if not silent then
|
||||||
TUM.radio.playForAll("pilotWingmanRejoin", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
local msgID = "pilotWingmanRejoin"
|
||||||
|
if taskingComplete then msgID = "pilotWingmanRejoinTaskComplete" end
|
||||||
|
TUM.radio.playForAll(msgID, { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -350,26 +354,30 @@ do
|
|||||||
-- Called on every mission update tick (every 10-20 seconds)
|
-- Called on every mission update tick (every 10-20 seconds)
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
function TUM.wingmenTasking.onClockTick()
|
function TUM.wingmenTasking.onClockTick()
|
||||||
|
-- No tasking? Rejoin leader
|
||||||
|
local wingmenCtrl = TUM.wingmen:getController()
|
||||||
|
if wingmenCtrl and not wingmenCtrl:hasTask() then
|
||||||
|
TUM.wingmenTasking.commandRejoin(nil, false)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if not currentTargetIDorPoint then return end
|
if not currentTargetIDorPoint then return end
|
||||||
|
|
||||||
-- Targeted object is dead? Mark currentTargetID as nil and rejoin leader
|
-- Targeted object is dead? Rejoin leader
|
||||||
if currentTargetType == "group" then
|
if currentTargetType == "group" then
|
||||||
local tgtGroup = DCSEx.world.getGroupByID(currentTargetIDorPoint)
|
local tgtGroup = DCSEx.world.getGroupByID(currentTargetIDorPoint)
|
||||||
if not tgtGroup or tgtGroup:getSize() == 0 then
|
if not tgtGroup or tgtGroup:getSize() == 0 then
|
||||||
TUM.wingmenTasking.commandRejoin(nil, false)
|
TUM.wingmenTasking.commandRejoin(nil, false, false, true)
|
||||||
currentTargetIDorPoint = nil
|
|
||||||
end
|
end
|
||||||
elseif currentTargetType == "static" then
|
elseif currentTargetType == "static" then
|
||||||
local tgtStatic = DCSEx.world.getStaticObjectByID(currentTargetIDorPoint)
|
local tgtStatic = DCSEx.world.getStaticObjectByID(currentTargetIDorPoint)
|
||||||
if not tgtStatic then
|
if not tgtStatic then
|
||||||
TUM.wingmenTasking.commandRejoin(nil, false)
|
TUM.wingmenTasking.commandRejoin(nil, false, false, true)
|
||||||
currentTargetIDorPoint = nil
|
|
||||||
end
|
end
|
||||||
elseif currentTargetType == "scenery" then
|
elseif currentTargetType == "scenery" then
|
||||||
local sceneriesInZone = DCSEx.world.getSceneriesInZone(currentTargetIDorPoint, 5)
|
local sceneriesInZone = DCSEx.world.getSceneriesInZone(currentTargetIDorPoint, 5)
|
||||||
if not sceneriesInZone or #sceneriesInZone == 0 or sceneriesInZone[1]:getLife() < 1 then
|
if not sceneriesInZone or #sceneriesInZone == 0 or sceneriesInZone[1]:getLife() < 1 then
|
||||||
TUM.wingmenTasking.commandRejoin(nil, false)
|
TUM.wingmenTasking.commandRejoin(nil, false, false, true)
|
||||||
currentTargetIDorPoint = nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user