mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
OPS Respawn
This commit is contained in:
parent
835041e5f6
commit
78b3e3c60b
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -293,6 +318,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
|
||||
-- @return #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.
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
@ -2416,6 +2416,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)
|
||||
SpeedHold=SpeedHold or (self.isHelo and 80 or 250)
|
||||
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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.
|
||||
@ -504,6 +510,9 @@ function OPSGROUP:New(group)
|
||||
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()
|
||||
|
||||
@ -4829,6 +4840,29 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
|
||||
|
||||
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)
|
||||
|
||||
@ -4844,28 +4878,6 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
|
||||
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
|
||||
|
||||
-- Debug output.
|
||||
@ -4881,9 +4893,17 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
|
||||
-- Not dead or destroyed any more.
|
||||
self.isDead=false
|
||||
self.isDestroyed=false
|
||||
self.Ndestroyed=0
|
||||
|
||||
self:InitWaypoints()
|
||||
|
||||
self.groupinitialized=false
|
||||
self.Ndestroyed=0
|
||||
self.wpcounter=1
|
||||
self.currentwp=1
|
||||
|
||||
-- Init waypoints.
|
||||
self:_InitWaypoints()
|
||||
|
||||
-- Init Group.
|
||||
self:_InitGroup()
|
||||
|
||||
-- Reset events.
|
||||
@ -5828,6 +5848,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={}
|
||||
|
||||
for index,wp in pairs(self.waypoints0) do
|
||||
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 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,18 +7341,50 @@ 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
|
||||
|
||||
@ -7325,6 +7393,8 @@ function OPSGROUP:InitWaypoints()
|
||||
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
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user