mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Warehouse v0.1.3
This commit is contained in:
parent
06688366c6
commit
195459d6d8
@ -123,6 +123,8 @@ function AI_CARGO_DISPATCHER:New( SetCarrier, SetCargo )
|
|||||||
self:AddTransition( "*", "Unloaded", "*" )
|
self:AddTransition( "*", "Unloaded", "*" )
|
||||||
|
|
||||||
self:AddTransition( "*", "Home", "*" )
|
self:AddTransition( "*", "Home", "*" )
|
||||||
|
self:AddTransition( "*", "RTB", "*" ) --FF
|
||||||
|
self:AddTransition( "*", "BackHome", "*" ) --FF
|
||||||
|
|
||||||
self.MonitorTimeInterval = 30
|
self.MonitorTimeInterval = 30
|
||||||
self.DeployRadiusInner = 200
|
self.DeployRadiusInner = 200
|
||||||
|
|||||||
@ -22,16 +22,19 @@
|
|||||||
-- @field #string ClassName Name of the class.
|
-- @field #string ClassName Name of the class.
|
||||||
-- @field #boolean Debug If true, send debug messages to all.
|
-- @field #boolean Debug If true, send debug messages to all.
|
||||||
-- @field #boolean Report If true, send status messages to coalition.
|
-- @field #boolean Report If true, send status messages to coalition.
|
||||||
-- @field DCS#Coalition coalition Coalition the warehouse belongs to.
|
-- @field DCS#coalition.side coalition Coalition ID the warehouse belongs to.
|
||||||
|
-- @field DCS#country.id country Country ID the warehouse belongs to.
|
||||||
-- @field Wrapper.Airbase#AIRBASE homebase Airbase the warehouse belongs to.
|
-- @field Wrapper.Airbase#AIRBASE homebase Airbase the warehouse belongs to.
|
||||||
-- @field DCS#Airbase.Category category Category of the home airbase, i.e. airdrome, helipad/farp or ship.
|
-- @field DCS#Airbase.Category category Category of the home airbase, i.e. airdrome, helipad/farp or ship.
|
||||||
-- @field Core.Point#COORDINATE coordinate Coordinate of the warehouse.
|
-- @field Core.Point#COORDINATE coordinate Coordinate of the warehouse.
|
||||||
-- @field Core.Zone#ZONE spawnzone Zone in which assets are spawned.
|
-- @field Core.Zone#ZONE spawnzone Zone in which assets are spawned.
|
||||||
-- @field #string wid Identifier of the warehouse printed before other output to DCS.log file.
|
-- @field #string wid Identifier of the warehouse printed before other output to DCS.log file.
|
||||||
|
-- @field #number uid Unit identifier of the warehouse. Derived from the associated airbase.
|
||||||
-- @field #number markerid ID of the warehouse marker at the airbase.
|
-- @field #number markerid ID of the warehouse marker at the airbase.
|
||||||
-- @field #number assetid Unique id of asset items in stock. Essentially a running number starting at one and incremented when a new asset is added.
|
-- @field #number assetid Unique id of asset items in stock. Essentially a running number starting at one and incremented when a new asset is added.
|
||||||
-- @field #table stock Table holding all assets in stock. Table entries are of type @{#WAREHOUSE.Stockitem}.
|
-- @field #table stock Table holding all assets in stock. Table entries are of type @{#WAREHOUSE.Stockitem}.
|
||||||
-- @field #table queue Table holding all queued requests. Table entries are of type @{#WAREHOUSE.Queueitem}.
|
-- @field #table queue Table holding all queued requests. Table entries are of type @{#WAREHOUSE.Queueitem}.
|
||||||
|
-- @field #table pending Table holding all pending requests, i.e. those that are currently in progress. Table entries are of type @{#WAREHOUSE.Queueitem}.
|
||||||
-- @extends Core.Fsm#FSM
|
-- @extends Core.Fsm#FSM
|
||||||
|
|
||||||
--- Manages ground assets of an airbase and offers the possibility to transport them to another airbase or warehouse.
|
--- Manages ground assets of an airbase and offers the possibility to transport them to another airbase or warehouse.
|
||||||
@ -74,12 +77,15 @@ WAREHOUSE = {
|
|||||||
Debug = false,
|
Debug = false,
|
||||||
Report = true,
|
Report = true,
|
||||||
coalition = nil,
|
coalition = nil,
|
||||||
|
country = nil,
|
||||||
homebase = nil,
|
homebase = nil,
|
||||||
category = nil,
|
category = nil,
|
||||||
coordinate = nil,
|
coordinate = nil,
|
||||||
spawnzone = nil,
|
spawnzone = nil,
|
||||||
wid = nil,
|
wid = nil,
|
||||||
|
uid = nil,
|
||||||
markerid = nil,
|
markerid = nil,
|
||||||
|
warehouse = nil,
|
||||||
assetid = 0,
|
assetid = 0,
|
||||||
queueid = 0,
|
queueid = 0,
|
||||||
stock = {},
|
stock = {},
|
||||||
@ -90,6 +96,7 @@ WAREHOUSE = {
|
|||||||
-- @type WAREHOUSE.Stockitem
|
-- @type WAREHOUSE.Stockitem
|
||||||
-- @field #number id Unique id of the asset.
|
-- @field #number id Unique id of the asset.
|
||||||
-- @field #string templatename Name of the template group.
|
-- @field #string templatename Name of the template group.
|
||||||
|
-- @field #table template The spawn template of the group.
|
||||||
-- @field DCS#Group.Category category Category of the group.
|
-- @field DCS#Group.Category category Category of the group.
|
||||||
-- @field #string unittype Type of the first unit of the group as obtained by the Object.getTypeName() DCS API function.
|
-- @field #string unittype Type of the first unit of the group as obtained by the Object.getTypeName() DCS API function.
|
||||||
-- @field #WAREHOUSE.Attribute attribute Generalized attribute of the group.
|
-- @field #WAREHOUSE.Attribute attribute Generalized attribute of the group.
|
||||||
@ -147,12 +154,12 @@ WAREHOUSE.TransportType = {
|
|||||||
APC = "Transport_APC",
|
APC = "Transport_APC",
|
||||||
SHIP = "Ship",
|
SHIP = "Ship",
|
||||||
TRAIN = "Train",
|
TRAIN = "Train",
|
||||||
SELFPROPELLED = "Selfporpelled",
|
SELFPROPELLED = "Selfpropelled",
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Warehouse class version.
|
--- Warehouse class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
WAREHOUSE.version="0.1.2"
|
WAREHOUSE.version="0.1.3"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO: Warehuse todo list.
|
-- TODO: Warehuse todo list.
|
||||||
@ -195,7 +202,9 @@ function WAREHOUSE:NewAirbase(airbase)
|
|||||||
self.homebase=airbase
|
self.homebase=airbase
|
||||||
self.coordinate=airbase:GetCoordinate()
|
self.coordinate=airbase:GetCoordinate()
|
||||||
self.coalition=airbase:GetCoalition()
|
self.coalition=airbase:GetCoalition()
|
||||||
|
self.country=airbase:GetCountry()
|
||||||
self.category=airbase:GetDesc().category
|
self.category=airbase:GetDesc().category
|
||||||
|
self.uid=airbase:GetID()
|
||||||
|
|
||||||
-- Get the closest point on road.
|
-- Get the closest point on road.
|
||||||
local _road=self.coordinate:GetClosestPointToRoad():GetVec2()
|
local _road=self.coordinate:GetClosestPointToRoad():GetVec2()
|
||||||
@ -255,29 +264,21 @@ function WAREHOUSE:NewAirbase(airbase)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Set a zone where the (ground) assets of the warehouse are spawned once requested.
|
|
||||||
-- @param #WAREHOUSE self
|
|
||||||
-- @param Core.Zone#ZONE zone The spawn zone.
|
|
||||||
-- @return #WAREHOUSE self
|
|
||||||
function WAREHOUSE:SetSpawnZone(zone)
|
|
||||||
self.spawnzone=zone
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- FSM states
|
-- FSM states
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- Warehouse
|
--- On after Start event. Starts the warehouse. Addes event handlers and schedules status updates of reqests and queue.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
function WAREHOUSE:onafterStart(From, Event, To)
|
function WAREHOUSE:onafterStart(From, Event, To)
|
||||||
self:E(self.wid..string.format("Starting warehouse at airbase %s, category %d, coalition %d.", self.homebase:GetName(), self.category, self.coalition))
|
self:E(self.wid..string.format("Starting warehouse at airbase %s, category %d, coalition %d, country %d", self.homebase:GetName(), self.category, self.coalition, self.country))
|
||||||
|
|
||||||
-- Debug mark spawn zone.
|
-- Debug mark spawn zone.
|
||||||
self.spawnzone:BoundZone(60,country.id.GERMANY)
|
--self.spawnzone:BoundZone(60, country.id.GERMANY)
|
||||||
|
self.spawnzone:BoundZone(60, self.country)
|
||||||
self.spawnzone:GetCoordinate():MarkToAll("Spawnzone of warehouse "..self.homebase:GetName())
|
self.spawnzone:GetCoordinate():MarkToAll("Spawnzone of warehouse "..self.homebase:GetName())
|
||||||
|
|
||||||
-- handle events
|
-- handle events
|
||||||
@ -291,7 +292,7 @@ end
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- Warehouse
|
--- On after Status event. Checks the queue and handles requests.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
@ -339,147 +340,6 @@ end
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- On before "Request" event. Checks if the request can be fullfilled.
|
|
||||||
-- @param #WAREHOUSE self
|
|
||||||
-- @param Wrapper.Airbase#AIRBASE Airbase airbase requesting supply.
|
|
||||||
-- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
|
|
||||||
-- @param AssetDescriptorValue Value of the asset descriptor. Type depends on descriptor, i.e. could be a string, etc.
|
|
||||||
-- @param #number nAsset Number of groups requested that match the asset specification.
|
|
||||||
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
|
||||||
-- @param #number nTransport Number of transport units requested.
|
|
||||||
-- @param #number Prio Priority of the request. Number ranging from 1=high to 100=low.
|
|
||||||
function WAREHOUSE:AddRequest(airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType, nTransport, Prio)
|
|
||||||
|
|
||||||
nAsset=nAsset or 1
|
|
||||||
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
|
|
||||||
nTransport=nTransport or 1
|
|
||||||
Prio=Prio or 50
|
|
||||||
|
|
||||||
--TODO: check that
|
|
||||||
-- if warehouse or requestor is a FARP, plane asset and transport not possible
|
|
||||||
-- if requestor or warehouse is a SHIP, APC transport not possible, SELFPROPELLED only for AIR/SHIP
|
|
||||||
-- etc. etc...
|
|
||||||
|
|
||||||
local request_category=airbase:GetDesc().category
|
|
||||||
|
|
||||||
if self.category==Airbase.Category.HELIPAD or request_category==Airbase.Category.HELIPAD then
|
|
||||||
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
|
|
||||||
self:E("ERROR: incorrect request. Warehouse or requestor is FARP. No transport by plane possible!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Increase id.
|
|
||||||
self.queueid=self.queueid+1
|
|
||||||
|
|
||||||
-- Request queue table item.
|
|
||||||
local request={uid=self.queueid, prio=Prio, airbase=airbase, category=request_category, assetdesc=AssetDescriptor, assetdescval=AssetDescriptorValue, nasset=nAsset, transporttype=TransportType, ntransport=nTransport}
|
|
||||||
|
|
||||||
-- Add request to queue.
|
|
||||||
table.insert(self.queue, request)
|
|
||||||
end
|
|
||||||
|
|
||||||
---Checks if the request can be fullfilled.
|
|
||||||
-- @param #WAREHOUSE self
|
|
||||||
-- @param #WAREHOUSE.Queueitem qitem The request to be checked.
|
|
||||||
-- @return #boolean If true, request can be executed. If false, something is not right.
|
|
||||||
function WAREHOUSE:_CheckRequest(request)
|
|
||||||
|
|
||||||
local okay=true
|
|
||||||
|
|
||||||
-- Check if number of requested assets is in stock.
|
|
||||||
local _assets=self:_FilterStock(self.stock, request.assetdesc, request.assetdescval, request.nasset)
|
|
||||||
|
|
||||||
-- Get the attibute of the requested asset.
|
|
||||||
local _assetattribute=_assets[1].attribute
|
|
||||||
local _assetcategory=_assets[1].category
|
|
||||||
|
|
||||||
-- Check if enough assets are in stock.
|
|
||||||
if request.nasset > #_assets then
|
|
||||||
local text=string.format("Request denied! Not enough assets currently available.")
|
|
||||||
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
|
||||||
self:E(self.wid..text)
|
|
||||||
okay=false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Check available parking for asset units.
|
|
||||||
local Parkingdata=self.homebase:GetParkingSpotsTable()
|
|
||||||
env.info("FF number parking data before "..#Parkingdata)
|
|
||||||
local Parking
|
|
||||||
if _assetcategory==Group.Category.AIRPLANE or _assetcategory==Group.Category.HELICOPTER then
|
|
||||||
Parking, Parkingdata=self:_GetParkingForAssets(_assets, Parkingdata)
|
|
||||||
env.info("FF number parking data after assets "..#Parkingdata)
|
|
||||||
if Parking==nil then
|
|
||||||
local text=string.format("Request denied! Not enough free parking spots for all assets at the moment.")
|
|
||||||
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
|
||||||
self:E(self.wid..text)
|
|
||||||
okay=false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Check that a transport units.
|
|
||||||
if request.transporttype~=WAREHOUSE.TransportType.SELFPROPELLED then
|
|
||||||
|
|
||||||
-- Transports in stock.
|
|
||||||
local _transports=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, request.transporttype, request.ntransport)
|
|
||||||
|
|
||||||
-- Get the attibute of the transport units.
|
|
||||||
local _transportattribute=_transports[1].attribute
|
|
||||||
local _transportcategory=_transports[1].category
|
|
||||||
|
|
||||||
-- Check if enough transport units are available.
|
|
||||||
if request.ntransport > #_transports then
|
|
||||||
local text=string.format("Request denied! Not enough transport units currently available.")
|
|
||||||
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
|
||||||
self:E(self.wid..text)
|
|
||||||
okay=false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Check available parking for transport units.
|
|
||||||
if _transportcategory==Group.Category.AIRPLANE or _transportcategory==Group.Category.HELICOPTER then
|
|
||||||
Parking, Parkingdata=self:_GetParkingForAssets(_transports, Parkingdata)
|
|
||||||
env.info("FF number parking data after transport "..#Parkingdata)
|
|
||||||
if Parking==nil then
|
|
||||||
local text=string.format("Request denied! Not enough free parking spots for all transports at the moment.")
|
|
||||||
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
|
||||||
self:E(self.wid..text)
|
|
||||||
okay=false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
-- self propelled case.
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
return okay
|
|
||||||
end
|
|
||||||
|
|
||||||
---Sorts the queue and checks if the request can be fullfilled.
|
|
||||||
-- @param #WAREHOUSE self
|
|
||||||
-- @return #WAREHOUSE.Queueitem Chosen request.
|
|
||||||
function WAREHOUSE:_CheckQueue()
|
|
||||||
|
|
||||||
-- Sort queue wrt to first prio and then qid.
|
|
||||||
self:_SortQueue()
|
|
||||||
|
|
||||||
-- Search for a request we can execute.
|
|
||||||
local request=nil --#WAREHOUSE.Queueitem
|
|
||||||
for _,_qitem in ipairs(self.queue) do
|
|
||||||
local qitem=_qitem --#WAREHOUSE.Queueitem
|
|
||||||
local okay=self:_CheckRequest(qitem)
|
|
||||||
if okay==true then
|
|
||||||
request=qitem
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Execute request.
|
|
||||||
return request
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--- On before "Request" event. Checks if the request can be fullfilled.
|
--- On before "Request" event. Checks if the request can be fullfilled.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
@ -556,8 +416,10 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
local spawncoord=self.spawnzone:GetRandomCoordinate()
|
local spawncoord=self.spawnzone:GetRandomCoordinate()
|
||||||
|
|
||||||
-- Alias of the group. Spawn with ALIAS here or DCS crashes!
|
-- Alias of the group. Spawn with ALIAS here or DCS crashes!
|
||||||
local _alias=string.format("%s_AssetID-%04d_RequestID-%04d", _assetitem.templatename,_assetitem.id,Request.uid)
|
--local _alias=string.format("%s_WID-%02d_AID-%04d_RID-%04d", _assetitem.unittype, self.uid,_assetitem.id,Request.uid)
|
||||||
local _spawn=SPAWN:NewWithAlias(_assetitem.templatename,_alias)
|
local _alias=self:_Alias(_assetitem,Request)
|
||||||
|
--local _spawn=SPAWN:NewWithAlias(_assetitem.templatename,_alias)
|
||||||
|
local _spawn=SPAWN:NewFromTemplate(_assetitem.template,_assetitem.templatename,_alias)
|
||||||
|
|
||||||
local _group=nil --Wrapper.Group#GROUP
|
local _group=nil --Wrapper.Group#GROUP
|
||||||
|
|
||||||
@ -636,6 +498,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Delete request from queue.
|
-- Delete request from queue.
|
||||||
|
table.insert(self.pending, Request)
|
||||||
self:_DeleteQueueItem(Request.uid)
|
self:_DeleteQueueItem(Request.uid)
|
||||||
|
|
||||||
-- No cargo transport necessary.
|
-- No cargo transport necessary.
|
||||||
@ -687,11 +550,14 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
local _parking=Parking[i]
|
local _parking=Parking[i]
|
||||||
|
|
||||||
-- Spawn with ALIAS here or DCS crashes!
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
--local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
local _alias=self:_Alias(_assetitem, Request)
|
||||||
|
|
||||||
-- Spawn plane at airport in uncontrolled state.
|
-- Spawn plane at airport in uncontrolled state.
|
||||||
local _takeoff=SPAWN.Takeoff.Cold
|
local _takeoff=SPAWN.Takeoff.Cold
|
||||||
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):InitUnControlled(true):SpawnAtAirbase(self.homebase,_takeoff, nil, nil, false, _parking)
|
--local spawn=SPAWN:NewWithAlias(_assetitem.templatename,_alias)
|
||||||
|
local spawn=SPAWN:NewFromTemplate(_assetitem.template,_assetitem.templatename,_alias)
|
||||||
|
local spawngroup=spawn:InitUnControlled(true):SpawnAtAirbase(self.homebase,_takeoff, nil, nil, false, _parking)
|
||||||
|
|
||||||
if spawngroup then
|
if spawngroup then
|
||||||
-- Set state of warehouse so we can retrieve it later.
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
@ -723,11 +589,14 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
local _parking=Parking[i]
|
local _parking=Parking[i]
|
||||||
|
|
||||||
-- Spawn with ALIAS here or DCS crashes!
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
--local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
local _alias=self:_Alias(_assetitem, Request)
|
||||||
|
|
||||||
-- Spawn helo at airport.
|
-- Spawn helo at airport.
|
||||||
local _takeoff=SPAWN.Takeoff.Hot
|
local _takeoff=SPAWN.Takeoff.Hot
|
||||||
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):InitUnControlled(false):SpawnAtAirbase(self.homebase,_takeoff, nil, nil, false, _parking)
|
--local spawn=SPAWN:NewWithAlias(_assetitem.templatename,_alias)
|
||||||
|
local spawn=SPAWN:NewFromTemplate(_assetitem.template,_assetitem.templatename,_alias)
|
||||||
|
local spawngroup=spawn:InitUnControlled(false):SpawnAtAirbase(self.homebase,_takeoff, nil, nil, false, _parking)
|
||||||
|
|
||||||
if spawngroup then
|
if spawngroup then
|
||||||
-- Set state of warehouse so we can retrieve it later.
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
@ -764,10 +633,13 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
|
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
|
||||||
|
|
||||||
-- Spawn with ALIAS here or DCS crashes!
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
--local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
local _alias=self:_Alias(_assetitem, Request)
|
||||||
|
|
||||||
-- Spawn plane at airport in uncontrolled state.
|
-- Spawn plane at airport in uncontrolled state.
|
||||||
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):SpawnFromCoordinate(self.spawnzone:GetRandomCoordinate())
|
local spawn=SPAWN:NewWithAlias(_assetitem.templatename,_alias)
|
||||||
|
local spawn=SPAWN:NewFromTemplate(_assetitem.template,_assetitem.templatename,_alias)
|
||||||
|
local spawngroup=spawn:SpawnFromCoordinate(self.spawnzone:GetRandomCoordinate())
|
||||||
|
|
||||||
if spawngroup then
|
if spawngroup then
|
||||||
-- Set state of warehouse so we can retrieve it later.
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
@ -832,27 +704,45 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
|||||||
warehouse:__Delivered(1, group)
|
warehouse:__Delivered(1, group)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- On after BackHome event.
|
||||||
|
function CargoTransport:OnAfterBackHome(From, Event, To, Carrier)
|
||||||
|
|
||||||
|
-- Get warehouse state.
|
||||||
|
local warehouse=Carrier:GetState(Carrier, "WAREHOUSE") --#WAREHOUSE
|
||||||
|
Carrier:SmokeRed()
|
||||||
|
|
||||||
|
-- Add carrier back to warehouse stock. Actual unit is destroyed.
|
||||||
|
warehouse:AddAsset(Carrier:GetName(), 1)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
-- Start dispatcher.
|
-- Start dispatcher.
|
||||||
CargoTransport:__Start(5)
|
CargoTransport:__Start(5)
|
||||||
|
|
||||||
-- Delete request from queue.
|
-- Delete request from queue.
|
||||||
|
table.insert(self.pending, Request)
|
||||||
self:_DeleteQueueItem(Request.uid)
|
self:_DeleteQueueItem(Request.uid)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- Warehouse
|
--- On after "Delivered" event.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Wrapper.Group#GROUP Group The group that was delivered.
|
-- @param Wrapper.Group#GROUP group The group that was delivered.
|
||||||
function WAREHOUSE:onafterDelivered(From, Event, To, Group)
|
function WAREHOUSE:onafterDelivered(From, Event, To, group)
|
||||||
env.info("FF warehouse cargo delivered! Croutine to closest point on road")
|
self:E(self.wid..string.format("Cargo %s delivered!", group:GetName()))
|
||||||
local road=Group:GetCoordinate():GetClosestPointToRoad()
|
|
||||||
local speed=Group:GetSpeedMax()*0.6
|
-- Route a ground group to the closest point on road.
|
||||||
Group:RouteGroundTo(road, speed, "Off Road")
|
if group:IsGround() and group:GetSpeedMax()>0 then
|
||||||
|
local road=group:GetCoordinate():GetClosestPointToRoad()
|
||||||
|
local speed=group:GetSpeedMax()*0.6
|
||||||
|
group:RouteGroundTo(road, speed, "Off Road")
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -894,12 +784,23 @@ function WAREHOUSE:AddAsset(templategroupname, ngroups)
|
|||||||
self.assetid=self.assetid+1
|
self.assetid=self.assetid+1
|
||||||
stockitem.id=self.assetid
|
stockitem.id=self.assetid
|
||||||
stockitem.templatename=templategroupname
|
stockitem.templatename=templategroupname
|
||||||
|
stockitem.template=UTILS.DeepCopy(_DATABASE.Templates.Groups[templategroupname].Template)
|
||||||
stockitem.category=DCScategory
|
stockitem.category=DCScategory
|
||||||
stockitem.unittype=DCStype
|
stockitem.unittype=DCStype
|
||||||
stockitem.attribute=attribute
|
stockitem.attribute=attribute
|
||||||
|
|
||||||
|
-- Modify the template so that the group is spawned with the right coalition.
|
||||||
|
stockitem.template.CoalitionID=self.coalition
|
||||||
|
stockitem.template.CountryID=self.country
|
||||||
|
|
||||||
table.insert(self.stock, stockitem)
|
table.insert(self.stock, stockitem)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Destroy group if it is alive.
|
||||||
|
if group:IsAlive()==true then
|
||||||
|
group:Destroy()
|
||||||
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
-- Group name does not exist!
|
-- Group name does not exist!
|
||||||
self:E(string.format("ERROR: Template group name not defined in the mission editor. Check the spelling! templategroupname=%s",tostring(templategroupname)))
|
self:E(string.format("ERROR: Template group name not defined in the mission editor. Check the spelling! templategroupname=%s",tostring(templategroupname)))
|
||||||
@ -908,10 +809,262 @@ function WAREHOUSE:AddAsset(templategroupname, ngroups)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set a zone where the (ground) assets of the warehouse are spawned once requested.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
-- @param Core.Zone#ZONE zone The spawn zone.
|
||||||
|
-- @return #WAREHOUSE self
|
||||||
|
function WAREHOUSE:SetSpawnZone(zone)
|
||||||
|
self.spawnzone=zone
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Add a request for the warehouse.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
-- @param Wrapper.Airbase#AIRBASE Airbase airbase requesting supply.
|
||||||
|
-- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
|
||||||
|
-- @param AssetDescriptorValue Value of the asset descriptor. Type depends on descriptor, i.e. could be a string, etc.
|
||||||
|
-- @param #number nAsset Number of groups requested that match the asset specification.
|
||||||
|
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
||||||
|
-- @param #number nTransport Number of transport units requested.
|
||||||
|
-- @param #number Prio Priority of the request. Number ranging from 1=high to 100=low.
|
||||||
|
function WAREHOUSE:AddRequest(airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType, nTransport, Prio)
|
||||||
|
|
||||||
|
nAsset=nAsset or 1
|
||||||
|
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
|
||||||
|
nTransport=nTransport or 1
|
||||||
|
Prio=Prio or 50
|
||||||
|
|
||||||
|
--TODO: check that
|
||||||
|
-- if warehouse or requestor is a FARP, plane asset and transport not possible.
|
||||||
|
-- if requestor or warehouse is a SHIP, APC transport not possible, SELFPROPELLED only for AIR/SHIP
|
||||||
|
-- etc. etc...
|
||||||
|
|
||||||
|
local request_category=airbase:GetDesc().category --DCS#Airbase.Category
|
||||||
|
|
||||||
|
-- No airplanes from to to FARPS.
|
||||||
|
if self.category==Airbase.Category.HELIPAD or request_category==Airbase.Category.HELIPAD then
|
||||||
|
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
|
||||||
|
self:E("ERROR: incorrect request. Warehouse or requestor is FARP. No transport by plane possible!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local request_air=false
|
||||||
|
local request_plane=false
|
||||||
|
local request_helo=false
|
||||||
|
local request_ground=false
|
||||||
|
local request_naval=false
|
||||||
|
|
||||||
|
-- Check if category is matching
|
||||||
|
if AssetDescriptor==WAREHOUSE.Descriptor.CATEGORY then
|
||||||
|
if AssetDescriptorValue==Group.Category.AIRPLANE then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==Group.Category.HELICOPTER then
|
||||||
|
request_helo=true
|
||||||
|
elseif AssetDescriptorValue==Group.Category.GROUND then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==Group.Category.SHIP then
|
||||||
|
request_naval=true
|
||||||
|
elseif AssetDescriptorValue==Group.Category.TRAIN then
|
||||||
|
request_ground=true
|
||||||
|
else
|
||||||
|
self:E("ERROR: incorrect request. Asset Descriptor missmatch! Has to be Group.Cagetory.AIRPLANE, ...")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check attribute is matching
|
||||||
|
if AssetDescriptor==WAREHOUSE.Descriptor.ATTRIBUTE then
|
||||||
|
if AssetDescriptorValue==WAREHOUSE.Attribute.ARTILLERY then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.ATTACKHELICOPTER then
|
||||||
|
request_helo=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.AWACS then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.BOMBER then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.FIGHTER then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.INFANTRY then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.OTHER then
|
||||||
|
self:E("ERROR: incorrect request. Asset attribute WAREHOUSE.Attribute.OTHER is not valid!")
|
||||||
|
return
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.SHIP then
|
||||||
|
request_naval=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TANK then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TANKER then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TRAIN then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TRANSPORT_APC then
|
||||||
|
request_ground=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TRANSPORT_HELO then
|
||||||
|
request_helo=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TRANSPORT_PLANE then
|
||||||
|
request_plane=true
|
||||||
|
elseif AssetDescriptorValue==WAREHOUSE.Attribute.TRUCK then
|
||||||
|
request_ground=true
|
||||||
|
else
|
||||||
|
self:E("ERROR: incorrect request. Unknown asset attribute!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
request_air=request_helo or request_plane
|
||||||
|
|
||||||
|
if request_air then
|
||||||
|
|
||||||
|
if request_plane then
|
||||||
|
-- No airplane to or from FARPS.
|
||||||
|
if request_category==Airbase.Category.HELIPAD or self.category==Airbase.Category.HELIPAD then
|
||||||
|
self:E("ERROR: incorrect request. Asset aircraft requestst but warehouse or requestor is HELIPAD/FARP!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
elseif request_helo then
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif request_ground then
|
||||||
|
|
||||||
|
-- No ground assets directly to ships.
|
||||||
|
if (request_category==Airbase.Category.SHIP or self.category==Airbase.Category.SHIP)
|
||||||
|
and not (TransportType==WAREHOUSE.TransportType.AIRPLANE or TransportType==WAREHOUSE.TransportType.HELICOPTER) then
|
||||||
|
self:E("ERROR: incorrect request. Ground asset requested but warehouse or requestor is SHIP!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif request_naval then
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Increase id.
|
||||||
|
self.queueid=self.queueid+1
|
||||||
|
|
||||||
|
-- Request queue table item.
|
||||||
|
local request={uid=self.queueid, prio=Prio, airbase=airbase, category=request_category, assetdesc=AssetDescriptor, assetdescval=AssetDescriptorValue, nasset=nAsset, transporttype=TransportType, ntransport=nTransport}
|
||||||
|
|
||||||
|
-- Add request to queue.
|
||||||
|
table.insert(self.queue, request)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Helper functions
|
-- Helper functions
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Checks if the request can be fullfilled.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
-- @param #WAREHOUSE.Queueitem qitem The request to be checked.
|
||||||
|
-- @return #boolean If true, request can be executed. If false, something is not right.
|
||||||
|
function WAREHOUSE:_CheckRequest(request)
|
||||||
|
|
||||||
|
local okay=true
|
||||||
|
|
||||||
|
-- Check if number of requested assets is in stock.
|
||||||
|
local _assets=self:_FilterStock(self.stock, request.assetdesc, request.assetdescval, request.nasset)
|
||||||
|
|
||||||
|
-- Get the attibute of the requested asset.
|
||||||
|
local _assetattribute=_assets[1].attribute
|
||||||
|
local _assetcategory=_assets[1].category
|
||||||
|
|
||||||
|
-- Check if enough assets are in stock.
|
||||||
|
if request.nasset > #_assets then
|
||||||
|
local text=string.format("Request denied! Not enough assets currently available.")
|
||||||
|
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
||||||
|
self:E(self.wid..text)
|
||||||
|
okay=false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check available parking for asset units.
|
||||||
|
local Parkingdata=self.homebase:GetParkingSpotsTable()
|
||||||
|
local Parking
|
||||||
|
if _assetcategory==Group.Category.AIRPLANE or _assetcategory==Group.Category.HELICOPTER then
|
||||||
|
Parking, Parkingdata=self:_GetParkingForAssets(_assets, Parkingdata)
|
||||||
|
if Parking==nil then
|
||||||
|
local text=string.format("Request denied! Not enough free parking spots for all assets at the moment.")
|
||||||
|
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
||||||
|
self:E(self.wid..text)
|
||||||
|
okay=false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Check that a transport units.
|
||||||
|
if request.transporttype~=WAREHOUSE.TransportType.SELFPROPELLED then
|
||||||
|
|
||||||
|
-- Transports in stock.
|
||||||
|
local _transports=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, request.transporttype, request.ntransport)
|
||||||
|
|
||||||
|
-- Get the attibute of the transport units.
|
||||||
|
local _transportattribute=_transports[1].attribute
|
||||||
|
local _transportcategory=_transports[1].category
|
||||||
|
|
||||||
|
-- Check if enough transport units are available.
|
||||||
|
if request.ntransport > #_transports then
|
||||||
|
local text=string.format("Request denied! Not enough transport units currently available.")
|
||||||
|
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
||||||
|
self:E(self.wid..text)
|
||||||
|
okay=false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check available parking for transport units.
|
||||||
|
if _transportcategory==Group.Category.AIRPLANE or _transportcategory==Group.Category.HELICOPTER then
|
||||||
|
Parking, Parkingdata=self:_GetParkingForAssets(_transports, Parkingdata)
|
||||||
|
if Parking==nil then
|
||||||
|
local text=string.format("Request denied! Not enough free parking spots for all transports at the moment.")
|
||||||
|
MESSAGE:New(text, 5):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
||||||
|
self:E(self.wid..text)
|
||||||
|
okay=false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
-- self propelled case.
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return okay
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Creates a unique name for spawned assets.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
-- @param #WAREHOUSE.Stockitem _assetitem Asset for which the name is created.
|
||||||
|
-- @param #WAREHOUSE.Queueitem _queueitem (Optional) Request specific name.
|
||||||
|
-- @return #string Alias name "UnitType\_WID-%02d\_AID-%04d"
|
||||||
|
function WAREHOUSE:_Alias(_assetitem,_queueitem)
|
||||||
|
local _alias=string.format("%s_WID-%02d_AID-%04d", _assetitem.unittype, self.uid,_assetitem.id)
|
||||||
|
if _queueitem then
|
||||||
|
_alias=_alias..string.format("_RID-%04d",_queueitem.uid)
|
||||||
|
end
|
||||||
|
return _alias
|
||||||
|
end
|
||||||
|
|
||||||
|
---Sorts the queue and checks if the request can be fullfilled.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
-- @return #WAREHOUSE.Queueitem Chosen request.
|
||||||
|
function WAREHOUSE:_CheckQueue()
|
||||||
|
|
||||||
|
-- Sort queue wrt to first prio and then qid.
|
||||||
|
self:_SortQueue()
|
||||||
|
|
||||||
|
-- Search for a request we can execute.
|
||||||
|
local request=nil --#WAREHOUSE.Queueitem
|
||||||
|
for _,_qitem in ipairs(self.queue) do
|
||||||
|
local qitem=_qitem --#WAREHOUSE.Queueitem
|
||||||
|
local okay=self:_CheckRequest(qitem)
|
||||||
|
if okay==true then
|
||||||
|
request=qitem
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Execute request.
|
||||||
|
return request
|
||||||
|
end
|
||||||
|
|
||||||
--- Route ground units to destination.
|
--- Route ground units to destination.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param Wrapper.Group#GROUP Group The ground group.
|
-- @param Wrapper.Group#GROUP Group The ground group.
|
||||||
@ -998,8 +1151,8 @@ function WAREHOUSE:_RouteAir(Aircraft, ToAirbase, Speed)
|
|||||||
local Task = Aircraft:TaskFunction("WAREHOUSE._Arrived", self)
|
local Task = Aircraft:TaskFunction("WAREHOUSE._Arrived", self)
|
||||||
|
|
||||||
--or
|
--or
|
||||||
--ToWaypoint.task=Aircraft:TaskCombo({Task})
|
ToWaypoint.task=Aircraft:TaskCombo({Task})
|
||||||
ToWaypoint.task={Task}
|
--ToWaypoint.task={Task}
|
||||||
|
|
||||||
-- Second point of the route. First point is done in RespawnAtCurrentAirbase() routine.
|
-- Second point of the route. First point is done in RespawnAtCurrentAirbase() routine.
|
||||||
Template.route.points[2] = ToWaypoint
|
Template.route.points[2] = ToWaypoint
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user