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