mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Warehouse marker and spawning update
This commit is contained in:
parent
f30c66424c
commit
cfc45cf068
@ -58,6 +58,10 @@
|
|||||||
-- @field Core.Point#COORDINATE rail Closest point to warehouse on rail.
|
-- @field Core.Point#COORDINATE rail Closest point to warehouse on rail.
|
||||||
-- @field Core.Zone#ZONE spawnzone Zone in which assets are spawned.
|
-- @field Core.Zone#ZONE spawnzone Zone in which assets are spawned.
|
||||||
-- @field #number uid Unique ID of the warehouse.
|
-- @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 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 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.
|
-- @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 #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 #boolean respawnafterdestroyed If true, warehouse is respawned after it was destroyed. Assets are kept.
|
||||||
-- @field #number respawndelay Delay before respawn in seconds.
|
-- @field #number respawndelay Delay before respawn in seconds.
|
||||||
-- @field #boolean markerOn If true, markers are displayed on the F10 map.
|
|
||||||
-- @extends Core.Fsm#FSM
|
-- @extends Core.Fsm#FSM
|
||||||
|
|
||||||
--- Have your assets at the right place at the right time - or not!
|
--- Have your assets at the right place at the right time - or not!
|
||||||
@ -1560,7 +1563,6 @@ WAREHOUSE = {
|
|||||||
rail = nil,
|
rail = nil,
|
||||||
spawnzone = nil,
|
spawnzone = nil,
|
||||||
uid = nil,
|
uid = nil,
|
||||||
markerid = nil,
|
|
||||||
dTstatus = 30,
|
dTstatus = 30,
|
||||||
queueid = 0,
|
queueid = 0,
|
||||||
stock = {},
|
stock = {},
|
||||||
@ -3372,7 +3374,7 @@ function WAREHOUSE:onafterStop(From, Event, To)
|
|||||||
self:_UpdateWarehouseMarkText()
|
self:_UpdateWarehouseMarkText()
|
||||||
|
|
||||||
-- Clear all pending schedules.
|
-- Clear all pending schedules.
|
||||||
--self.CallScheduler:Clear()
|
self.CallScheduler:Clear()
|
||||||
end
|
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.
|
--- 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)
|
function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
||||||
|
|
||||||
-- Init default
|
-- Init default
|
||||||
local scanradius=100
|
local scanradius=25
|
||||||
local scanunits=true
|
local scanunits=true
|
||||||
local scanstatics=true
|
local scanstatics=true
|
||||||
local scanscenery=false
|
local scanscenery=false
|
||||||
@ -7527,14 +7529,14 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Get parking spot data table. This contains all free and "non-free" spots.
|
-- 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.
|
-- List of obstacles.
|
||||||
local obstacles={}
|
local obstacles={}
|
||||||
|
|
||||||
-- Check all clients. Clients dont change so we can put that out of the loop.
|
-- Check all clients. Clients dont change so we can put that out of the loop.
|
||||||
local clientcoords=_clients()
|
self.clientcoords=self.clientcoords or _clients()
|
||||||
for clientname,_coord in pairs(clientcoords) do
|
for clientname,_coord in pairs(self.clientcoords) do
|
||||||
table.insert(obstacles, {coord=_coord, size=15, name=clientname, type="client"})
|
table.insert(obstacles, {coord=_coord, size=15, name=clientname, type="client"})
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -7605,20 +7607,9 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
|||||||
-- Coordinate of the parking spot.
|
-- Coordinate of the parking spot.
|
||||||
local _spot=parkingspot.Coordinate -- Core.Point#COORDINATE
|
local _spot=parkingspot.Coordinate -- Core.Point#COORDINATE
|
||||||
local _termid=parkingspot.TerminalID
|
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 free=true
|
||||||
local problem=nil
|
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.
|
-- Loop over all obstacles.
|
||||||
for _,obstacle in pairs(obstacles) do
|
for _,obstacle in pairs(obstacles) do
|
||||||
|
|
||||||
@ -8405,27 +8396,47 @@ function WAREHOUSE:_UpdateWarehouseMarkText()
|
|||||||
|
|
||||||
if self.markerOn then
|
if self.markerOn then
|
||||||
|
|
||||||
-- Create a mark with the current assets in stock.
|
-- Marker text.
|
||||||
if self.markerid~=nil then
|
|
||||||
trigger.action.removeMark(self.markerid)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Get assets in stock.
|
|
||||||
local _data=self:GetStockInfo(self.stock)
|
|
||||||
|
|
||||||
-- Text.
|
|
||||||
local text=string.format("Warehouse state: %s\nTotal assets in stock %d:\n", self:GetState(), #self.stock)
|
local text=string.format("Warehouse state: %s\nTotal assets in stock %d:\n", self:GetState(), #self.stock)
|
||||||
|
for _attribute,_count in pairs(self:GetStockInfo(self.stock) or {}) do
|
||||||
for _attribute,_count in pairs(_data) do
|
|
||||||
if _count>0 then
|
if _count>0 then
|
||||||
local attribute=tostring(UTILS.Split(_attribute, "_")[2])
|
local attribute=tostring(UTILS.Split(_attribute, "_")[2])
|
||||||
text=text..string.format("%s=%d, ", attribute,_count)
|
text=text..string.format("%s=%d, ", attribute,_count)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create/update marker at warehouse in F10 map.
|
local coordinate=self:GetCoordinate()
|
||||||
self.markerid=self:GetCoordinate():MarkToCoalition(text, self:GetCoalition(), true)
|
local coalition=self:GetCoalition()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -219,6 +219,26 @@ function POSITIONABLE:GetPositionVec3()
|
|||||||
return nil
|
return nil
|
||||||
end
|
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.
|
--- Returns the @{DCS#Vec2} vector indicating the point in 2D of the POSITIONABLE within the mission.
|
||||||
-- @param Wrapper.Positionable#POSITIONABLE self
|
-- @param Wrapper.Positionable#POSITIONABLE self
|
||||||
-- @return DCS#Vec2 The 2D point vector of the POSITIONABLE.
|
-- @return DCS#Vec2 The 2D point vector of the POSITIONABLE.
|
||||||
@ -302,6 +322,42 @@ function POSITIONABLE:GetPointVec3()
|
|||||||
return nil
|
return nil
|
||||||
end
|
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.
|
--- Returns a COORDINATE object indicating the point in 3D of the POSITIONABLE within the mission.
|
||||||
-- @param Wrapper.Positionable#POSITIONABLE self
|
-- @param Wrapper.Positionable#POSITIONABLE self
|
||||||
-- @return Core.Point#COORDINATE The COORDINATE of the POSITIONABLE.
|
-- @return Core.Point#COORDINATE The COORDINATE of the POSITIONABLE.
|
||||||
@ -417,26 +473,6 @@ function POSITIONABLE:GetRandomVec3( Radius )
|
|||||||
return nil
|
return nil
|
||||||
end
|
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.
|
--- Get the bounding box of the underlying POSITIONABLE DCS Object.
|
||||||
-- @param #POSITIONABLE self
|
-- @param #POSITIONABLE self
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user