diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index 0ada59e71..68807904b 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -410,7 +410,7 @@ do -- FSM Transition.To = To -- Debug message. - self:T2( Transition ) + self:T3( Transition ) self._Transitions[Transition] = Transition self:_eventmap( self.Events, Transition ) @@ -432,7 +432,7 @@ do -- FSM -- @param #table ReturnEvents A table indicating for which returned events of the SubFSM which Event must be triggered in the FSM. -- @return Core.Fsm#FSM_PROCESS The SubFSM. function FSM:AddProcess( From, Event, Process, ReturnEvents ) - self:T( { From, Event } ) + self:T3( { From, Event } ) local Sub = {} Sub.From = From @@ -533,7 +533,7 @@ do -- FSM Process._Scores[State].ScoreText = ScoreText Process._Scores[State].Score = Score - self:T( Process._Scores ) + self:T3( Process._Scores ) return Process end @@ -576,7 +576,7 @@ do -- FSM self[__Event] = self[__Event] or self:_delayed_transition(Event) -- Debug message. - self:T2( "Added methods: " .. Event .. ", " .. __Event ) + self:T3( "Added methods: " .. Event .. ", " .. __Event ) Events[Event] = self.Events[Event] or { map = {} } self:_add_to_map( Events[Event].map, EventStructure ) @@ -825,7 +825,7 @@ do -- FSM end -- Debug. - self:T2( { CallID = CallID } ) + self:T3( { CallID = CallID } ) end end @@ -846,7 +846,7 @@ do -- FSM function FSM:_gosub( ParentFrom, ParentEvent ) local fsmtable = {} if self.subs[ParentFrom] and self.subs[ParentFrom][ParentEvent] then - self:T( { ParentFrom, ParentEvent, self.subs[ParentFrom], self.subs[ParentFrom][ParentEvent] } ) + self:T3( { ParentFrom, ParentEvent, self.subs[ParentFrom], self.subs[ParentFrom][ParentEvent] } ) return self.subs[ParentFrom][ParentEvent] else return {} @@ -1150,7 +1150,7 @@ do -- FSM_PROCESS -- @param #FSM_PROCESS self -- @return #FSM_PROCESS function FSM_PROCESS:Copy( Controllable, Task ) - self:T( { self:GetClassNameAndID() } ) + self:T3( { self:GetClassNameAndID() } ) local NewFsm = self:New( Controllable, Task ) -- Core.Fsm#FSM_PROCESS @@ -1176,13 +1176,13 @@ do -- FSM_PROCESS -- Copy End States for EndStateID, EndState in pairs( self:GetEndStates() ) do - self:T( EndState ) + self:T3( EndState ) NewFsm:AddEndState( EndState ) end -- Copy the score tables for ScoreID, Score in pairs( self:GetScores() ) do - self:T( Score ) + self:T3( Score ) NewFsm:AddScore( ScoreID, Score.ScoreText, Score.Score ) end diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 1c28e0730..b450eebbf 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -26,19 +26,28 @@ -- -- ### Authors: -- --- * FlightControl : Design & Programming +-- * FlightControl (Design & Programming) -- -- ### Contributions: +-- +-- * funkyfranky +-- * Applevangelist +-- +-- === -- -- @module Core.Point -- @image Core_Coordinate.JPG - - do -- COORDINATE --- @type COORDINATE + -- @field #string ClassName Name of the class + -- @field #number x Component of the 3D vector. + -- @field #number y Component of the 3D vector. + -- @field #number z Component of the 3D vector. + -- @field #number Heading Heading in degrees. Needs to be set first. + -- @field #number Velocity Velocity in meters per second. Needs to be set first. -- @extends Core.Base#BASE @@ -201,13 +210,24 @@ do -- COORDINATE ClassName = "COORDINATE", } - --- @field COORDINATE.WaypointAltType + --- Waypoint altitude types. + -- @type COORDINATE.WaypointAltType + -- @field #string BARO Barometric altitude. + -- @field #string RADIO Radio altitude. COORDINATE.WaypointAltType = { BARO = "BARO", RADIO = "RADIO", } - --- @field COORDINATE.WaypointAction + --- Waypoint actions. + -- @type COORDINATE.WaypointAction + -- @field #string TurningPoint Turning point. + -- @field #string FlyoverPoint Fly over point. + -- @field #string FromParkingArea From parking area. + -- @field #string FromParkingAreaHot From parking area hot. + -- @field #string FromRunway From runway. + -- @field #string Landing Landing. + -- @field #string LandingReFuAr Landing and refuel and rearm. COORDINATE.WaypointAction = { TurningPoint = "Turning Point", FlyoverPoint = "Fly Over Point", @@ -218,7 +238,14 @@ do -- COORDINATE LandingReFuAr = "LandingReFuAr", } - --- @field COORDINATE.WaypointType + --- Waypoint types. + -- @type COORDINATE.WaypointType + -- @field #string TakeOffParking Take of parking. + -- @field #string TakeOffParkingHot Take of parking hot. + -- @field #string TakeOff Take off parking hot. + -- @field #string TurningPoint Turning point. + -- @field #string Land Landing point. + -- @field #string LandingReFuAr Landing and refuel and rearm. COORDINATE.WaypointType = { TakeOffParking = "TakeOffParking", TakeOffParkingHot = "TakeOffParkingHot", @@ -232,13 +259,13 @@ do -- COORDINATE --- COORDINATE constructor. -- @param #COORDINATE self -- @param DCS#Distance x The x coordinate of the Vec3 point, pointing to the North. - -- @param DCS#Distance y The y coordinate of the Vec3 point, pointing to the Right. - -- @param DCS#Distance z The z coordinate of the Vec3 point, pointing to the Right. - -- @return #COORDINATE + -- @param DCS#Distance y The y coordinate of the Vec3 point, pointing to up. + -- @param DCS#Distance z The z coordinate of the Vec3 point, pointing to the right. + -- @return #COORDINATE self function COORDINATE:New( x, y, z ) - --env.info("FF COORDINATE New") - local self = BASE:Inherit( self, BASE:New() ) -- #COORDINATE + local self=BASE:Inherit(self, BASE:New()) -- #COORDINATE + self.x = x self.y = y self.z = z @@ -249,7 +276,7 @@ do -- COORDINATE --- COORDINATE constructor. -- @param #COORDINATE self -- @param #COORDINATE Coordinate. - -- @return #COORDINATE + -- @return #COORDINATE self function COORDINATE:NewFromCoordinate( Coordinate ) local self = BASE:Inherit( self, BASE:New() ) -- #COORDINATE @@ -263,8 +290,8 @@ do -- COORDINATE --- Create a new COORDINATE object from Vec2 coordinates. -- @param #COORDINATE self -- @param DCS#Vec2 Vec2 The Vec2 point. - -- @param DCS#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. - -- @return #COORDINATE + -- @param DCS#Distance LandHeightAdd (Optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. + -- @return #COORDINATE self function COORDINATE:NewFromVec2( Vec2, LandHeightAdd ) local LandHeight = land.getHeight( Vec2 ) @@ -274,8 +301,6 @@ do -- COORDINATE local self = self:New( Vec2.x, LandHeight, Vec2.y ) -- #COORDINATE - self:F2( self ) - return self end @@ -283,7 +308,7 @@ do -- COORDINATE --- Create a new COORDINATE object from Vec3 coordinates. -- @param #COORDINATE self -- @param DCS#Vec3 Vec3 The Vec3 point. - -- @return #COORDINATE + -- @return #COORDINATE self function COORDINATE:NewFromVec3( Vec3 ) local self = self:New( Vec3.x, Vec3.y, Vec3.z ) -- #COORDINATE @@ -292,6 +317,22 @@ do -- COORDINATE return self end + + --- Create a new COORDINATE object from a waypoint. This uses the components + -- + -- * `waypoint.x` + -- * `waypoint.alt` + -- * `waypoint.y` + -- + -- @param #COORDINATE self + -- @param DCS#Waypoint Waypoint The waypoint. + -- @return #COORDINATE self + function COORDINATE:NewFromWaypoint(Waypoint) + + local self=self:New(Waypoint.x, Waypoint.alt, Waypoint.y) -- #COORDINATE + + return self + end --- Return the coordinates itself. Sounds stupid but can be useful for compatibility. -- @param #COORDINATE self @@ -1720,7 +1761,7 @@ do -- COORDINATE return self:GetSurfaceType()==land.SurfaceType.LAND end - --- Checks if the surface type is road. + --- Checks if the surface type is land. -- @param #COORDINATE self -- @return #boolean If true, the surface type at the coordinate is land. function COORDINATE:IsSurfaceTypeLand() @@ -2082,7 +2123,7 @@ do -- COORDINATE --- Circle to all. -- Creates a circle on the map with a given radius, color, fill color, and outline. -- @param #COORDINATE self - -- @param #numberr Radius Radius in meters. Default 1000 m. + -- @param #number Radius Radius in meters. Default 1000 m. -- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All. -- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default). -- @param #number Alpha Transparency [0,1]. Default 1. diff --git a/Moose Development/Moose/Ops/ArmyGroup.lua b/Moose Development/Moose/Ops/ArmyGroup.lua index 9506a270b..b0c0b2c91 100644 --- a/Moose Development/Moose/Ops/ArmyGroup.lua +++ b/Moose Development/Moose/Ops/ArmyGroup.lua @@ -141,7 +141,7 @@ function ARMYGROUP:New(group) -- Init waypoints. - self:InitWaypoints() + self:_InitWaypoints() -- Initialize the group. self:_InitGroup() @@ -1115,8 +1115,9 @@ end --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. -- @param #ARMYGROUP self +-- @param #table Template Template used to init the group. Default is `self.template`. -- @return #ARMYGROUP self -function ARMYGROUP:_InitGroup() +function ARMYGROUP:_InitGroup(Template) -- First check if group was already initialized. if self.groupinitialized then @@ -1125,7 +1126,7 @@ function ARMYGROUP:_InitGroup() end -- Get template of group. - self.template=self.group:GetTemplate() + local template=Template or self:_GetTemplate() -- Define category. self.isAircraft=false @@ -1136,7 +1137,7 @@ function ARMYGROUP:_InitGroup() self.isAI=true -- Is (template) group late activated. - self.isLateActivated=self.template.lateActivation + self.isLateActivated=template.lateActivation -- Ground groups cannot be uncontrolled. self.isUncontrolled=false diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 5b15572ee..a10db29bf 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -306,7 +306,7 @@ function FLIGHTGROUP:New(group) self:HandleEvent(EVENTS.Kill, self.OnEventKill) -- Init waypoints. - self:InitWaypoints() + self:_InitWaypoints() -- Initialize group. self:_InitGroup() @@ -1478,7 +1478,7 @@ function FLIGHTGROUP:onafterElementTakeoff(From, Event, To, Element, airbase) self:_UpdateStatus(Element, OPSGROUP.ElementStatus.TAKEOFF, airbase) -- Trigger element airborne event. - self:__ElementAirborne(0.1, Element) + self:__ElementAirborne(0.01, Element) end @@ -1750,7 +1750,7 @@ function FLIGHTGROUP:onafterAirborne(From, Event, To) self.currbase=nil -- Cruising. - self:__Cruise(-0.05) + self:__Cruise(-0.01) end @@ -1882,7 +1882,7 @@ function FLIGHTGROUP:onafterArrived(From, Event, To) SpawnPoint.airdromeId = nil -- Airbase. - local airbase=self.isLandingAtAirbase + local airbase=self.isLandingAtAirbase --Wrapper.Airbase#AIRBASE -- Get airbase ID and category. local AirbaseID = airbase:GetID() @@ -1909,7 +1909,7 @@ function FLIGHTGROUP:onafterArrived(From, Event, To) local unit=units[i] local element=self:GetElementByName(unit.name) if element and element.status~=OPSGROUP.ElementStatus.DEAD then - unit.parking=element.parking.TerminalID + unit.parking=element.parking and element.parking.TerminalID or nil unit.parking_id=nil local vec3=element.unit:GetVec3() local heading=element.unit:GetHeading() @@ -2415,6 +2415,10 @@ function FLIGHTGROUP:_LandAtAirbase(airbase, SpeedTo, SpeedHold, SpeedLand) -- Passed final waypoint! self.passedfinalwp=true + + -- Not waiting any more. + self.Twaiting=nil + self.dTwait=nil -- Defaults: SpeedTo=SpeedTo or UTILS.KmphToKnots(self.speedCruise) @@ -2469,7 +2473,7 @@ function FLIGHTGROUP:_LandAtAirbase(airbase, SpeedTo, SpeedHold, SpeedLand) -- Set holding flag to 0=false. self.flaghold:Set(0) - local holdtime=1*60 + local holdtime=2*60 if fc or self.airboss then holdtime=nil end @@ -3002,8 +3006,9 @@ end --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. -- @param #FLIGHTGROUP self +-- @param #table Template Template used to init the group. Default is `self.template`. -- @return #FLIGHTGROUP self -function FLIGHTGROUP:_InitGroup() +function FLIGHTGROUP:_InitGroup(Template) -- First check if group was already initialized. if self.groupinitialized then @@ -3015,7 +3020,7 @@ function FLIGHTGROUP:_InitGroup() local group=self.group --Wrapper.Group#GROUP -- Get template of group. - self.template=group:GetTemplate() + local template=Template or self:_GetTemplate() -- Define category. self.isAircraft=true @@ -3026,10 +3031,10 @@ function FLIGHTGROUP:_InitGroup() self.isHelo=group:IsHelicopter() -- Is (template) group uncontrolled. - self.isUncontrolled=self.template.uncontrolled + self.isUncontrolled=template.uncontrolled -- Is (template) group late activated. - self.isLateActivated=self.template.lateActivation + self.isLateActivated=template.lateActivation -- Max speed in km/h. self.speedMax=group:GetSpeedMax() @@ -3044,12 +3049,12 @@ function FLIGHTGROUP:_InitGroup() self.ammo=self:GetAmmoTot() -- Radio parameters from template. Default is set on spawn if not modified by user. - self.radio.Freq=tonumber(self.template.frequency) - self.radio.Modu=tonumber(self.template.modulation) - self.radio.On=self.template.communication + self.radio.Freq=tonumber(template.frequency) + self.radio.Modu=tonumber(template.modulation) + self.radio.On=template.communication -- Set callsign. Default is set on spawn if not modified by user. - local callsign=self.template.units[1].callsign + local callsign=template.units[1].callsign if type(callsign)=="number" then -- Sometimes callsign is just "101". local cs=tostring(callsign) callsign={} @@ -3453,7 +3458,7 @@ function FLIGHTGROUP:IsLandingAirbase(wp) if wp then - if wp.action and wp.action==COORDINATE.WaypointAction.LANDING then + if wp.action and wp.action==COORDINATE.WaypointAction.Landing then return true else return false diff --git a/Moose Development/Moose/Ops/NavyGroup.lua b/Moose Development/Moose/Ops/NavyGroup.lua index 204792dcf..a1209e0db 100644 --- a/Moose Development/Moose/Ops/NavyGroup.lua +++ b/Moose Development/Moose/Ops/NavyGroup.lua @@ -165,7 +165,7 @@ function NAVYGROUP:New(group) -- Init waypoints. - self:InitWaypoints() + self:_InitWaypoints() -- Initialize the group. self:_InitGroup() @@ -1130,8 +1130,9 @@ end --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. -- @param #NAVYGROUP self +-- @param #table Template Template used to init the group. Default is `self.template`. -- @return #NAVYGROUP self -function NAVYGROUP:_InitGroup() +function NAVYGROUP:_InitGroup(Template) -- First check if group was already initialized. if self.groupinitialized then @@ -1140,7 +1141,7 @@ function NAVYGROUP:_InitGroup() end -- Get template of group. - self.template=self.group:GetTemplate() + local template=Template or self:_GetTemplate() -- Define category. self.isAircraft=false @@ -1154,7 +1155,7 @@ function NAVYGROUP:_InitGroup() self.isAI=true -- Is (template) group late activated. - self.isLateActivated=self.template.lateActivation + self.isLateActivated=template.lateActivation -- Naval groups cannot be uncontrolled. self.isUncontrolled=false @@ -1170,8 +1171,8 @@ function NAVYGROUP:_InitGroup() -- Radio parameters from template. Default is set on spawn if not modified by the user. self.radio.On=true -- Radio is always on for ships. - self.radio.Freq=tonumber(self.template.units[1].frequency)/1000000 - self.radio.Modu=tonumber(self.template.units[1].modulation) + self.radio.Freq=tonumber(template.units[1].frequency)/1000000 + self.radio.Modu=tonumber(template.units[1].modulation) -- Set default formation. No really applicable for ships. self.optionDefault.Formation="Off Road" diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index 69b5c1d01..6983f7dba 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -375,6 +375,12 @@ OPSGROUP.TaskType={ -- @field #number MissilesBM Amount of ballistic missiles. -- @field #number MissilesSA Amount of surfe-to-air missiles. +--- Spawn point data. +-- @type OPSGROUP.Spawnpoint +-- @field Core.Point#COORDINATE Coordinate Coordinate where to spawn +-- @field Wrapper.Airbase#AIRBASE Airport Airport where to spawn. +-- @field #table TerminalIDs Terminal IDs, where to spawn the group. It is a table of `#number`s because a group can consist of multiple units. + --- Waypoint data. -- @type OPSGROUP.Waypoint -- @field #number uid Waypoint's unit id, which is a running number. @@ -503,6 +509,9 @@ function OPSGROUP:New(group) return nil end end + + -- Set the template. + self:_SetTemplate() -- Init set of detected units. self.detectedunits=SET_UNIT:New() @@ -3881,7 +3890,7 @@ end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- On before "Wait" event. --- @param #FLIGHTGROUP self +-- @param #OPSGROUP self -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. @@ -4787,7 +4796,7 @@ end -- @param #OPSGROUP self -- @param #number Delay Delay in seconds before respawn happens. Default 0. -- @param DCS#Template Template (optional) The template of the Group retrieved with GROUP:GetTemplate(). If the template is not provided, the template will be retrieved of the group itself. --- @param #boolean Reset Reset positions if TRUE. +-- @param #boolean Reset Reset waypoints and reinit group if `true`. -- @return #OPSGROUP self function OPSGROUP:_Respawn(Delay, Template, Reset) @@ -4799,7 +4808,7 @@ function OPSGROUP:_Respawn(Delay, Template, Reset) self:T2(self.lid.."FF _Respawn") -- Given template or get old. - Template=Template or UTILS.DeepCopy(self.template) + Template=Template or self:_GetTemplate(true) if self:IsAlive() then @@ -4807,6 +4816,8 @@ function OPSGROUP:_Respawn(Delay, Template, Reset) -- Group is ALIVE --- + --[[ + -- Get units. local units=self.group:GetUnits() @@ -4828,6 +4839,29 @@ function OPSGROUP:_Respawn(Delay, Template, Reset) end end + + ]] + + local units=Template.units + + for i=#units,1,-1 do + local unit=units[i] + local element=self:GetElementByName(unit.name) + if element and element.status~=OPSGROUP.ElementStatus.DEAD then + unit.parking=element.parking and element.parking.TerminalID or unit.parking + unit.parking_id=nil + local vec3=element.unit:GetVec3() + local heading=element.unit:GetHeading() + unit.x=vec3.x + unit.y=vec3.z + unit.alt=vec3.y + unit.heading=math.rad(heading) + unit.psi=-unit.heading + else + table.remove(units, i) + end + end + -- Despawn old group. Dont trigger any remove unit event since this is a respawn. self:Despawn(0, true) @@ -4843,28 +4877,6 @@ function OPSGROUP:_Respawn(Delay, Template, Reset) local element=_element --#OPSGROUP.Element self:ElementInUtero(element) end - - - --[[ - - -- Loop over template units. - for UnitID, Unit in pairs(Template.units) do - - local element=self:GetElementByName(Unit.name) - - if element then - local vec3=element.vec3 - local heading=element.heading - Unit.x=vec3.x - Unit.y=vec3.z - Unit.alt=vec3.y - Unit.heading=math.rad(heading) - Unit.psi=-Unit.heading - end - - end - - ]] end @@ -4881,10 +4893,18 @@ function OPSGROUP:_Respawn(Delay, Template, Reset) -- Not dead or destroyed any more. self.isDead=false self.isDestroyed=false - self.Ndestroyed=0 - self:InitWaypoints() - self:_InitGroup() + + self.groupinitialized=false + self.Ndestroyed=0 + self.wpcounter=1 + self.currentwp=1 + + -- Init waypoints. + self:_InitWaypoints() + + -- Init Group. + self:_InitGroup() -- Reset events. --self:ResetEvents() @@ -5827,6 +5847,10 @@ function OPSGROUP:onafterPickup(From, Event, To) -- Add waypoint. if self.isFlightgroup then + + --- + -- Flight Group + --- if airbasePickup then @@ -5872,7 +5896,9 @@ function OPSGROUP:onafterPickup(From, Event, To) elseif self.isNavygroup then + --- -- Navy Group + --- local cwp=self:GetWaypointCurrent() local uid=cwp and cwp.uid or nil @@ -5898,7 +5924,9 @@ function OPSGROUP:onafterPickup(From, Event, To) elseif self.isArmygroup then + --- -- Army Group + --- local cwp=self:GetWaypointCurrent() local uid=cwp and cwp.uid or nil @@ -5972,12 +6000,12 @@ function OPSGROUP:onafterLoading(From, Event, To) else -- Debug info. - self:T(self.lid.."Cannot board carrier!") + self:T(self.lid..string.format("Cannot board carrier! Group %s is NOT (yet) in zone %s", cargo.opsgroup:GetName(), self.cargoTransport.embarkzone:GetName())) end else -- Debug info. - self:T(self.lid.."Cargo NOT in embark zone "..self.cargoTransport.embarkzone:GetName()) + self:T(self.lid..string.format("Cargo %s NOT in embark zone %s", cargo.opsgroup:GetName(), self.cargoTransport.embarkzone:GetName())) end end @@ -7251,6 +7279,7 @@ function OPSGROUP:_CreateWaypoint(waypoint) waypoint.patrol=false waypoint.detour=false waypoint.astar=false + waypoint.temp=false -- Increase UID counter. self.wpcounter=self.wpcounter+1 @@ -7271,33 +7300,40 @@ function OPSGROUP:_AddWaypoint(waypoint, wpnumber) table.insert(self.waypoints, wpnumber, waypoint) -- Debug info. - self:T(self.lid..string.format("Adding waypoint at index=%d id=%d", wpnumber, waypoint.uid)) + self:T(self.lid..string.format("Adding waypoint at index=%d with UID=%d", wpnumber, waypoint.uid)) -- Now we obviously did not pass the final waypoint. - self.passedfinalwp=false - - -- Switch to cruise mode. - if self:IsHolding() then - -- Disable this for now. Cruise has to be commanded manually now. If group is ordered to hold, it will hold until told to move again. - --self:Cruise() + if self.currentwp and wpnumber>self.currentwp then + self.passedfinalwp=false end + end --- Initialize Mission Editor waypoints. -- @param #OPSGROUP self +-- @param #number WpIndexMin +-- @param #number WpIndexMax -- @return #OPSGROUP self -function OPSGROUP:InitWaypoints() +function OPSGROUP:_InitWaypoints(WpIndexMin, WpIndexMax) -- Template waypoints. self.waypoints0=self.group:GetTemplateRoutePoints() - -- Waypoints + -- Waypoints empty! self.waypoints={} + + WpIndexMin=WpIndexMin or 1 + WpIndexMax=WpIndexMax or #self.waypoints0 + WpIndexMax=math.min(WpIndexMax, #self.waypoints0) --Ensure max is not out of bounce. - for index,wp in pairs(self.waypoints0) do + --for index,wp in pairs(self.waypoints0) do + + for i=WpIndexMin,WpIndexMax do + + local wp=self.waypoints0[i] --DCS#Waypoint -- Coordinate of the waypoint. - local coordinate=COORDINATE:New(wp.x, wp.alt, wp.y) + local coordinate=COORDINATE:NewFromWaypoint(wp) -- Strange! wp.speed=wp.speed or 0 @@ -7305,17 +7341,49 @@ function OPSGROUP:InitWaypoints() -- Speed at the waypoint. local speedknots=UTILS.MpsToKnots(wp.speed) - if index==1 then + if i==1 then self.speedWp=wp.speed end + + local waypoint=self:_CreateWaypoint(wp) + + self:_AddWaypoint(waypoint) -- Add waypoint. - self:AddWaypoint(coordinate, speedknots, index-1, nil, false) - + --[[ + if self:IsFlightgroup() then + FLIGHTGROUP.AddWaypoint(self, coordinate, speedknots, index-1, Altitude, false) + elseif self:IsArmygroup() then + ARMYGROUP.AddWaypoint(self, coordinate, speedknots, index-1, Formation, false) + elseif self:IsNavygroup() then + NAVYGROUP.AddWaypoint(self, coordinate, speedknots, index-1, Depth, false) + else + -- Should not happen! + self:AddWaypoint(coordinate, speedknots, index-1, nil, false) + end + ]] + end -- Debug info. self:T(self.lid..string.format("Initializing %d waypoints", #self.waypoints)) + + -- Flight group specific. + if self:IsFlightgroup() then + + -- Get home and destination airbases from waypoints. + self.homebase=self.homebase or self:GetHomebaseFromWaypoints() + self.destbase=self.destbase or self:GetDestinationFromWaypoints() + self.currbase=self:GetHomebaseFromWaypoints() + + -- Remove the landing waypoint. We use RTB for that. It makes adding new waypoints easier as we do not have to check if the last waypoint is the landing waypoint. + if self.destbase and #self.waypoints>1 then + table.remove(self.waypoints, #self.waypoints) + else + self.destbase=self.homebase + end + + end -- Update route. if #self.waypoints>0 then @@ -7324,7 +7392,9 @@ function OPSGROUP:InitWaypoints() if #self.waypoints==1 then self.passedfinalwp=true end - + + else + self:E(self.lid.."WARNING: No waypoints initialized. Number of waypoints is 0!") end return self @@ -9219,6 +9289,42 @@ function OPSGROUP:_AddElementByName(unitname) return nil end +--- Set the template of the group. +-- @param #OPSGROUP self +-- @param #table Template Template to set. Default is from the GROUP. +-- @return #OPSGROUP self +function OPSGROUP:_SetTemplate(Template) + + self.template=Template or self.group:GetTemplate() + + self:I(self.lid.."Setting group template") + + return self +end + +--- Get the template of the group. +-- @param #OPSGROUP self +-- @param #boolean Copy Get a deep copy of the template. +-- @return #table Template table. +function OPSGROUP:_GetTemplate(Copy) + + if self.template then + + if Copy then + local template=UTILS.DeepCopy(self.template) + return template + else + return self.template + end + + else + self:E(self.lid..string.format("ERROR: No template was set yet!")) + end + + return nil +end + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------