Merge pull request #2195 from FlightControl-Master/FF/Ops

OPSGROUP v1.0.3
This commit is contained in:
Frank 2024-12-10 22:50:30 +01:00 committed by GitHub
commit 1fbe78b667
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 280 additions and 276 deletions

View File

@ -68,7 +68,7 @@ ARMYGROUP = {
--- Army Group version. --- Army Group version.
-- @field #string version -- @field #string version
ARMYGROUP.version="1.0.1" ARMYGROUP.version="1.0.3"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@ -2049,12 +2049,14 @@ end
--- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil.
-- @param #ARMYGROUP self -- @param #ARMYGROUP self
-- @param #table Template Template used to init the group. Default is `self.template`. -- @param #table Template Template used to init the group. Default is `self.template`.
-- @param #number Delay Delay in seconds before group is initialized. Default `nil`, *i.e.* instantaneous.
-- @return #ARMYGROUP self -- @return #ARMYGROUP self
function ARMYGROUP:_InitGroup(Template, Delay) function ARMYGROUP:_InitGroup(Template, Delay)
if Delay and Delay>0 then if Delay and Delay>0 then
self:ScheduleOnce(Delay, ARMYGROUP._InitGroup, self, Template, 0) self:ScheduleOnce(Delay, ARMYGROUP._InitGroup, self, Template, 0)
else else
-- First check if group was already initialized. -- First check if group was already initialized.
if self.groupinitialized then if self.groupinitialized then
self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!") self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!")
@ -2101,62 +2103,16 @@ function ARMYGROUP:_InitGroup(Template, Delay)
-- Get current formation from first waypoint. -- Get current formation from first waypoint.
self.option.Formation=template.route.points[1].action self.option.Formation=template.route.points[1].action
-- Set default formation to "on road".
self.optionDefault.Formation=ENUMS.Formation.Vehicle.OnRoad
-- First check if group was already initialized.
if self.groupinitialized then
self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!")
return
end
self:T(self.lid.."FF Initializing Group")
-- Get template of group.
local template=Template or self:_GetTemplate()
-- Ground are always AI.
self.isAI=true
-- Is (template) group late activated.
self.isLateActivated=template.lateActivation
-- Ground groups cannot be uncontrolled.
self.isUncontrolled=false
-- Max speed in km/h.
self.speedMax=self.group:GetSpeedMax()
-- Is group mobile?
if self.speedMax>3.6 then
self.isMobile=true
else
self.isMobile=false
end
-- Cruise speed in km/h
self.speedCruise=self.speedMax*0.7
-- Group ammo.
self.ammo=self:GetAmmoTot()
-- Radio parameters from template.
self.radio.On=false -- Radio is always OFF for ground.
self.radio.Freq=133
self.radio.Modu=radio.modulation.AM
-- Set default radio.
self:SetDefaultRadio(self.radio.Freq, self.radio.Modu, self.radio.On)
-- Get current formation from first waypoint.
self.option.Formation=template.route.points[1].action
-- Set default formation to "on road". -- Set default formation to "on road".
self.optionDefault.Formation=ENUMS.Formation.Vehicle.OnRoad self.optionDefault.Formation=ENUMS.Formation.Vehicle.OnRoad
-- Default TACAN off. -- Default TACAN off.
if not self.tacanDefault then
self:SetDefaultTACAN(nil, nil, nil, nil, true) self:SetDefaultTACAN(nil, nil, nil, nil, true)
end
if not self.tacan then
self.tacan=UTILS.DeepCopy(self.tacanDefault) self.tacan=UTILS.DeepCopy(self.tacanDefault)
end
-- Units of the group. -- Units of the group.
local units=self.group:GetUnits() local units=self.group:GetUnits()
@ -2177,7 +2133,6 @@ function ARMYGROUP:_InitGroup(Template, Delay)
self:_AddElementByName(unitname) self:_AddElementByName(unitname)
end end
-- Init done. -- Init done.
self.groupinitialized=true self.groupinitialized=true
end end

View File

@ -217,7 +217,7 @@ FLIGHTGROUP.Players={}
--- FLIGHTGROUP class version. --- FLIGHTGROUP class version.
-- @field #string version -- @field #string version
FLIGHTGROUP.version="1.0.2" FLIGHTGROUP.version="1.0.3"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@ -3803,8 +3803,13 @@ end
--- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @param #table Template Template used to init the group. Default is `self.template`. -- @param #table Template Template used to init the group. Default is `self.template`.
-- @param #number Delay Delay in seconds before group is initialized. Default `nil`, *i.e.* instantaneous.
-- @return #FLIGHTGROUP self -- @return #FLIGHTGROUP self
function FLIGHTGROUP:_InitGroup(Template) function FLIGHTGROUP:_InitGroup(Template, Delay)
if Delay and Delay>0 then
self:ScheduleOnce(Delay, FLIGHTGROUP._InitGroup, self, Template, 0)
else
-- First check if group was already initialized. -- First check if group was already initialized.
if self.groupinitialized then if self.groupinitialized then
@ -3878,8 +3883,12 @@ function FLIGHTGROUP:_InitGroup(Template)
end end
-- Default TACAN off. -- Default TACAN off.
if not self.tacanDefault then
self:SetDefaultTACAN(nil, nil, nil, nil, true) self:SetDefaultTACAN(nil, nil, nil, nil, true)
end
if not self.tacan then
self.tacan=UTILS.DeepCopy(self.tacanDefault) self.tacan=UTILS.DeepCopy(self.tacanDefault)
end
-- Is this purely AI? -- Is this purely AI?
self.isAI=not self:_IsHuman(group) self.isAI=not self:_IsHuman(group)
@ -3911,6 +3920,7 @@ function FLIGHTGROUP:_InitGroup(Template)
-- Init done. -- Init done.
self.groupinitialized=true self.groupinitialized=true
end
return self return self
end end

View File

@ -91,7 +91,7 @@ NAVYGROUP = {
--- NavyGroup version. --- NavyGroup version.
-- @field #string version -- @field #string version
NAVYGROUP.version="1.0.2" NAVYGROUP.version="1.0.3"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@ -775,7 +775,7 @@ end
--- Update status. --- Update status.
-- @param #NAVYGROUP self -- @param #NAVYGROUP self
function NAVYGROUP:Status(From, Event, To) function NAVYGROUP:Status()
-- FSM state. -- FSM state.
local fsmstate=self:GetState() local fsmstate=self:GetState()
@ -978,6 +978,35 @@ function NAVYGROUP:Status(From, Event, To)
end end
---
-- Elements
---
if self.verbose>=2 then
local text="Elements:"
for i,_element in pairs(self.elements) do
local element=_element --Ops.OpsGroup#OPSGROUP.Element
local name=element.name
local status=element.status
local unit=element.unit
local life,life0=self:GetLifePoints(element)
local life0=element.life0
-- Get ammo.
local ammo=self:GetAmmoElement(element)
-- Output text for element.
text=text..string.format("\n[%d] %s: status=%s, life=%.1f/%.1f, guns=%d, rockets=%d, bombs=%d, missiles=%d, cargo=%d/%d kg",
i, name, status, life, life0, ammo.Guns, ammo.Rockets, ammo.Bombs, ammo.Missiles, element.weightCargo, element.weightMaxCargo)
end
if #self.elements==0 then
text=text.." none!"
end
self:I(self.lid..text)
end
--- ---
-- Engage Detected Targets -- Engage Detected Targets
--- ---
@ -1041,7 +1070,7 @@ function NAVYGROUP:onafterSpawned(From, Event, To)
-- Debug info. -- Debug info.
if self.verbose>=1 then if self.verbose>=1 then
local text=string.format("Initialized Navy Group %s:\n", self.groupname) local text=string.format("Initialized Navy Group %s [GID=%d]:\n", self.groupname, self.group:GetID())
text=text..string.format("Unit type = %s\n", self.actype) text=text..string.format("Unit type = %s\n", self.actype)
text=text..string.format("Speed max = %.1f Knots\n", UTILS.KmphToKnots(self.speedMax)) text=text..string.format("Speed max = %.1f Knots\n", UTILS.KmphToKnots(self.speedMax))
text=text..string.format("Speed cruise = %.1f Knots\n", UTILS.KmphToKnots(self.speedCruise)) text=text..string.format("Speed cruise = %.1f Knots\n", UTILS.KmphToKnots(self.speedCruise))
@ -1841,8 +1870,14 @@ end
--- Initialize group parameters. Also initializes waypoints if self.waypoints is nil. --- Initialize group parameters. Also initializes waypoints if self.waypoints is nil.
-- @param #NAVYGROUP self -- @param #NAVYGROUP self
-- @param #table Template Template used to init the group. Default is `self.template`. -- @param #table Template Template used to init the group. Default is `self.template`.
-- @param #number Delay Delay in seconds before group is initialized. Default `nil`, *i.e.* instantaneous.
-- @return #NAVYGROUP self -- @return #NAVYGROUP self
function NAVYGROUP:_InitGroup(Template) function NAVYGROUP:_InitGroup(Template, Delay)
if Delay and Delay>0 then
-- Delayed call
self:ScheduleOnce(Delay, NAVYGROUP._InitGroup, self, Template, 0)
else
-- First check if group was already initialized. -- First check if group was already initialized.
if self.groupinitialized then if self.groupinitialized then
@ -1888,13 +1923,21 @@ function NAVYGROUP:_InitGroup(Template)
self.optionDefault.Formation="Off Road" self.optionDefault.Formation="Off Road"
self.option.Formation=self.optionDefault.Formation self.option.Formation=self.optionDefault.Formation
-- Default TACAN off. -- Default TACAN off (we check if something is set already to keep those values in case of respawn)
if not self.tacanDefault then
self:SetDefaultTACAN(nil, nil, nil, nil, true) self:SetDefaultTACAN(nil, nil, nil, nil, true)
end
if not self.tacan then
self.tacan=UTILS.DeepCopy(self.tacanDefault) self.tacan=UTILS.DeepCopy(self.tacanDefault)
end
-- Default ICLS off. -- Default ICLS off.
if not self.iclsDefault then
self:SetDefaultICLS(nil, nil, nil, true) self:SetDefaultICLS(nil, nil, nil, true)
end
if not self.icls then
self.icls=UTILS.DeepCopy(self.iclsDefault) self.icls=UTILS.DeepCopy(self.iclsDefault)
end
-- Get all units of the group. -- Get all units of the group.
local units=self.group:GetUnits() local units=self.group:GetUnits()
@ -1915,6 +1958,7 @@ function NAVYGROUP:_InitGroup(Template)
-- Init done. -- Init done.
self.groupinitialized=true self.groupinitialized=true
end
return self return self
end end

View File

@ -512,7 +512,7 @@ OPSGROUP.CargoStatus={
--- OpsGroup version. --- OpsGroup version.
-- @field #string version -- @field #string version
OPSGROUP.version="1.0.1" OPSGROUP.version="1.0.3"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@ -7675,6 +7675,7 @@ function OPSGROUP:Teleport(Coordinate, Delay, NoPauseMission)
unit.heading=math.rad(heading) unit.heading=math.rad(heading)
unit.psi=-unit.heading unit.psi=-unit.heading
else else
-- Remove unit from spawn template because it is already dead
table.remove(units, i) table.remove(units, i)
end end
end end
@ -7762,25 +7763,41 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
-- Despawn old group. Dont trigger any remove unit event since this is a respawn. -- Despawn old group. Dont trigger any remove unit event since this is a respawn.
self:Despawn(0, true) self:Despawn(0, true)
else end
---
-- Group is NOT ALIVE
---
-- Ensure elements in utero. -- Ensure elements in utero.
for _,_element in pairs(self.elements) do for _,_element in pairs(self.elements) do
local element=_element --#OPSGROUP.Element local element=_element --#OPSGROUP.Element
if element and element.status~=OPSGROUP.ElementStatus.DEAD then
self:ElementInUtero(element) self:ElementInUtero(element)
end end
end
-- Spawn with a little delay (especially Navy groups caused problems if they were instantly respawned)
self:_Spawn(0.01, Template)
end end
return self
end
--- Spawn group from a given template.
-- @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.
-- @return #OPSGROUP self
function OPSGROUP:_Spawn(Delay, Template)
if Delay and Delay>0 then
self:ScheduleOnce(Delay, OPSGROUP._Spawn, self, 0, Template)
else
-- Debug output. -- Debug output.
self:T({Template=Template}) self:T2({Template=Template})
-- Spawn new group. -- Spawn new group.
self.group=_DATABASE:Spawn(Template) self.group=_DATABASE:Spawn(Template)
--local countryID=self.group:GetCountry()
--local categoryID=self.group:GetCategory()
--local dcsgroup=coalition.addGroup(countryID, categoryID, Template)
-- Set DCS group and controller. -- Set DCS group and controller.
self.dcsgroup=self:GetDCSGroup() self.dcsgroup=self:GetDCSGroup()
@ -7794,7 +7811,6 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
self.isDead=false self.isDead=false
self.isDestroyed=false self.isDestroyed=false
self.groupinitialized=false self.groupinitialized=false
self.wpcounter=1 self.wpcounter=1
self.currentwp=1 self.currentwp=1
@ -7802,15 +7818,12 @@ function OPSGROUP:_Respawn(Delay, Template, Reset)
-- Init waypoints. -- Init waypoints.
self:_InitWaypoints() self:_InitWaypoints()
-- Init Group. -- Init Group. This call is delayed because NAVY groups did not like to be initialized just yet (group did not contain any units).
self:_InitGroup(Template) self:_InitGroup(Template, 0.001)
-- Reset events. -- Reset events.
--self:ResetEvents() --self:ResetEvents()
end end
return self
end end
--- On after "InUtero" event. --- On after "InUtero" event.
@ -7830,24 +7843,6 @@ end
-- @param #string To To state. -- @param #string To To state.
function OPSGROUP:onafterDamaged(From, Event, To) function OPSGROUP:onafterDamaged(From, Event, To)
self:T(self.lid..string.format("Group damaged at t=%.3f", timer.getTime())) self:T(self.lid..string.format("Group damaged at t=%.3f", timer.getTime()))
--[[
local lifemin=nil
for _,_element in pairs(self.elements) do
local element=_element --#OPSGROUP.Element
if element.status~=OPSGROUP.ElementStatus.DEAD and element.status~=OPSGROUP.ElementStatus.INUTERO then
local life, life0=self:GetLifePoints(element)
if lifemin==nil or life<lifemin then
lifemin=life
end
end
end
if lifemin and lifemin/self.life<0.5 then
self:RTB()
end
]]
end end
--- On after "Destroyed" event. --- On after "Destroyed" event.