diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 894d6b421..a7d1c9210 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -418,6 +418,7 @@ AUFTRAG.Type={ BARRAGE="Barrage", ARMORATTACK="Armor Attack", CASENHANCED="CAS Enhanced", + HOVER="Hover", } --- Mission status of an assigned group. @@ -440,6 +441,7 @@ AUFTRAG.SpecialTask={ ARMOREDGUARD="ArmoredGuard", BARRAGE="Barrage", ARMORATTACK="AmorAttack", + HOVER="Hover", } --- Mission status. @@ -560,7 +562,7 @@ AUFTRAG.Category={ --- AUFTRAG class version. -- @field #string version -AUFTRAG.version="0.8.4" +AUFTRAG.version="0.8.5" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -913,6 +915,44 @@ function AUFTRAG:NewANTISHIP(Target, Altitude) return mission end +--- **[AIR/HELICOPTER]** Create an HOVER mission. +-- @param #AUFTRAG self +-- @param Core.Point#COORDINATE Coordinate Where to hover. +-- @param #number Altitude Hover altitude in feet AGL. Default is 50 feet above ground. +-- @param #number Time Time in seconds to hold the hover. Default 300 seconds. +-- @param #number Speed Speed in knots to fly to the target coordinate. Default 150kn. +-- @param #number MissionAlt Altitide to fly towards the mission in feet AGL. Default 1000ft. +-- @return #AUFTRAG self +function AUFTRAG:NewHOVER(Coordinate, Altitude, Time, Speed, MissionAlt) + + local mission=AUFTRAG:New(AUFTRAG.Type.HOVER) + + -- Altitude. + if Altitude then + mission.hoverAltitude=Coordinate:GetLandHeight()+UTILS.FeetToMeters(Altitude) + else + mission.hoverAltitude=Coordinate:GetLandHeight()+UTILS.FeetToMeters(50) + end + + mission:_TargetFromObject(Coordinate) + + mission.hoverSpeed = 0.1 -- the DCS Task itself will shortly be build with this so MPS + mission.hoverTime = Time or 300 + mission.missionSpeed = UTILS.KnotsToMps(Speed or 150) + + -- Mission options: + mission.missionAltitude=mission.MissionAlt or UTILS.FeetToMeters(1000) + mission.missionFraction=0.9 + mission.optionROE=ENUMS.ROE.ReturnFire + mission.optionROT=ENUMS.ROT.PassiveDefense + + mission.categories={AUFTRAG.Category.AIRCRAFT} + + mission.DCStask=mission:GetDCSMissionTask() + + return mission +end + --- **[AIR]** Create an ORBIT mission, which can be either a circular orbit or a race-track pattern. -- @param #AUFTRAG self -- @param Core.Point#COORDINATE Coordinate Where to orbit. @@ -5100,7 +5140,40 @@ function AUFTRAG:GetDCSMissionTask(TaskControllable) DCStask.params=param table.insert(DCStasks, DCStask) + + elseif self.type==AUFTRAG.Type.HOVER then + --------------------- + -- HOVER Mission -- + --------------------- + + local DCStask={} + DCStask.id=AUFTRAG.SpecialTask.HOVER + + local param={} + + param.hoverAltitude=self.hoverAltitude + param.hoverTime = self.hoverTime + param.missionSpeed = self.missionSpeed + param.missionAltitude = self.missionAltitude + + DCStask.params=param + + --[[ Task script. + local DCSScript = {} + + local altitude = self.hoverAltitude + DCSScript[#DCSScript+1] = 'local group = ...' + DCSScript[#DCSScript+1] = 'local helo = GROUP:Find(group)' + DCSScript[#DCSScript+1] = 'helo:SetSpeed(0.1,true)' + DCSScript[#DCSScript+1] = string.format('helo:SetAltitude(UTILS.FeetToMeters(%d),true,"BARO")',altitude) -- Call the function, e.g. myfunction.(warehouse,mygroup) + + -- Create task. + local DCSTask=CONTROLLABLE.TaskWrappedAction(self, CONTROLLABLE.CommandDoScript(self, table.concat(DCSScript))) + --]] + + table.insert(DCStasks, DCStask) + elseif self.type==AUFTRAG.Type.ONGUARD or self.type==AUFTRAG.Type.ARMOREDGUARD then ---------------------- @@ -5238,6 +5311,8 @@ function AUFTRAG:GetMissionTaskforMissionType(MissionType) mtask=ENUMS.MissionTask.TRANSPORT elseif MissionType==AUFTRAG.Type.ARMORATTACK then mtask=ENUMS.MissionTask.NOTHING + elseif MissionType==AUFTRAG.Type.HOVER then + mtask=ENUMS.MissionTask.NOTHING end return mtask diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 2f5582908..04302153e 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -1902,6 +1902,9 @@ function FLIGHTGROUP:onbeforeUpdateRoute(From, Event, To, n, N) elseif task.dcstask.id=="ReconMission" then -- For recon missions, we need to allow the update as we insert new waypoints. self:T2(self.lid.."Allowing update route for Task: ReconMission") + elseif task.dcstask.id=="Hover" then + -- For recon missions, we need to allow the update as we insert new waypoints. + self:T2(self.lid.."Allowing update route for Task: Hover") elseif task.description and task.description=="Task_Land_At" then -- We allow this self:T2(self.lid.."Allowing update route for Task: Task_Land_At") diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index 21baf01fd..82183252c 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -697,6 +697,8 @@ function OPSGROUP:New(group) self:AddTransition("*", "TransportCancel", "*") -- Cancel (current) transport. + self:AddTransition("*", "HoverStart", "*") -- Helo group is hovering + self:AddTransition("*", "HoverEnd", "*") -- Helo group is flying on ------------------------ --- Pseudo Functions --- ------------------------ @@ -798,6 +800,19 @@ function OPSGROUP:New(group) -- @param #string To To state. -- @param Ops.Auftrag#AUFTRAG Mission The mission. + --- On after "HoverStart" event. + -- @function [parent=#OPSGROUP] OnAfterHoverStart + -- @param #OPSGROUP self + -- @param #string From From state. + -- @param #string Event Event. + -- @param #string To To state. + + --- On after "HoverEnd" event. + -- @function [parent=#OPSGROUP] OnAfterHoverEnd + -- @param #OPSGROUP self + -- @param #string From From state. + -- @param #string Event Event. + -- @param #string To To state. --- Triggers the FSM event "TransportCancel". -- @function [parent=#OPSGROUP] TransportCancel @@ -3542,11 +3557,11 @@ end -- @param #string To To state. -- @param Ops.OpsGroup#OPSGROUP.Task Task The task. function OPSGROUP:onafterTaskExecute(From, Event, To, Task) - + self:T({Task}) -- Debug message. local text=string.format("Task %s ID=%d execute", tostring(Task.description), Task.id) self:T(self.lid..text) - + self:T({Task}) -- Cancel current task if there is any. if self.taskcurrent>0 then self:TaskCancel() @@ -3702,7 +3717,35 @@ function OPSGROUP:onafterTaskExecute(From, Event, To, Task) else -- FLIGHTGROUP not implemented (intended!) for this AUFTRAG type. end - + + --- + -- Task "Hover" Mission. + --- + + elseif Task.dcstask.id==AUFTRAG.SpecialTask.HOVER then + if self.isFlightgroup then + self:T("We are Special Auftrag HOVER, hovering now ...") + --self:I({Task.dcstask.params}) + local alt = Task.dcstask.params.hoverAltitude + local time =Task.dcstask.params.hoverTime + local Speed=UTILS.MpsToKnots(Task.dcstask.params.missionSpeed) or UTILS.KmphToKnots(self.speedCruise) + local CruiseAlt = UTILS.FeetToMeters(Task.dcstask.params.missionAltitude) + local helo = self:GetGroup() + helo:SetSpeed(0.01,true) + helo:SetAltitude(alt,true,"BARO") + self:HoverStart() + local function FlyOn(Helo,Speed,CruiseAlt,Task) + if Helo then + Helo:SetSpeed(Speed,true) + Helo:SetAltitude(CruiseAlt,true,"BARO") + self:T("We are Special Auftrag HOVER, end of hovering now ...") + self:TaskDone(Task) + self:HoverEnd() + end + end + local timer = TIMER:New(FlyOn,helo,Speed,CruiseAlt,Task) + timer:Start(time) + end else -- If task is scheduled (not waypoint) set task. @@ -4590,7 +4633,12 @@ function OPSGROUP:RouteToMission(mission, delay) else waypointcoord=mission:GetMissionWaypointCoord(self.group, randomradius, surfacetypes) end - + + if mission.type==AUFTRAG.Type.HOVER then + local zone=mission.engageTarget:GetObject() --Core.Zone#ZONE + waypointcoord=zone:GetCoordinate() + end + local armorwaypointcoord = nil if mission.type==AUFTRAG.Type.ARMORATTACK then local target=mission.engageTarget:GetObject() -- Wrapper.Positionable#POSITIONABLE