Warehouse marker and spawning update

This commit is contained in:
Frank 2020-08-23 01:08:02 +02:00
parent f30c66424c
commit cfc45cf068
2 changed files with 99 additions and 52 deletions

View File

@ -58,6 +58,10 @@
-- @field Core.Point#COORDINATE rail Closest point to warehouse on rail.
-- @field Core.Zone#ZONE spawnzone Zone in which assets are spawned.
-- @field #number uid Unique ID of the warehouse.
-- @field #boolean markerOn If true, markers are displayed on the F10 map.
-- @field Wrapper.Marker#MARKER markerWarehouse Marker warehouse.
-- @field Wrapper.Marker#MARKER markerRoad Road connection.
-- @field Wrapper.Marker#MARKER markerRail Rail road connection.
-- @field #number markerid ID of the warehouse marker at the airbase.
-- @field #number dTstatus Time interval in seconds of updating the warehouse status and processing new events. Default 30 seconds.
-- @field #number queueid Unit id of each request in the queue. Essentially a running number starting at one and incremented when a new request is added.
@ -80,7 +84,6 @@
-- @field #number lowfuelthresh Low fuel threshold. Triggers the event AssetLowFuel if for any unit fuel goes below this number.
-- @field #boolean respawnafterdestroyed If true, warehouse is respawned after it was destroyed. Assets are kept.
-- @field #number respawndelay Delay before respawn in seconds.
-- @field #boolean markerOn If true, markers are displayed on the F10 map.
-- @extends Core.Fsm#FSM
--- Have your assets at the right place at the right time - or not!
@ -1560,7 +1563,6 @@ WAREHOUSE = {
rail = nil,
spawnzone = nil,
uid = nil,
markerid = nil,
dTstatus = 30,
queueid = 0,
stock = {},
@ -3372,7 +3374,7 @@ function WAREHOUSE:onafterStop(From, Event, To)
self:_UpdateWarehouseMarkText()
-- Clear all pending schedules.
--self.CallScheduler:Clear()
self.CallScheduler:Clear()
end
--- On after "Pause" event. Pauses the warehouse, i.e. no requests are processed. However, new requests and new assets can be added in this state.
@ -7497,7 +7499,7 @@ end
function WAREHOUSE:_FindParkingForAssets(airbase, assets)
-- Init default
local scanradius=100
local scanradius=25
local scanunits=true
local scanstatics=true
local scanscenery=false
@ -7527,14 +7529,14 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
end
-- Get parking spot data table. This contains all free and "non-free" spots.
local parkingdata=airbase:GetParkingSpotsTable()
local parkingdata=airbase.parking --airbase:GetParkingSpotsTable()
-- List of obstacles.
local obstacles={}
-- Check all clients. Clients dont change so we can put that out of the loop.
local clientcoords=_clients()
for clientname,_coord in pairs(clientcoords) do
self.clientcoords=self.clientcoords or _clients()
for clientname,_coord in pairs(self.clientcoords) do
table.insert(obstacles, {coord=_coord, size=15, name=clientname, type="client"})
end
@ -7605,20 +7607,9 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
-- Coordinate of the parking spot.
local _spot=parkingspot.Coordinate -- Core.Point#COORDINATE
local _termid=parkingspot.TerminalID
local _toac=parkingspot.TOAC
--env.info(string.format("FF asset=%s (id=%d): needs terminal type=%d, id=%d, #obstacles=%d", _asset.templatename, _asset.uid, terminaltype, _termid, #obstacles))
local free=true
local problem=nil
-- Safe parking using TO_AC from DCS result.
self:T2(self.lid..string.format("Parking spot %d TOAC=%s (safe park=%s)", _termid, tostring(_toac), tostring(self.safeparking)))
if self.safeparking and _toac then
free=false
self:T(self.lid..string.format("Parking spot %d is occupied by other aircraft taking off (TOAC)", _termid))
end
-- Loop over all obstacles.
for _,obstacle in pairs(obstacles) do
@ -8405,27 +8396,47 @@ function WAREHOUSE:_UpdateWarehouseMarkText()
if self.markerOn then
-- Create a mark with the current assets in stock.
if self.markerid~=nil then
trigger.action.removeMark(self.markerid)
end
-- Get assets in stock.
local _data=self:GetStockInfo(self.stock)
-- Text.
-- Marker text.
local text=string.format("Warehouse state: %s\nTotal assets in stock %d:\n", self:GetState(), #self.stock)
for _attribute,_count in pairs(_data) do
for _attribute,_count in pairs(self:GetStockInfo(self.stock) or {}) do
if _count>0 then
local attribute=tostring(UTILS.Split(_attribute, "_")[2])
text=text..string.format("%s=%d, ", attribute,_count)
end
end
local coordinate=self:GetCoordinate()
local coalition=self:GetCoalition()
-- Create/update marker at warehouse in F10 map.
self.markerid=self:GetCoordinate():MarkToCoalition(text, self:GetCoalition(), true)
if not self.markerWarehouse then
-- Create a new marker.
self.markerWarehouse=MARKER:New(coordinate, text):ToCoalition(coalition)
else
local refresh=false
if self.markerWarehouse.text~=text then
self.markerWarehouse.text=text
refresh=true
end
if self.markerWarehouse.coordinate~=coordinate then
self.markerWarehouse.coordinate=coordinate
refresh=true
end
if self.markerWarehouse.coalition~=coalition then
self.markerWarehouse.coalition=coalition
refresh=true
end
if refresh then
self.markerWarehouse:Refresh()
end
end
end
end

View File

@ -219,6 +219,26 @@ function POSITIONABLE:GetPositionVec3()
return nil
end
--- Returns the @{DCS#Vec3} vector indicating the 3D vector of the POSITIONABLE within the mission.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return DCS#Vec3 The 3D point vector of the POSITIONABLE.
-- @return #nil The POSITIONABLE is not existing or alive.
function POSITIONABLE:GetVec3()
self:F2( self.PositionableName )
local DCSPositionable = self:GetDCSObject()
if DCSPositionable then
local PositionableVec3 = DCSPositionable:getPosition().p
self:T3( PositionableVec3 )
return PositionableVec3
end
BASE:E( { "Cannot GetVec3", Positionable = self, Alive = self:IsAlive() } )
return nil
end
--- Returns the @{DCS#Vec2} vector indicating the point in 2D of the POSITIONABLE within the mission.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return DCS#Vec2 The 2D point vector of the POSITIONABLE.
@ -302,6 +322,42 @@ function POSITIONABLE:GetPointVec3()
return nil
end
--- Returns a COORDINATE object indicating the point in 3D of the POSITIONABLE within the mission.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return Core.Point#COORDINATE The COORDINATE of the POSITIONABLE.
function POSITIONABLE:GetCoord()
-- Get DCS object.
local DCSPositionable = self:GetDCSObject()
if DCSPositionable then
-- Get the current position.
local PositionableVec3 = self:GetPositionVec3()
if self.coordinate then
--env.info("FF GetCoordinate GOT for "..tostring(self.PositionableName))
-- Update vector.
self.coordinate.x=PositionableVec3.x
self.coordinate.y=PositionableVec3.y
self.coordinate.z=PositionableVec3.z
else
--env.info("FF GetCoordinate NEW for "..tostring(self.PositionableName))
self.coordinate=COORDINATE:NewFromVec3(PositionableVec3)
end
return self.coordinate
end
-- Error message.
BASE:E( { "Cannot GetCoordinate", Positionable = self, Alive = self:IsAlive() } )
return nil
end
--- Returns a COORDINATE object indicating the point in 3D of the POSITIONABLE within the mission.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return Core.Point#COORDINATE The COORDINATE of the POSITIONABLE.
@ -417,26 +473,6 @@ function POSITIONABLE:GetRandomVec3( Radius )
return nil
end
--- Returns the @{DCS#Vec3} vector indicating the 3D vector of the POSITIONABLE within the mission.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return DCS#Vec3 The 3D point vector of the POSITIONABLE.
-- @return #nil The POSITIONABLE is not existing or alive.
function POSITIONABLE:GetVec3()
self:F2( self.PositionableName )
local DCSPositionable = self:GetDCSObject()
if DCSPositionable then
local PositionableVec3 = DCSPositionable:getPosition().p
self:T3( PositionableVec3 )
return PositionableVec3
end
BASE:E( { "Cannot GetVec3", Positionable = self, Alive = self:IsAlive() } )
return nil
end
--- Get the bounding box of the underlying POSITIONABLE DCS Object.
-- @param #POSITIONABLE self