This commit is contained in:
Frank 2020-09-01 11:42:45 +02:00
parent 5ee35f3fbb
commit eb86d59203
5 changed files with 67 additions and 28 deletions

View File

@ -561,7 +561,8 @@ do -- COORDINATE
return self
else
--env.info("FF translate with NEW coordinate T="..timer.getTime())
return COORDINATE:New(x, y, z)
local coord=COORDINATE:New(x, y, z)
return coord
end
end
@ -761,7 +762,8 @@ do -- COORDINATE
-- Move the vector to start at the end of A.
vec=UTILS.VecAdd(self, vec)
return self:New(vec.x,vec.y,vec.z)
local coord=COORDINATE:New(vec.x,vec.y,vec.z)
return coord
end
--- Return the 2D distance in meters between the target COORDINATE and the COORDINATE.

View File

@ -38,6 +38,8 @@
--
-- The TIMER class is the little sister of the SCHEDULER class. It does the same thing but is a bit easier to use and has less overhead. It should be sufficient in many cases.
--
-- It provides an easy interface to the DCS [timer.scheduleFunction](https://wiki.hoggitworld.com/view/DCS_func_scheduleFunction).
--
-- # Construction
--
-- A new TIMER is created by the @{#TIMER.New}(*func*, *...*) function
@ -104,7 +106,7 @@ TIMER = {
_TIMERID=0
--- Timer data base.
_TIMERDB={}
--_TIMERDB={}
--- TIMER class version.
-- @field #string version
@ -150,7 +152,7 @@ function TIMER:New(Function, ...)
self.lid=string.format("TIMER UID=%d | ", self.uid)
-- Add to DB.
_TIMERDB[self.uid]=self
--_TIMERDB[self.uid]=self
return self
end
@ -208,7 +210,7 @@ function TIMER:Stop(Delay)
timer.removeFunction(self.tid)
-- Remove DB entry.
_TIMERDB[self.uid]=nil
--_TIMERDB[self.uid]=nil
end
@ -232,8 +234,6 @@ end
-- @return #number Time when the function is called again or `nil` if the timer is stopped.
function TIMER:_Function(time)
--self:I(self.lid.."FF calling timer _Function")
-- Call function.
self.func(unpack(self.para))

View File

@ -227,7 +227,7 @@ function FLIGHTGROUP:New(group)
self.lid=string.format("FLIGHTGROUP %s | ", self.groupname)
-- Defaults
self:SetVerbosity(0)
--self:SetVerbosity(0)
self:SetFuelLowThreshold()
self:SetFuelLowRTB()
self:SetFuelCriticalThreshold()
@ -410,6 +410,25 @@ function FLIGHTGROUP:GetFlightControl()
end
--- Set the homebase.
-- @param #FLIGHTGROUP self
-- @param Wrapper.Airbase#AIRBASE HomeAirbase The home airbase.
-- @return #FLIGHTGROUP self
function FLIGHTGROUP:SetHomebase(HomeAirbase)
self.homebase=HomeAirbase
return self
end
--- Set the destination airbase. This is where the flight will go, when the final waypoint is reached.
-- @param #FLIGHTGROUP self
-- @param Wrapper.Airbase#AIRBASE DestinationAirbase The destination airbase.
-- @return #FLIGHTGROUP self
function FLIGHTGROUP:SetDestinationbase(DestinationAirbase)
self.destbase=DestinationAirbase
return self
end
--- Set the AIRBOSS controlling this flight group.
-- @param #FLIGHTGROUP self
-- @param Ops.Airboss#AIRBOSS airboss The AIRBOSS object.
@ -1386,7 +1405,7 @@ function FLIGHTGROUP:onafterSpawned(From, Event, To)
if self.option.ROT then
self:SwitchROT(self.option.ROT)
else
self:SwitchROE(ENUMS.ROT.PassiveDefense)
self:SwitchROT(ENUMS.ROT.PassiveDefense)
end
-- Turn TACAN beacon on.
@ -1529,6 +1548,7 @@ function FLIGHTGROUP:onafterLanding(From, Event, To)
end
--- On after "Landed" event.
-- @param #FLIGHTGROUP self
-- @param #string From From state.
@ -1538,16 +1558,24 @@ end
function FLIGHTGROUP:onafterLanded(From, Event, To, airbase)
self:T(self.lid..string.format("Flight landed at %s", airbase and airbase:GetName() or "unknown place"))
if self:IsLandingAt() then
self:LandedAt()
else
if self.flightcontrol and airbase and self.flightcontrol.airbasename==airbase:GetName() then
-- Add flight to taxiinb queue.
self.flightcontrol:SetFlightStatus(self, FLIGHTCONTROL.FlightStatus.TAXIINB)
end
if self.flightcontrol and airbase and self.flightcontrol.airbasename==airbase:GetName() then
-- Add flight to taxiinb queue.
self.flightcontrol:SetFlightStatus(self, FLIGHTCONTROL.FlightStatus.TAXIINB)
end
end
--- On after "LandedAt" event.
-- @param #FLIGHTGROUP self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Wrapper.Airbase#AIRBASE airbase The airbase the flight landed.
function FLIGHTGROUP:onafterLandedAt(From, Event, To)
self:I(self.lid..string.format("Flight landed at"))
end
--- On after "Arrived" event.
-- @param #FLIGHTGROUP self
-- @param #string From From state.
@ -2519,6 +2547,8 @@ function FLIGHTGROUP:_InitGroup()
self.radio.Freq=self.template.frequency
self.radio.Modu=self.template.modulation
self.radioDefault=UTILS.DeepCopy(self.radio)
--TODO callsign from template or getCallsign
self.callsign.NumberSquad=self.template.units[1].callsign[1]
self.callsign.NumberGroup=self.template.units[1].callsign[2]

View File

@ -95,7 +95,7 @@
OPSGROUP = {
ClassName = "OPSGROUP",
Debug = false,
verbose = 0,
verbose = 3,
lid = nil,
groupname = nil,
group = nil,
@ -2443,7 +2443,7 @@ function OPSGROUP:_CheckInZones()
for inzonename, inzone in pairs(self.inzones:GetSet()) do
-- Check if group is still inside the zone.
local isstillinzone=self.group:IsPartlyOrCompletelyInZone(inzone)
local isstillinzone=self.group:IsInZone(inzone) --:IsPartlyOrCompletelyInZone(inzone)
-- If not, trigger, LeaveZone event.
if not isstillinzone then
@ -2463,7 +2463,7 @@ function OPSGROUP:_CheckInZones()
local checkzone=_checkzone --Core.Zone#ZONE
-- Is group currtently in this check zone?
local isincheckzone=self.group:IsPartlyOrCompletelyInZone(checkzone)
local isincheckzone=self.group:IsInZone(checkzone) --:IsPartlyOrCompletelyInZone(checkzone)
if isincheckzone and not self.inzones:_Find(checkzonename) then
table.insert(enterzones, checkzone)
@ -3009,7 +3009,7 @@ function OPSGROUP:SwitchROE(roe)
self.group:OptionROE(roe)
self:T(self.lid..string.format("Setting current ROE=%d (0=WeaponFree, 1=OpenFireWeaponFree, 2=OpenFire, 3=ReturnFire, 4=WeaponHold)", self.option.ROE))
self:I(self.lid..string.format("Setting current ROE=%d (0=WeaponFree, 1=OpenFireWeaponFree, 2=OpenFire, 3=ReturnFire, 4=WeaponHold)", self.option.ROE))
end
@ -3475,7 +3475,7 @@ function OPSGROUP:SwitchFormation(Formation)
self.option.Formation=Formation
-- Debug info.
self:I(self.lid..string.format("Switching formation to %d", self.formation))
self:I(self.lid..string.format("Switching formation to %d", self.option.Formation))
end
@ -3771,7 +3771,11 @@ function OPSGROUP:_UpdateStatus(element, newstatus, airbase)
---
if self:_AllSimilarStatus(newstatus) then
self:Landed(airbase)
if self:IsLandingAt() then
self:LandedAt()
else
self:Landed(airbase)
end
end
elseif newstatus==OPSGROUP.ElementStatus.ARRIVED then

View File

@ -951,7 +951,8 @@ function GROUP:GetVec2()
local Unit=self:GetUnit(1)
if Unit then
return Unit:GetVec2()
local vec2=Unit:GetVec2()
return vec2
end
end
@ -965,7 +966,8 @@ function GROUP:GetVec3()
local unit=self:GetUnit(1)
if unit then
return unit:GetVec3()
local vec3=unit:GetVec3()
return vec3
end
self:E("ERROR: Cannot get Vec3 of group "..tostring(self.GroupName))
@ -996,13 +998,11 @@ end
-- @param Wrapper.Group#GROUP self
-- @return Core.Point#COORDINATE The COORDINATE of the GROUP.
function GROUP:GetCoordinate()
self:F2( self.PositionableName )
local FirstUnit = self:GetUnit(1)
if FirstUnit then
local FirstUnitCoordinate = FirstUnit:GetCoordinate()
self:T3(FirstUnitCoordinate)
return FirstUnitCoordinate
end
@ -1176,7 +1176,7 @@ do -- Is Zone methods
--- Check if any unit of a group is inside a @{Zone}.
-- @param #GROUP self
-- @param Core.Zone#ZONE_BASE Zone The zone to test.
-- @return #boolean Returns true if at least one unit is inside the zone or false if no unit is inside.
-- @return #boolean Returns `true` if *at least one unit* is inside the zone or `false` if *no* unit is inside.
function GROUP:IsInZone( Zone )
if self:IsAlive() then
@ -1184,7 +1184,10 @@ function GROUP:IsInZone( Zone )
for UnitID, UnitData in pairs(self:GetUnits()) do
local Unit = UnitData -- Wrapper.Unit#UNIT
if Zone:IsVec3InZone(Unit:GetVec3()) then
-- Get 2D vector. That's all we need for the zone check.
local vec2=Unit:GetVec2()
if Zone:IsVec2InZone(vec2) then
return true -- At least one unit is in the zone. That is enough.
else
-- This one is not but another could be.