diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index 223d459b6..8c6b7bfeb 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -17,6 +17,7 @@ -- @field #table CategoryName Names of airbase categories. -- @field #string AirbaseName Name of the airbase. -- @field #number AirbaseID Airbase ID. +-- @field Core.Zone#ZONE AirbaseZone Circular zone around the airbase with a radius of 2500 meters. For ships this is a ZONE_UNIT object. -- @field #number category Airbase category. -- @field #table descriptors DCS descriptors. -- @field #boolean isAirdrome Airbase is an airdrome. @@ -526,19 +527,19 @@ function AIRBASE:Register(AirbaseName) -- Inherit everything from positionable. local self=BASE:Inherit(self, POSITIONABLE:New(AirbaseName)) --#AIRBASE - + -- Set airbase name. self.AirbaseName=AirbaseName - + -- Set airbase ID. self.AirbaseID=self:GetID(true) - + -- Get descriptors. self.descriptors=self:GetDesc() - + -- Category. self.category=self.descriptors and self.descriptors.category or Airbase.Category.AIRDROME - + -- Set category. if self.category==Airbase.Category.AIRDROME then self.isAirdrome=true @@ -549,17 +550,23 @@ function AIRBASE:Register(AirbaseName) else self:E("ERROR: Unknown airbase category!") end - + self:_InitParkingSpots() - + local vec2=self:GetVec2() - + -- Init coordinate. self:GetCoordinate() - + if vec2 then - -- TODO: For ships we need a moving zone. - self.AirbaseZone=ZONE_RADIUS:New( AirbaseName, vec2, 2500 ) + if self.isShip then + local unit=UNIT:FindByName(AirbaseName) + if unit then + self.AirbaseZone=ZONE_UNIT:New(AirbaseName, unit, 2500) + end + else + self.AirbaseZone=ZONE_RADIUS:New(AirbaseName, vec2, 2500) + end else self:E(string.format("ERROR: Cound not get position Vec2 of airbase %s", AirbaseName)) end @@ -693,7 +700,7 @@ function AIRBASE:GetID(unique) local airbaseID=tonumber(DCSAirbase:getID()) local airbaseCategory=self:GetAirbaseCategory() - + if AirbaseName==self.AirbaseName then if airbaseCategory==Airbase.Category.SHIP or airbaseCategory==Airbase.Category.HELIPAD then -- Ships get a negative sign as their unit number might be the same as the ID of another airbase. @@ -932,16 +939,16 @@ function AIRBASE:_InitParkingSpots() -- Init table. self.parking={} self.parkingByID={} - + self.NparkingTotal=0 self.NparkingTerminal={} for _,terminalType in pairs(AIRBASE.TerminalType) do self.NparkingTerminal[terminalType]=0 - end + end -- Put coordinates of parking spots into table. for _,spot in pairs(parkingdata) do - + -- New parking spot. local park={} --#AIRBASE.ParkingSpot park.Vec3=spot.vTerminalPos @@ -952,15 +959,15 @@ function AIRBASE:_InitParkingSpots() park.TerminalID0=spot.Term_Index_0 park.TerminalType=spot.Term_Type park.TOAC=spot.TO_AC - + self.NparkingTotal=self.NparkingTotal+1 - + for _,terminalType in pairs(AIRBASE.TerminalType) do if self._CheckTerminalType(terminalType, park.TerminalType) then self.NparkingTerminal[terminalType]=self.NparkingTerminal[terminalType]+1 end - end - + end + self.parkingByID[park.TerminalID]=park table.insert(self.parking, park) end @@ -984,7 +991,7 @@ function AIRBASE:GetParkingSpotsTable(termtype) -- Get parking data of all spots (free or occupied) local parkingdata=self:GetParkingData(false) - + -- Get parking data of all free spots. local parkingfree=self:GetParkingData(true) @@ -1001,17 +1008,26 @@ function AIRBASE:GetParkingSpotsTable(termtype) -- Put coordinates of parking spots into table. local spots={} for _,_spot in pairs(parkingdata) do - + if AIRBASE._CheckTerminalType(_spot.Term_Type, termtype) then - + local spot=self:_GetParkingSpotByID(_spot.Term_Index) - - spot.Free=_isfree(_spot) -- updated - spot.TOAC=_spot.TO_AC -- updated - - table.insert(spots, spot) + + if spot then + + spot.Free=_isfree(_spot) -- updated + spot.TOAC=_spot.TO_AC -- updated + + table.insert(spots, spot) + + else + + self:E(string.format("ERROR: Parking spot %s is nil!", tostring(_spot.Term_Index))) + + end + end - + end return spots @@ -1032,14 +1048,14 @@ function AIRBASE:GetFreeParkingSpotsTable(termtype, allowTOAC) for _,_spot in pairs(parkingfree) do if AIRBASE._CheckTerminalType(_spot.Term_Type, termtype) and _spot.Term_Index>0 then if (allowTOAC and allowTOAC==true) or _spot.TO_AC==false then - + local spot=self:_GetParkingSpotByID(_spot.Term_Index) spot.Free=true -- updated spot.TOAC=_spot.TO_AC -- updated - + table.insert(freespots, spot) - + end end end @@ -1118,7 +1134,9 @@ end -- @param #table parkingdata (Optional) Parking spots data table. If not given it is automatically derived from the GetParkingSpotsTable() function. -- @return #table Table of coordinates and terminal IDs of free parking spots. Each table entry has the elements .Coordinate and .TerminalID. function AIRBASE:FindFreeParkingSpotForAircraft(group, terminaltype, scanradius, scanunits, scanstatics, scanscenery, verysafe, nspots, parkingdata) - + + if group and group:IsAlive() then + -- Init default scanradius=scanradius or 50 if scanunits==nil then @@ -1291,6 +1309,10 @@ function AIRBASE:FindFreeParkingSpotForAircraft(group, terminaltype, scanradius, -- Retrun spots we found, even if there were not enough. return validspots + + else + return {} + end end --- Check black and white lists. @@ -1392,7 +1414,7 @@ function AIRBASE:GetRunwayData(magvar, mark) -- Get spawn points on runway. These can be used to determine the runway heading. local runwaycoords=self:GetParkingSpotsCoordinates(AIRBASE.TerminalType.Runway) - + -- Debug: For finding the numbers of the spawn points belonging to each runway. if false then for i,_coord in pairs(runwaycoords) do @@ -1411,7 +1433,7 @@ function AIRBASE:GetRunwayData(magvar, mark) -- Airbase name. local name=self:GetName() - + -- Exceptions if name==AIRBASE.Nevada.Jean_Airport or @@ -1424,36 +1446,36 @@ function AIRBASE:GetRunwayData(magvar, mark) -- 1-->4, 2-->3, 3-->2, 4-->1 exception=1 - - elseif UTILS.GetDCSMap()==DCSMAP.Syria and N>=2 and + + elseif UTILS.GetDCSMap()==DCSMAP.Syria and N>=2 and name~=AIRBASE.Syria.Minakh and name~=AIRBASE.Syria.Damascus and name~=AIRBASE.Syria.Khalkhalah and name~=AIRBASE.Syria.Marj_Ruhayyil and name~=AIRBASE.Syria.Beirut_Rafic_Hariri then - + -- 1-->3, 2-->4, 3-->1, 4-->2 exception=2 - + end - + --- Function returning the index of the runway coordinate belonding to the given index i. local function f(i) local j - + if exception==1 then - + j=N-(i-1) -- 1-->4, 2-->3 - + elseif exception==2 then - + if i<=N2 then j=i+N2 -- 1-->3, 2-->4 else j=i-N2 -- 3-->1, 4-->3 end - + else if i%2==0 then @@ -1461,9 +1483,9 @@ function AIRBASE:GetRunwayData(magvar, mark) else j=i+1 -- odd 1-->2, 3-->4 end - + end - + -- Special case where there is no obvious order. if name==AIRBASE.Syria.Beirut_Rafic_Hariri then if i==1 then @@ -1496,7 +1518,7 @@ function AIRBASE:GetRunwayData(magvar, mark) j=2 end end - + return j end @@ -1505,7 +1527,7 @@ function AIRBASE:GetRunwayData(magvar, mark) -- Get the other spawn point coordinate. local j=f(i) - + -- Debug info. --env.info(string.format("Runway i=%s j=%s (N=%d #runwaycoord=%d)", tostring(i), tostring(j), N, #runwaycoords))