OPS Respawn

This commit is contained in:
Frank 2021-07-15 22:25:02 +02:00
parent 835041e5f6
commit 78b3e3c60b
6 changed files with 252 additions and 98 deletions

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------