Ops Auftrag

This commit is contained in:
Frank
2020-04-16 01:14:19 +02:00
parent 5a6a9d1aed
commit d72b33551e
2 changed files with 292 additions and 91 deletions
+285 -84
View File
@@ -31,7 +31,7 @@
-- @field #number Tstart Mission start time in seconds.
-- @field #number Tstop Mission stop time in seconds.
-- @field #number duration Mission duration in seconds.
-- @field #number markerID F10 map marker ID.
-- @field Wrapper.Marker#MARKER marker F10 map marker.
-- @field #table DCStask DCS task structure.
-- @field #number Ntargets Number of mission targets.
-- @field #number dTevaluate Time interval in seconds before the mission result is evaluated after mission is over.
@@ -158,7 +158,7 @@ AUFTRAG = {
assets = {},
missionFraction = 0.5,
enrouteTasks = {},
markerID = nil,
marker = nil,
startconditions = {},
stopconditions = {},
}
@@ -184,7 +184,7 @@ _AUFTRAGSNR=0
-- @field #string ORBIT Orbit mission.
-- @field #string PATROL Similar to CAP but no auto engage targets.
-- @field #string RECON Recon mission.
-- @field #string RECOVERYTANKER Recovery tanker mission.
-- @field #string RECOVERYTANKER Recovery tanker mission. Not implemented yet.
-- @field #string RESCUEHELO Rescue helo.
-- @field #string SEAD Suppression/destruction of enemy air defences.
-- @field #string STRIKE Strike mission.
@@ -219,7 +219,6 @@ AUFTRAG.Type={
-- @field #string PLANNED Mission is at the early planning stage.
-- @field #string QUEUED Mission is queued at an airwing.
-- @field #string REQUESTED Mission assets were requested from the warehouse.
-- @field #string ASSIGNED Mission was assigned to somebody.
-- @field #string SCHEDULED Mission is scheduled in a FLIGHGROUP queue waiting to be started.
-- @field #string STARTED Mission has started but is not executed yet.
-- @field #string EXECUTING Mission is being executed.
@@ -231,7 +230,6 @@ AUFTRAG.Status={
PLANNED="planned",
QUEUED="queued",
REQUESTED="requested",
ASSIGNED="assigned",
SCHEDULED="scheduled",
STARTED="started",
EXECUTING="executing",
@@ -265,18 +263,23 @@ AUFTRAG.FlightStatus={
-- @field #string STATIC Target is a STATIC object.
-- @field #string COORDINATE Target is a COORDINATE.
-- @field #string AIRBASE Target is an AIRBASE.
-- @field #string SETGROUP Target is a SET of GROUPs.
-- @field #string SETUNIT Target is a SET of UNITs.
AUFTRAG.TargetType={
GROUP="Group",
UNIT="Unit",
STATIC="Static",
COORDINATE="Coordinate",
AIRBASE="Airbase",
SETGROUP="SetGroup",
SETUNIT="SetUnit",
}
--- Target data.
-- @type AUFTRAG.TargetData
-- @field Wrapper.Positionable#POSITIONABLE Target Target Object.
-- @field #string Type Target type: "Group", "Unit", "Static", "Coordinate", "Airbase.
-- @field #string Type Target type: "Group", "Unit", "Static", "Coordinate", "Airbase", "SetGroup", "SetUnit".
-- @field #string Name Target name.
-- @field #number Ninital Number of initial targets.
-- @field #number Lifepoints Total life points.
@@ -303,22 +306,23 @@ AUFTRAG.TargetType={
--- AUFTRAG class version.
-- @field #string version
AUFTRAG.version="0.1.1"
AUFTRAG.version="0.1.5"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO: Clone mission. How? Deepcopy?
-- TODO: Option to assign mission to specific squadrons (requires an AIRWING).
-- TODO: Option to assign a specific payload for the mission (requires an AIRWING).
-- TODO: Add mission start conditions.
-- TODO: Add recovery tanker mission for boat ops.
-- TODO: Add rescue helo mission for boat ops.
-- DONE: Add rescue helo mission for boat ops.
-- TODO: Mission success options damaged, destroyed.
-- DONE: Mission ROE and ROT.
-- TODO: Mission frequency, formation, etc.
-- DONE: FSM events.
-- TODO: F10 marker functions that are updated on Status event.
-- DONE: F10 marker functions that are updated on Status event.
-- TODO: F10 marker to create new missions.
-- DONE: Evaluate mission result ==> SUCCESS/FAILURE
-- DONE: NewAUTO() NewA2G NewA2A
@@ -448,46 +452,89 @@ end
--- Create an ORBIT mission.
-- @param #AUFTRAG self
-- @param Core.Point#COORDINATE Coordinate Where to orbit.
-- @param #number Speed Orbit speed in knots. Default 350 KIAS.
-- @param #number Heading Heading of race-track pattern in degrees. Default *random* in [1,360].
-- @param #number Leg Length of race-track in NM. Default 10 NM.
-- @param #number Altitude Orbit altitude in feet. Default is y component of `Coordinate`.
-- @param #number Speed Orbit speed in knots. Default 350 KIAS.
-- @param #number Heading Heading of race-track pattern in degrees. If not specified, a circular orbit is performed.
-- @param #number Leg Length of race-track in NM. If not specified, a circular orbit is performed.
-- @return #AUFTRAG self
function AUFTRAG:NewORBIT(Coordinate, Speed, Heading, Leg, Altitude)
function AUFTRAG:NewORBIT(Coordinate, Altitude, Speed, Heading, Leg)
local auftrag=AUFTRAG:New(AUFTRAG.Type.ORBIT)
local mission=AUFTRAG:New(AUFTRAG.Type.ORBIT)
auftrag.orbitCoord = Coordinate
auftrag.orbitHeading = Heading or math.random(360)
auftrag.orbitLeg = UTILS.NMToMeters(Leg or 10)
auftrag.orbitSpeed = UTILS.KnotsToMps(Speed or 350)
--mission.orbitCoord = Coordinate
if Altitude then
auftrag.orbitCoord.y=UTILS.FeetToMeters(Altitude)
mission.orbitAltitude=UTILS.FeetToMeters(Altitude)
else
mission.orbitAltitude=Coordinate.y
end
Coordinate.y=mission.orbitAltitude
auftrag.missionAltitude=auftrag.orbitCoord.y*0.9
auftrag.missionFraction=0.9
auftrag.optionROE=ENUMS.ROE.ReturnFire
auftrag.optionROT=ENUMS.ROT.PassiveDefense
mission.engageTarget = mission:_TargetFromObject(Coordinate)
auftrag.DCStask=auftrag:GetDCSMissionTask()
mission.orbitSpeed = UTILS.KnotsToMps(Speed or 350)
return auftrag
if Heading and Leg then
self.orbitHeading=Heading
self.orbitLeg=Leg
self.orbitRaceTrack=Coordinate:Translate(self.orbitLeg, self.orbitHeading, true)
end
mission.missionAltitude=mission.orbitAltitude*0.9
mission.missionFraction=0.9
mission.optionROE=ENUMS.ROE.ReturnFire
mission.optionROT=ENUMS.ROT.PassiveDefense
mission.DCStask=mission:GetDCSMissionTask()
return mission
end
--- Create an ORBIT mission, where the aircraft will go in a circle around the specified coordinate.
-- @param #AUFTRAG self
-- @param Core.Point#COORDINATE Coordinate Where to orbit.
-- @param #number Altitude Orbit altitude in feet. Default is y component of `Coordinate`.
-- @param #number Speed Orbit speed in knots. Default 350 KIAS.
-- @return #AUFTRAG self
function AUFTRAG:NewORBIT_CIRCLE(Coordinate, Altitude, Speed)
local mission=AUFTRAG:NewORBIT(Coordinate, Altitude, Speed)
return mission
end
--- Create an ORBIT mission, where the aircraft will fly a race-track pattern.
-- @param #AUFTRAG self
-- @param Core.Point#COORDINATE Coordinate Where to orbit.
-- @param #number Altitude Orbit altitude in feet. Default is y component of `Coordinate`.
-- @param #number Speed Orbit speed in knots. Default 350 KIAS.
-- @param #number Heading Heading of race-track pattern in degrees. Default random in [0, 360) degrees.
-- @param #number Leg Length of race-track in NM. Default 10 NM.
-- @param #number Altitude Orbit altitude in feet.
-- @return #AUFTRAG self
function AUFTRAG:NewORBIT_RACETRACK(Coordinate, Altitude, Speed, Heading, Leg)
Heading = Heading or math.random(360)
Leg = UTILS.NMToMeters(Leg or 10)
local mission=AUFTRAG:NewORBIT(Coordinate, Altitude, Speed, Heading, Leg)
return mission
end
--- Create a PATROL mission.
-- @param #AUFTRAG self
-- @param Core.Point#COORDINATE OrbitCoordinate Where to orbit. Altitude is also taken from the coordinate.
-- @param #number OrbitSpeed Orbit speed in knots. Default 350 kts.
-- @param #number Heading Heading of race-track pattern in degrees. Default 270 (East to West).
-- @param #number Heading Heading of race-track pattern in degrees. Default random in [0, 360) degrees.
-- @param #number Leg Length of race-track in NM. Default 10 NM.
-- @param #number Altitude Orbit altitude in feet.
-- @return #AUFTRAG self
function AUFTRAG:NewPATROL(OrbitCoordinate, OrbitSpeed, Heading, Leg, Altitude)
-- Create ORBIT first.
local mission=self:NewORBIT(OrbitCoordinate, OrbitSpeed, Heading, Leg, Altitude)
local mission=self:NewORBIT(OrbitCoordinate, Altitude, OrbitSpeed, Heading, Leg)
-- Mission type PATROL.
mission.type=AUFTRAG.Type.PATROL
@@ -618,14 +665,15 @@ end
--- Create a CAS mission.
-- @param #AUFTRAG self
-- @param Core.Point#COORDINATE OrbitCoordinate Where to orbit. Altitude is also taken from the coordinate.
-- @param #number OrbitSpeed Orbit speed in knots. Default 350 kts.
-- @param #number Heading Heading of race-track pattern in degrees. Default 270 (East to West).
-- @param #number Leg Length of race-track in NM. Default 10 NM.
-- @param Core.Zone#ZONE_RADIUS ZoneCAS Circular CAS zone. Detected targets in this zone will be engaged.
-- @param #table TargetTypes Table of target types. Default {"Helicopters", "Ground Units", "Light armed ships"}.
-- @param #number Altitude Altitude at which to orbit. Default is 10.000 ft.
-- @param #number Speed Orbit speed in knots. Default 350 KIAS.
-- @param Core.Point#COORDINATE Coordinate Where to orbit. Default is the center of the CAS zone.
-- @param #number Heading Heading of race-track pattern in degrees. If not specified, a simple circular orbit is performed.
-- @param #number Leg Length of race-track in NM. If not specified, a simple circular orbit is performed.
-- @param #table TargetTypes (Optional) Table of target types. Default {"Helicopters", "Ground Units", "Light armed ships"}.
-- @return #AUFTRAG self
function AUFTRAG:NewCAS(OrbitCoordinate, OrbitSpeed, Heading, Leg, ZoneCAS, TargetTypes)
function AUFTRAG:NewCAS(ZoneCAS, Altitude, Speed, Coordinate, Heading, Leg, TargetTypes)
-- Ensure given TargetTypes parameter is a table.
if TargetTypes then
@@ -633,14 +681,17 @@ function AUFTRAG:NewCAS(OrbitCoordinate, OrbitSpeed, Heading, Leg, ZoneCAS, Targ
TargetTypes={TargetTypes}
end
end
Coordinate=Coordinate or ZoneCAS:GetCoordinate()
Altitude=Altitude or 10000
-- Create ORBIT first.
local mission=self:NewORBIT(OrbitCoordinate, OrbitSpeed, Heading, Leg)
local mission=self:NewORBIT(Coordinate, Altitude, Speed, Heading, Leg)
-- CAS paramters.
mission.type=AUFTRAG.Type.CAS
mission.engageZone=ZoneCAS or ZONE_RADIUS:New("CAS Zone", OrbitCoordinate:GetVec2(), Leg)
mission.engageZone=ZoneCAS
mission.engageTargetTypes=TargetTypes or {"Helicopters", "Ground Units", "Light armed ships"}
mission:_SetLogID()
@@ -694,6 +745,7 @@ function AUFTRAG:NewBAI(Target)
local mission=AUFTRAG:New(AUFTRAG.Type.BAI)
mission.engageTarget=mission:_TargetFromObject(Target)
mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG
mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL
mission.engageAsGroup=true
@@ -718,6 +770,7 @@ function AUFTRAG:NewSEAD(Target)
local mission=AUFTRAG:New(AUFTRAG.Type.SEAD)
mission.engageTarget=mission:_TargetFromObject(Target)
mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG
mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL
mission.engageAsGroup=true
@@ -743,6 +796,7 @@ function AUFTRAG:NewSTRIKE(Target, Altitude)
local mission=AUFTRAG:New(AUFTRAG.Type.STRIKE)
mission.engageTarget=mission:_TargetFromObject(Target)
mission.engageAltitude=UTILS.FeetToMeters(Altitude or 1000)
mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG
mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL
@@ -767,8 +821,9 @@ function AUFTRAG:NewBOMBING(Target, Altitude)
local mission=AUFTRAG:New(AUFTRAG.Type.BOMBING)
-- DCS task options:
mission.engageTarget=mission:_TargetFromObject(Target)
-- DCS task options:
mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000)
mission.engageWeaponType=ENUMS.WeaponFlag.AnyBomb
mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL
@@ -836,7 +891,10 @@ function AUFTRAG:NewESCORT(EscortGroup, OffsetVector, EngageMaxDistance, TargetT
local mission=AUFTRAG:New(AUFTRAG.Type.ESCORT)
mission.escortGroup=EscortGroup
--mission.escortGroup=EscortGroup
mission.engageTarget=mission:_TargetFromObject(EscortGroup)
mission.escortVec3=OffsetVector or {x=200, y=0, z=-100}
mission.engageMaxDistance=EngageMaxDistance
mission.engageTargetTypes=TargetTypes or {"Air"}
@@ -871,11 +929,13 @@ function AUFTRAG:NewTRANSPORT(TransportGroupSet, PickupCoordinate)
env.info("FF error in TRANSPORT auftrag")
end
mission.transportPickup=PickupCoordinate or mission.transportGroupSet:GetFirst():GetCoordinate()
mission.engageTarget=mission:_TargetFromObject(mission.transportGroupSet)
mission.transportPickup=PickupCoordinate or mission:GetTargetCoordinate()
mission.transportPickup:MarkToAll("Pickup")
-- TODO: what's the best ROE here? Make dependent on ESCORT or FOLLOW!
-- TODO: what's the best ROE here?
mission.optionROE=ENUMS.ROE.ReturnFire
mission.optionROT=ENUMS.ROT.PassiveDefense
@@ -1916,16 +1976,19 @@ end
--- Count alive mission targets.
-- @param #AUFTRAG self
-- @param #AUFTRAG.TargetData Target (Optional) The target object.
-- @return #number Number of alive target units.
function AUFTRAG:CountMissionTargets()
function AUFTRAG:CountMissionTargets(Target)
local N=0
if self.engageTarget then
Target=Target or self.engageTarget
if self.engageTarget.Type==AUFTRAG.TargetType.GROUP then
if Target then
if Target.Type==AUFTRAG.TargetType.GROUP then
local target=self.engageTarget.Target --Wrapper.Group#GROUP
local target=Target.Target --Wrapper.Group#GROUP
local units=target:GetUnits()
@@ -1939,26 +2002,58 @@ function AUFTRAG:CountMissionTargets()
end
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.UNIT then
elseif Target.Type==AUFTRAG.TargetType.UNIT then
local target=self.engageTarget.Target --Wrapper.Unit#UNIT
local target=Target.Target --Wrapper.Unit#UNIT
if target and target:IsAlive() and target:GetLife()>1 then
N=N+1
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.STATIC then
elseif Target.Type==AUFTRAG.TargetType.STATIC then
local target=self.engageTarget.Target --Wrapper.Static#STATIC
local target=Target.Target --Wrapper.Static#STATIC
if target and target:IsAlive() then
N=N+1
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.AIRBASE then
elseif Target.Type==AUFTRAG.TargetType.AIRBASE then
-- TODO: any (good) way to tell whether an airbase was "destroyed" or at least damaged? Is :GetLive() working?
elseif Target.Type==AUFTRAG.TargetType.SETGROUP then
for _,_group in pairs(Target.Target.Set or {}) do
local group=_group --Wrapper.Group#GROUP
local units=group:GetUnits()
for _,_unit in pairs(units or {}) do
local unit=_unit --Wrapper.Unit#UNIT
-- We check that unit is "alive".
if unit and unit:IsAlive() and unit:GetLife()>1 then
N=N+unit:GetLife()
end
end
end
elseif Target.Type==AUFTRAG.TargetType.SETUNIT then
for _,_unit in pairs(Target.Target.Set or {}) do
local unit=_unit --Wrapper.Unit#UNIT
-- We check that unit is "alive".
if unit and unit:IsAlive() and unit:GetLife()>1 then
N=N+unit:GetLife()
end
end
else
self:E("ERROR unknown target type")
end
end
@@ -1967,16 +2062,19 @@ end
--- Get target life points.
-- @param #AUFTRAG self
-- @param #AUFTRAG.TargetData Target (Optional) The target object.
-- @return #number Number of alive target units.
function AUFTRAG:GetTargetLife()
function AUFTRAG:GetTargetLife(Target)
local N=0
if self.engageTarget then
Target=Target or self.engageTarget
if self.engageTarget.Type==AUFTRAG.TargetType.GROUP then
if Target then
if Target.Type==AUFTRAG.TargetType.GROUP then
local target=self.engageTarget.Target --Wrapper.Group#GROUP
local target=Target.Target --Wrapper.Group#GROUP
local units=target:GetUnits()
@@ -1989,26 +2087,58 @@ function AUFTRAG:GetTargetLife()
end
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.UNIT then
elseif Target.Type==AUFTRAG.TargetType.UNIT then
local target=self.engageTarget.Target --Wrapper.Unit#UNIT
local target=Target.Target --Wrapper.Unit#UNIT
if target and target:IsAlive() then
N=N+target:GetLife()
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.STATIC then
elseif Target.Type==AUFTRAG.TargetType.STATIC then
local target=self.engageTarget.Target --Wrapper.Static#STATIC
local target=Target.Target --Wrapper.Static#STATIC
if target and target:IsAlive() then
N=N+1 --target:GetLife()
end
elseif self.engageTarget.Type==AUFTRAG.TargetType.AIRBASE then
elseif Target.Type==AUFTRAG.TargetType.AIRBASE then
-- TODO: any (good) way to tell whether an airbase was "destroyed" or at least damaged? Is :GetLive() working?
elseif Target.Type==AUFTRAG.TargetType.SETGROUP then
for _,_group in pairs(Target.Target.Set or {}) do
local group=_group --Wrapper.Group#GROUP
local units=group:GetUnits()
for _,_unit in pairs(units or {}) do
local unit=_unit --Wrapper.Unit#UNIT
-- We check that unit is "alive".
if unit and unit:IsAlive() then
N=N+unit:GetLife()
end
end
end
elseif Target.Type==AUFTRAG.TargetType.SETUNIT then
for _,_unit in pairs(Target.Target.Set or {}) do
local unit=_unit --Wrapper.Unit#UNIT
-- We check that unit is "alive".
if unit and unit:IsAlive() then
N=N+unit:GetLife()
end
end
else
self:E("ERROR unknown target type")
end
end
@@ -2034,6 +2164,7 @@ end
-- @return Core.Point#COORDINATE The target coordinate or *nil*.
function AUFTRAG:GetTargetCoordinate()
--[[
if self.engageTarget then
if self.engageTarget.Type==AUFTRAG.TargetType.COORDINATE then
return self.engageTarget.Target
@@ -2044,9 +2175,30 @@ function AUFTRAG:GetTargetCoordinate()
return self.orbitCoord
elseif self.escortGroup then
return self.escortGroup:GetCoordinate()
elseif self.transportPi1ckup then
elseif self.transportPickup then
return self.transportPickup
end
end
]]
if self.transportPickup then
-- Special case where we defined a
return self.transportPickup
elseif self.engageTarget then
if self.engageTarget.Type==AUFTRAG.TargetType.COORDINATE then
return self.engageTarget.Target
elseif self.engageTarget.Type==AUFTRAG.TargetType.SETGROUP then
-- Return the first group in the set.
-- TODO: does this only return ALIVE groups?!
return self.engageTarget.Target:GetFirst():GetCoordinate()
elseif self.engageTarget.Type==AUFTRAG.TargetType.SETUNIT then
-- Return the first unit in the set.
-- TODO: does this only return ALIVE units?!
return self.engageTarget.Target:GetFirst():GetCoordinate()
else
-- In all other cases the GetCoordinate() function should work.
return self.engageTarget.Target:GetCoordinate()
end
end
return nil
end
@@ -2056,6 +2208,7 @@ end
-- @return #string Name of the target or "N/A".
function AUFTRAG:GetTargetName()
--[[
if self.engageTarget then
if self.engageTarget.Type==AUFTRAG.TargetType.COORDINATE then
local coord=self.engageTarget.Target --Core.Point#COORDINATE
@@ -2070,7 +2223,13 @@ function AUFTRAG:GetTargetName()
return self.escortGroup:GetName()
elseif self.transportPickup then
return self.transportPickup:ToStringLLDMS()
end
end
]]
if self.engageTarget.Target then
return self.engageTarget.Name
end
return "N/A"
end
@@ -2118,20 +2277,22 @@ function AUFTRAG:UpdateMarker()
-- Marker text.
local text=string.format("%s %s", self.name, self.status:upper())
text=text..string.format("\nTargets=%d", self:CountMissionTargets())
text=text..string.format("\nFlights=%d", self:CountFlightGroups())
text=text..string.format("\n%s %s * %d/%d", self.type:upper(), self:GetTargetName(), self:CountMissionTargets(), self.Ntargets)
text=text..string.format("\nFlights %d/%d", self:CountFlightGroups(), tostring(self.nassets))
-- Remove old marker.
if self.markerID then
COORDINATE.RemoveMark(nil, self.markerID)
end
if not self.marker then
-- Get target coordinates. Can be nil!
local targetcoord=self:GetTargetCoordinate()
-- Get target coordinates. Can be nil!
local targetcoord=self:GetTargetCoordinate()
self.marker=MARKER:New(targetcoord, text):ReadOnly():ToAll()
else
-- New marker!
if targetcoord then
self.markerID=targetcoord:MarkToAll(text, true)
if self.marker.text~=text then
self.marker:UpdateText(text)
end
end
return self
@@ -2164,7 +2325,6 @@ function AUFTRAG:GetDCSMissionTask()
local DCStask=CONTROLLABLE.EnRouteTaskAWACS(nil)
table.insert(self.enrouteTasks, DCStask)
--table.insert(DCStasks, DCStask)
elseif self.type==AUFTRAG.Type.BAI then
@@ -2236,7 +2396,7 @@ function AUFTRAG:GetDCSMissionTask()
-- ESCORT Mission --
--------------------
local DCStask=CONTROLLABLE.TaskEscort(nil, self.escortGroup, self.escortVec3, LastWaypointIndex, self.engageMaxDistance, self.engageTargetTypes)
local DCStask=CONTROLLABLE.TaskEscort(nil, self.engageTarget.Target, self.escortVec3, LastWaypointIndex, self.engageMaxDistance, self.engageTargetTypes)
table.insert(DCStasks, DCStask)
@@ -2257,6 +2417,8 @@ function AUFTRAG:GetDCSMissionTask()
-- FERRY Mission --
-------------------
-- TODO: Ferry mission type. How?
elseif self.type==AUFTRAG.Type.INTERCEPT then
-----------------------
@@ -2303,9 +2465,9 @@ function AUFTRAG:GetDCSMissionTask()
elseif self.type==AUFTRAG.Type.STRIKE then
-------------------
-- STIKE Mission --
-------------------
--------------------
-- STRIKE Mission --
--------------------
local Vec2=self:GetTargetCoordinate():GetVec2()
@@ -2329,11 +2491,11 @@ function AUFTRAG:GetDCSMissionTask()
-- TRANSPORT Mission --
-----------------------
-- TODO: What about the groups to embark?
-- TODO: What about the groups to embark? And where to go?
local Vec2=self.transportPickup:GetVec2()
local DCStask=CONTROLLABLE.TaskEmbarking(self, Vec2, self.transportGroupSet, Duration, DistributionGroupSet)
local DCStask=CONTROLLABLE.TaskEmbarking(self, Vec2, self.transportGroupSet, 120, DistributionGroupSet)
table.insert(DCStasks, DCStask)
@@ -2351,7 +2513,6 @@ function AUFTRAG:GetDCSMissionTask()
param.unitname=self:GetTargetName()
param.offsetX=200
param.offsetZ=240
--param.offsetY=20
param.altitude=70
param.dtFollow=1.0
@@ -2376,10 +2537,8 @@ function AUFTRAG:GetDCSMissionTask()
-------------------
-- ORBIT Mission --
-------------------
local CoordRaceTrack=self.orbitCoord:Translate(self.orbitLeg, self.orbitHeading, true)
local DCStask=CONTROLLABLE.TaskOrbit(nil, self.orbitCoord, self.orbitCoord.y, self.orbitSpeed, CoordRaceTrack)
local DCStask=CONTROLLABLE.TaskOrbit(nil, self.engageTarget.Target, self.orbitAltitude, self.orbitSpeed, self.orbitRaceTrack)
table.insert(DCStasks, DCStask)
@@ -2435,27 +2594,69 @@ function AUFTRAG:_TargetFromObject(Object)
target.Type=AUFTRAG.TargetType.GROUP
local object=Object --Wrapper.Group#GROUP
target.Name=object:GetName()
elseif Object:IsInstanceOf("UNIT") then
target.Type=AUFTRAG.TargetType.UNIT
target.Type=AUFTRAG.TargetType.UNIT
local object=Object --Wrapper.Unit#UNIT
target.Name=object:GetName()
elseif Object:IsInstanceOf("STATIC") then
target.Type=AUFTRAG.TargetType.STATIC
target.Name=Object:GetName()
elseif Object:IsInstanceOf("COORDINATE") then
target.Type=AUFTRAG.TargetType.COORDINATE
local object=Object --Core.Point#COORDINATE
target.Name=object:ToStringLLDMS()
elseif Object:IsInstanceOf("AIRBASE") then
target.Type=AUFTRAG.TargetType.AIRBASE
local object=Object --Wrapper.Airbase#AIRBASE
target.Name=object:GetName()
target.Nalive=1
elseif Object:IsInstanceOf("SET_GROUP") then
target.Type=AUFTRAG.TargetType.SETGROUP
local object=Object --Core.Set#SET_GROUP
target.Name=object:GetFirst():GetName()
elseif Object:IsInstanceOf("SET_UNIT") then
target.Type=AUFTRAG.TargetType.SETUNIT
local object=Object --Core.Set#SET_UNIT
target.Name=object:GetFirst():GetName()
else
self:E(self.lid.."ERROR: Unknown object given as target. Needs to be a GROUP, UNIT, STATIC, COORDINATE")
return nil
end
-- Set engage Target.
self.engageTarget=target
self.engageTarget.Ninital=self:CountMissionTargets()
self:I(self.lid..string.format("Mission Target Type=%s", target.Type))
return target
+7 -7
View File
@@ -1538,7 +1538,7 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To)
-- Distance travelled
---
if self.verbose>1 then
if self.verbose>1 and self:IsAlive() and self.position then
local time=timer.getAbsTime()
@@ -3665,9 +3665,9 @@ end
-- @param Ops.Auftrag#AUFTRAG Mission The mission table.
function FLIGHTGROUP:onafterMissionStart(From, Event, To, Mission)
local text=string.format("Starting Mission %s", tostring(Mission.name))
local text=string.format("Starting %s Mission %s, target %s", Mission.type, tostring(Mission.name), Mission:GetTargetName())
self:T(self.lid..text)
MESSAGE:New(text, 120, self.lid):ToAllIf(true)
MESSAGE:New(text, 30, self.groupname):ToAllIf(true)
-- Set current mission.
self.currentmission=Mission.auftragsnummer
@@ -3691,9 +3691,9 @@ end
-- @param Ops.Auftrag#AUFTRAG Mission The mission table.
function FLIGHTGROUP:onafterMissionExecute(From, Event, To, Mission)
local text=string.format("Executing Mission %s", tostring(Mission.name))
local text=string.format("Executing %s Mission %s, target %s", Mission.type, tostring(Mission.name), Mission:GetTargetName())
self:T(self.lid..text)
MESSAGE:New(text, 120, self.lid):ToAllIf(true)
MESSAGE:New(text, 30, self.groupname):ToAllIf(true)
-- Set flight mission status to EXECUTING.
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.EXECUTING)
@@ -3805,7 +3805,7 @@ function FLIGHTGROUP:onafterMissionDone(From, Event, To, Mission)
-- Debug info.
local text=string.format("Mission %s DONE!", Mission.name)
self:I(self.lid..text)
MESSAGE:New(text, 120, self.lid):ToAllIf(true)
MESSAGE:New(text, 30, self.groupname):ToAllIf(true)
-- Set Flight status.
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.DONE)
@@ -3861,7 +3861,7 @@ function FLIGHTGROUP:RouteToMission(mission, delay)
-- TODO: better marker text, mission.maker
--mission.marker=waypointcoord:MarkToCoalition(mission.name, self:GetCoalition(), true)
mission.marker=waypointcoord:MarkToAll(string.format("%s %s %s", mission.name, mission.type, self.groupname), true)
--mission.marker=waypointcoord:MarkToAll(string.format("%s %s %s", mission.name, mission.type, self.groupname), true)
if mission.optionROE then