diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 93327ab62..2826969bb 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -912,7 +912,7 @@ do -- COORDINATE -- The text will reflect the temperature like this: -- -- - For Russian and European aircraft using the metric system - Degrees Celcius (°C) - -- - For American aircraft we link to the imperial system - Degrees Farenheit (°F) + -- - For American aircraft we link to the imperial system - Degrees Fahrenheit (°F) -- -- A text containing a pressure will look like this: -- @@ -932,7 +932,7 @@ do -- COORDINATE if Settings:IsMetric() then return string.format( " %-2.2f °C", DegreesCelcius ) else - return string.format( " %-2.2f °F", UTILS.CelciusToFarenheit( DegreesCelcius ) ) + return string.format( " %-2.2f °F", UTILS.CelsiusToFahrenheit( DegreesCelcius ) ) end else return " no temperature" diff --git a/Moose Development/Moose/Functional/PseudoATC.lua b/Moose Development/Moose/Functional/PseudoATC.lua index 1143b00e8..7358dda2c 100644 --- a/Moose Development/Moose/Functional/PseudoATC.lua +++ b/Moose Development/Moose/Functional/PseudoATC.lua @@ -742,7 +742,7 @@ function PSEUDOATC:ReportWeather(GID, UID, position, location) local T=position:GetTemperature() -- Correct unit system. - local _T=string.format('%d°F', UTILS.CelciusToFarenheit(T)) + local _T=string.format('%d°F', UTILS.CelsiusToFahrenheit(T)) if settings:IsMetric() then _T=string.format('%d°C', T) end diff --git a/Moose Development/Moose/Functional/Range.lua b/Moose Development/Moose/Functional/Range.lua index 9da579d6d..255672be1 100644 --- a/Moose Development/Moose/Functional/Range.lua +++ b/Moose Development/Moose/Functional/Range.lua @@ -2762,7 +2762,7 @@ function RANGE:_DisplayRangeWeather(_unitname) local tW=string.format("%.1f m/s", Ws) local tP=string.format("%.1f mmHg", P*hPa2mmHg) if settings:IsImperial() then - --tT=string.format("%d°F", UTILS.CelciusToFarenheit(T)) + --tT=string.format("%d°F", UTILS.CelsiusToFahrenheit(T)) tW=string.format("%.1f knots", UTILS.MpsToKnots(Ws)) tP=string.format("%.2f inHg", P*hPa2inHg) end diff --git a/Moose Development/Moose/Ops/ATIS.lua b/Moose Development/Moose/Ops/ATIS.lua index f865f98be..113359cf0 100644 --- a/Moose Development/Moose/Ops/ATIS.lua +++ b/Moose Development/Moose/Ops/ATIS.lua @@ -1459,8 +1459,8 @@ function ATIS:onafterBroadcast(From, Event, To) -- Convert to °F. if self.TDegF then - temperature=UTILS.CelciusToFarenheit(temperature) - dewpoint=UTILS.CelciusToFarenheit(dewpoint) + temperature=UTILS.CelsiusToFahrenheit(temperature) + dewpoint=UTILS.CelsiusToFahrenheit(dewpoint) end local TEMPERATURE=string.format("%d", math.abs(temperature)) diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 846a0c9d0..9d4ee753f 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. @@ -5110,7 +5150,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 ---------------------- @@ -5248,6 +5321,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 diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index 0244ee757..12f8e7515 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -473,10 +473,10 @@ UTILS.KnotsToMps = function( knots ) end end ---- Convert temperature from Celsius to Farenheit. +--- Convert temperature from Celsius to Fahrenheit. -- @param #number Celcius Temperature in degrees Celsius. --- @return #number Temperature in degrees Farenheit. -UTILS.CelciusToFarenheit = function( Celcius ) +-- @return #number Temperature in degrees Fahrenheit. +UTILS.CelsiusToFahrenheit = function( Celcius ) return Celcius * 9/5 + 32 end