mirror of
https://github.com/akaAgar/the-universal-mission-for-dcs-world.git
synced 2026-08-29 17:22:26 +00:00
Rewrote engagement AI, now it works for air and ground targets
This commit is contained in:
@@ -11,6 +11,15 @@ do
|
|||||||
local mapMarkerMissingWarningAlreadyDisplayed = false -- Was the "map marker missing" warning already displayed during the mission?
|
local mapMarkerMissingWarningAlreadyDisplayed = false -- Was the "map marker missing" warning already displayed during the mission?
|
||||||
local targetPointMapMarker = nil
|
local targetPointMapMarker = nil
|
||||||
|
|
||||||
|
local currentTargetedGroupID = nil
|
||||||
|
|
||||||
|
local function allowWeaponUse(wingmenCtrl, allowUse)
|
||||||
|
allowUse = allowUse 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)
|
||||||
|
end
|
||||||
|
|
||||||
local function getOrbitTaskTable(point2)
|
local function getOrbitTaskTable(point2)
|
||||||
return {
|
return {
|
||||||
id = "Orbit",
|
id = "Orbit",
|
||||||
@@ -44,6 +53,8 @@ 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, true)
|
||||||
|
|
||||||
local detectedContacts = TUM.wingmen.getContacts(groupCategory)
|
local detectedContacts = TUM.wingmen.getContacts(groupCategory)
|
||||||
local validTargets = {}
|
local validTargets = {}
|
||||||
for _,c in ipairs(detectedContacts) do
|
for _,c in ipairs(detectedContacts) do
|
||||||
@@ -77,14 +88,15 @@ do
|
|||||||
|
|
||||||
validTargets = DCSEx.dcs.getNearestObjects(wingmenPosition, validTargets, 1)
|
validTargets = DCSEx.dcs.getNearestObjects(wingmenPosition, validTargets, 1)
|
||||||
local target = validTargets[1]
|
local target = validTargets[1]
|
||||||
|
currentTargetedGroupID = DCSEx.dcs.getGroupIDAsNumber(target:getGroup())
|
||||||
local taskTable = {
|
local taskTable = {
|
||||||
id = "AttackGroup",
|
id = "AttackGroup",
|
||||||
params = {
|
params = {
|
||||||
groupId = DCSEx.dcs.getGroupIDAsNumber(target:getGroup()),
|
groupId = currentTargetedGroupID,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wingmenCtrl:setTask(taskTable)
|
wingmenCtrl:setTask(taskTable)
|
||||||
wingmenCtrl:setTask(getRejoinTaskTable()) -- Makes sure wingmen rejoin with the player after attack
|
-- wingmenCtrl:pushTask(getRejoinTaskTable()) -- Makes sure wingmen rejoin with the player after attack
|
||||||
|
|
||||||
local targetInfo = nil
|
local targetInfo = nil
|
||||||
local messageSuffix = nil
|
local messageSuffix = nil
|
||||||
@@ -98,13 +110,16 @@ do
|
|||||||
targetInfo = targetInfo..DCSEx.dcs.getBRAA(target:getPoint(), wingmenPosition, false)
|
targetInfo = targetInfo..DCSEx.dcs.getBRAA(target:getPoint(), wingmenPosition, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
if targetPointMapMarker then
|
-- Mark the last targeted point in debug mode
|
||||||
trigger.action.removeMark(targetPointMapMarker)
|
if TUM.DEBUG_MODE then
|
||||||
targetPointMapMarker = nil
|
if targetPointMapMarker then
|
||||||
|
trigger.action.removeMark(targetPointMapMarker)
|
||||||
|
targetPointMapMarker = nil
|
||||||
|
end
|
||||||
|
targetPointMapMarker = DCSEx.world.getNextMarkerID()
|
||||||
|
trigger.action.markToAll(targetPointMapMarker, "Last wingmen attack point", target:getPoint(), true)
|
||||||
end
|
end
|
||||||
|
|
||||||
targetPointMapMarker = DCSEx.world.getNextMarkerID()
|
|
||||||
trigger.action.markToAll(targetPointMapMarker, "Last wingmen attack point", target:getPoint(), true)
|
|
||||||
TUM.radio.playForAll("pilotWingmanEngage"..messageSuffix, { TUM.wingmen.getFirstWingmanNumber(), targetInfo }, TUM.wingmen.getFirstWingmanCallsign(), true)
|
TUM.radio.playForAll("pilotWingmanEngage"..messageSuffix, { TUM.wingmen.getFirstWingmanNumber(), targetInfo }, TUM.wingmen.getFirstWingmanCallsign(), true)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -122,11 +137,14 @@ 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)
|
||||||
|
|
||||||
if not mapMarker then
|
if not mapMarker then
|
||||||
TUM.radio.playForAll("pilotWingmanGoToMarkerNoMarker", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), true)
|
TUM.radio.playForAll("pilotWingmanGoToMarkerNoMarker", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), true)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
currentTargetedGroupID = nil
|
||||||
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(), true)
|
TUM.radio.playForAll("pilotWingmanGoToMarker", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), true)
|
||||||
end
|
end
|
||||||
@@ -135,11 +153,12 @@ do
|
|||||||
delayRadioAnswer = delayRadioAnswer or false
|
delayRadioAnswer = delayRadioAnswer 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
|
||||||
|
|
||||||
if TUM.settings.getValue(TUM.settings.id.MULTIPLAYER) then return end -- No wingmen in multiplayer
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
currentTargetedGroupID = 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
|
||||||
@@ -154,6 +173,9 @@ 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)
|
||||||
|
|
||||||
|
currentTargetedGroupID = nil
|
||||||
wingmenCtrl:setTask(getRejoinTaskTable(formationDistance))
|
wingmenCtrl:setTask(getRejoinTaskTable(formationDistance))
|
||||||
TUM.radio.playForAll("pilotWingmanRejoin", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
TUM.radio.playForAll("pilotWingmanRejoin", { TUM.wingmen.getFirstWingmanNumber() }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
||||||
end
|
end
|
||||||
@@ -212,4 +234,18 @@ do
|
|||||||
|
|
||||||
TUM.radio.playForAll("pilotWingmanReportStatus", { TUM.wingmen.getFirstWingmanNumber(), statusMsg }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
TUM.radio.playForAll("pilotWingmanReportStatus", { TUM.wingmen.getFirstWingmanNumber(), statusMsg }, TUM.wingmen.getFirstWingmanCallsign(), delayRadioAnswer)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------
|
||||||
|
-- Called on every mission update tick (every 10-20 seconds)
|
||||||
|
----------------------------------------------------------
|
||||||
|
function TUM.wingmenTasking.onClockTick()
|
||||||
|
-- Targeted group is dead? Mark group as nil and rejoin leader
|
||||||
|
if currentTargetedGroupID then
|
||||||
|
local tgtGroup = DCSEx.world.getGroupByID(currentTargetedGroupID)
|
||||||
|
if not tgtGroup or tgtGroup:getSize() == 0 then
|
||||||
|
TUM.wingmenTasking.commandRejoin(nil, false)
|
||||||
|
tgtGroup = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user