diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index e6ab285ba..17feaa492 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -265,6 +265,18 @@ do -- SET_BASE end + --- Sort the set by name. + -- @param #SET_BASE self + -- @return Core.Base#BASE The added BASE Object. + function SET_BASE:SortByName() + + local function sort(a, b) + return a0! Task description = %s", self.taskcurrent, tostring(taskname))) diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index be7b577b1..2ba6a7322 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -556,7 +556,6 @@ function OPSGROUP:New(group) self:AddTransition("*", "Damaged", "*") -- Someone in the group took damage. self:AddTransition("*", "UpdateRoute", "*") -- Update route of group. Only if airborne. - self:AddTransition("*", "PassingWaypoint", "*") -- Passing waypoint. self:AddTransition("*", "Wait", "*") -- Group will wait for further orders. @@ -3031,8 +3030,13 @@ function OPSGROUP:onafterTaskExecute(From, Event, To, Task) -- Parameters. local zone=Task.dcstask.params.zone --Core.Zone#ZONE + + -- Random coordinate in zone. local Coordinate=zone:GetRandomCoordinate() - Coordinate:MarkToAll("Random Patrol Zone Coordinate") + + --Coordinate:MarkToAll("Random Patrol Zone Coordinate") + + -- Speed and altitude. local Speed=UTILS.KmphToKnots(Task.dcstask.params.speed or self.speedCruise) local Altitude=Task.dcstask.params.altitude and UTILS.MetersToFeet(Task.dcstask.params.altitude) or nil @@ -3045,6 +3049,37 @@ function OPSGROUP:onafterTaskExecute(From, Event, To, Task) NAVYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) end + elseif Task.dcstask.id=="ReconMission" then + + --- + -- Task recon. + --- + + -- Target + local target=Task.dcstask.params.target --Ops.Target#TARGET + Task.dcstask.params.lastindex=1 + + local object=target.targets[1] --Ops.Target#TARGET.Object + local zone=object.Object --Core.Zone#ZONE + + -- Random coordinate in zone. + local Coordinate=zone:GetRandomCoordinate() + + -- Speed and altitude. + local Speed=UTILS.KmphToKnots(Task.dcstask.params.speed or self.speedCruise) + local Altitude=Task.dcstask.params.altitude and UTILS.MetersToFeet(Task.dcstask.params.altitude) or nil + + --Coordinate:MarkToAll("Next waypoint", ReadOnly,Text) + + -- New waypoint. + if self.isFlightgroup then + FLIGHTGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) + elseif self.isNavygroup then + ARMYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Formation) + elseif self.isArmygroup then + NAVYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) + end + else -- If task is scheduled (not waypoint) set task. @@ -3135,6 +3170,8 @@ function OPSGROUP:onafterTaskCancel(From, Event, To, Task) done=true elseif Task.dcstask.id=="PatrolZone" then done=true + elseif Task.dcstask.id=="ReconMission" then + done=true elseif stopflag==1 or (not self:IsAlive()) or self:IsDead() or self:IsStopped() then -- Manual call TaskDone if setting flag to one was not successful. done=true @@ -4000,8 +4037,13 @@ function OPSGROUP:onafterPassingWaypoint(From, Event, To, Waypoint) -- Remove old waypoint. self:RemoveWaypointByID(Waypoint.uid) + -- Zone object. local zone=task.dcstask.params.zone --Core.Zone#ZONE + + -- Random coordinate in zone. local Coordinate=zone:GetRandomCoordinate() + + -- Speed and altitude. local Speed=UTILS.KmphToKnots(task.dcstask.params.speed or self.speedCruise) local Altitude=task.dcstask.params.altitude and UTILS.MetersToFeet(task.dcstask.params.altitude) or nil @@ -4012,6 +4054,59 @@ function OPSGROUP:onafterPassingWaypoint(From, Event, To, Waypoint) elseif self.isArmygroup then NAVYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) end + + elseif task and task.dcstask.id=="ReconMission" then + + local target=task.dcstask.params.target --Ops.Target#TARGET + + local n=task.dcstask.params.lastindex+1 + + if n<=#target.targets then + + -- Zone object. + local object=target.targets[n] --Ops.Target#TARGET.Object + local zone=object.Object --Core.Zone#ZONE + + -- Random coordinate in zone. + local Coordinate=zone:GetRandomCoordinate() + + -- Speed and altitude. + local Speed=UTILS.KmphToKnots(task.dcstask.params.speed or self.speedCruise) + local Altitude=task.dcstask.params.altitude and UTILS.MetersToFeet(task.dcstask.params.altitude) or nil + + -- Debug. + --Coordinate:MarkToAll("Recon Waypoint n="..tostring(n)) + + if self.isFlightgroup then + FLIGHTGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) + elseif self.isNavygroup then + ARMYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Formation) + elseif self.isArmygroup then + NAVYGROUP.AddWaypoint(self, Coordinate, Speed, AfterWaypointWithID, Altitude) + end + + -- Increase counter. + task.dcstask.params.lastindex=task.dcstask.params.lastindex+1 + + else + + -- Get waypoint index. + local wpindex=self:GetWaypointIndex(Waypoint.uid) + + -- Final waypoint reached? + if wpindex==nil or wpindex==#self.waypoints then + + -- Set switch to true. + if not self.adinfinitum or #self.waypoints<=1 then + self.passedfinalwp=true + end + + end + + -- Final zone reached ==> task done. + self:TaskDone(task) + + end else diff --git a/Moose Development/Moose/Ops/Target.lua b/Moose Development/Moose/Ops/Target.lua index 756204b09..9d08774a6 100644 --- a/Moose Development/Moose/Ops/Target.lua +++ b/Moose Development/Moose/Ops/Target.lua @@ -260,6 +260,17 @@ function TARGET:AddObject(Object) self:AddObject(object) end + elseif Object:IsInstanceOf("SET_ZONE") then + + local set=Object --Core.Set#SET_ZONE + + set:SortByName() + + for index,ZoneName in pairs(set.Index) do + local zone=set.Set[ZoneName] --Core.Zone#ZONE + self:_AddObject(zone) + end + else --- @@ -971,6 +982,12 @@ function TARGET:GetTargetName(Target) local coord=Target.Object --Core.Point#COORDINATE return coord:ToStringMGRS() + + elseif Target.Type==TARGET.ObjectType.ZONE then + + local Zone=Target.Object --Core.Zone#ZONE + + return Zone:GetName() end