mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
WAREHOUSE
This commit is contained in:
parent
aa53004ec8
commit
891a725ccb
@ -266,25 +266,36 @@ function AI_CARGO_AIRPLANE:onafterPickup( Airplane, From, Event, To, Airbase, Sp
|
|||||||
|
|
||||||
if Airplane and Airplane:IsAlive() then
|
if Airplane and Airplane:IsAlive() then
|
||||||
|
|
||||||
|
-- Get closest airbase of current position.
|
||||||
|
local ClosestAirbase, DistToAirbase=Airplane:GetCoordinate():GetClosestAirbase()
|
||||||
|
|
||||||
-- Two cases. Aircraft spawned in air or at an airbase.
|
-- Two cases. Aircraft spawned in air or at an airbase.
|
||||||
if Airplane:InAir() then
|
if Airplane:InAir() then
|
||||||
self.Airbase=nil
|
self.Airbase=nil --> route will start in air
|
||||||
else
|
else
|
||||||
self.Airbase=Airplane:GetCoordinate():GetClosestAirbase()
|
self.Airbase=ClosestAirbase
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Route aircraft to pickup airbase.
|
if Airplane:InAir() or Airbase:GetCoordinate():Get2DDistance(ClosestAirbase:GetCoordinate())>100 then
|
||||||
self:Route( Airplane, Airbase, Speed )
|
|
||||||
|
|
||||||
-- Set airbase as starting point in the next Route() call.
|
|
||||||
self.Airbase = Airbase
|
|
||||||
|
|
||||||
-- Aircraft is on a pickup mission.
|
-- Route aircraft to pickup airbase.
|
||||||
self.RoutePickup = true
|
self:Route( Airplane, Airbase, Speed )
|
||||||
|
|
||||||
|
-- Set airbase as starting point in the next Route() call.
|
||||||
|
self.Airbase = Airbase
|
||||||
|
|
||||||
|
-- Aircraft is on a pickup mission.
|
||||||
|
self.RoutePickup = true
|
||||||
|
|
||||||
|
-- Unclear!?
|
||||||
|
self.Transporting = true
|
||||||
|
self.Relocating = false
|
||||||
|
else
|
||||||
|
|
||||||
-- Unclear!?
|
-- We are already at the right airbase ==> Landed ==> triggers loading of troops. Is usually called at engine shutdown event.
|
||||||
self.Transporting = true
|
self:Landed()
|
||||||
self.Relocating = false
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -809,6 +809,16 @@ function SET_GROUP:GetAliveSet()
|
|||||||
return AliveSet.Set or {}
|
return AliveSet.Set or {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Add a GROUP to SET_GROUP.
|
||||||
|
-- @param Core.Set#SET_GROUP self
|
||||||
|
-- @param Wrapper.Group#GROUP group The group which should be added to the set.
|
||||||
|
-- @return self
|
||||||
|
function SET_GROUP:AddGroup( group )
|
||||||
|
|
||||||
|
self:Add( group:GetName(), group )
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Add GROUP(s) to SET_GROUP.
|
--- Add GROUP(s) to SET_GROUP.
|
||||||
-- @param Core.Set#SET_GROUP self
|
-- @param Core.Set#SET_GROUP self
|
||||||
@ -3968,6 +3978,17 @@ function SET_AIRBASE:New()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Add an AIRBASE object to SET_AIRBASE.
|
||||||
|
-- @param Core.Set#SET_AIRBASE self
|
||||||
|
-- @param Wrapper.Airbase#AIRBASE airbase Airbase that should be added to the set.
|
||||||
|
-- @return self
|
||||||
|
function SET_AIRBASE:AddAirbase( airbase )
|
||||||
|
|
||||||
|
self:Add( airbase:GetName(), airbase )
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Add AIRBASEs to SET_AIRBASE.
|
--- Add AIRBASEs to SET_AIRBASE.
|
||||||
-- @param Core.Set#SET_AIRBASE self
|
-- @param Core.Set#SET_AIRBASE self
|
||||||
-- @param #string AddAirbaseNames A single name or an array of AIRBASE names.
|
-- @param #string AddAirbaseNames A single name or an array of AIRBASE names.
|
||||||
|
|||||||
@ -3,7 +3,10 @@
|
|||||||
--
|
--
|
||||||
-- Features:
|
-- Features:
|
||||||
--
|
--
|
||||||
-- * Some nice stuff.
|
-- * Holds (virtual) assests such as intrantry groups in stock.
|
||||||
|
-- * Manages requests of assets from other airbases or warehouses.
|
||||||
|
-- * Take care of transportation to other airbases.
|
||||||
|
-- * Different means of automatic transportation (planes, helicopters, selfpropelled).
|
||||||
--
|
--
|
||||||
-- # QUICK START GUIDE
|
-- # QUICK START GUIDE
|
||||||
--
|
--
|
||||||
@ -23,6 +26,7 @@
|
|||||||
-- @field Wrapper.Airbase#AIRBASE homebase Airbase the warehouse belongs to.
|
-- @field Wrapper.Airbase#AIRBASE homebase Airbase the warehouse belongs to.
|
||||||
-- @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 #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}.
|
||||||
@ -47,7 +51,15 @@
|
|||||||
--
|
--
|
||||||
-- 
|
-- 
|
||||||
--
|
--
|
||||||
-- Warehouse
|
-- # What is a warehouse?
|
||||||
|
-- A warehouse is an abstract object that can hold virtual assets in stock. It is usually associated with a particular airbase.
|
||||||
|
-- If another airbase or warehouse requests assets, the corresponding troops are spawned at the warehouse and being transported to the requestor.
|
||||||
|
--
|
||||||
|
-- ## What assets can be stored?
|
||||||
|
-- Any kind of ground or airborn asset can be stored. Ships not supported at the moment due to the fact that airbases are bound to airbases which are
|
||||||
|
-- normally not located near the sea.
|
||||||
|
--
|
||||||
|
--
|
||||||
--
|
--
|
||||||
-- ===
|
-- ===
|
||||||
--
|
--
|
||||||
@ -64,6 +76,7 @@ WAREHOUSE = {
|
|||||||
homebase = nil,
|
homebase = nil,
|
||||||
coordinate = nil,
|
coordinate = nil,
|
||||||
spawnzone = nil,
|
spawnzone = nil,
|
||||||
|
wid = nil,
|
||||||
markerid = nil,
|
markerid = nil,
|
||||||
assetid = 0,
|
assetid = 0,
|
||||||
queueid = 0,
|
queueid = 0,
|
||||||
@ -148,14 +161,15 @@ WAREHOUSE.version="0.1.0"
|
|||||||
-- TODO: Handle cases with immobile units.
|
-- TODO: Handle cases with immobile units.
|
||||||
-- TODO: Add queue.
|
-- TODO: Add queue.
|
||||||
-- TODO: How to handle multiple units in a transport group?
|
-- TODO: How to handle multiple units in a transport group?
|
||||||
|
-- TODO: Switch to AI_XXX_DISPATCHER
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Constructor(s)
|
-- Constructor(s)
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- WAREHOUSE constructor. Creates a new WAREHOUSE object.
|
--- WAREHOUSE constructor. Creates a new WAREHOUSE object accociated with an airbase.
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param Wrapper.Airbase#AIRBASE airbase Airbase.
|
-- @param Wrapper.Airbase#AIRBASE airbase The airbase at which the warehouse is constructed.
|
||||||
-- @return #WAREHOUSE self
|
-- @return #WAREHOUSE self
|
||||||
function WAREHOUSE:NewAirbase(airbase)
|
function WAREHOUSE:NewAirbase(airbase)
|
||||||
BASE:E({airbase=airbase})
|
BASE:E({airbase=airbase})
|
||||||
@ -188,27 +202,27 @@ function WAREHOUSE:NewAirbase(airbase)
|
|||||||
self:AddTransition("*", "Request", "*")
|
self:AddTransition("*", "Request", "*")
|
||||||
self:AddTransition("*", "Delivered", "*")
|
self:AddTransition("*", "Delivered", "*")
|
||||||
|
|
||||||
--- Triggers the FSM event "Start".
|
--- Triggers the FSM event "Start". Starts the warehouse.
|
||||||
-- @function [parent=#WAREHOUSE] Start
|
-- @function [parent=#WAREHOUSE] Start
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
|
|
||||||
--- Triggers the FSM event "Start" after a delay.
|
--- Triggers the FSM event "Start" after a delay. Starts the warehouse.
|
||||||
-- @function [parent=#WAREHOUSE] __Start
|
-- @function [parent=#WAREHOUSE] __Start
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Status".
|
--- Triggers the FSM event "Status". Queue is updated and requests are executed.
|
||||||
-- @function [parent=#WAREHOUSE] Status
|
-- @function [parent=#WAREHOUSE] Status
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
|
|
||||||
--- Triggers the FSM event "Status" after a delay.
|
--- Triggers the FSM event "Status" after a delay. Queue is updated and requests are executed.
|
||||||
-- @function [parent=#WAREHOUSE] __Status
|
-- @function [parent=#WAREHOUSE] __Status
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Request".
|
--- Triggers the FSM event "Request". Executes a request if possible.
|
||||||
-- @function [parent=#WAREHOUSE] Request
|
-- @function [parent=#WAREHOUSE] Request
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
|
-- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
|
||||||
@ -216,10 +230,8 @@ function WAREHOUSE:NewAirbase(airbase)
|
|||||||
-- @param AssetDescriptorValue Value of the asset descriptor. Type depends on descriptor, i.e. could be a string, etc.
|
-- @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 #number nAsset Number of groups requested that match the asset specification.
|
||||||
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
||||||
--
|
|
||||||
-- @usage mywarehouse:Request(AIRBASE:)...
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Request" after a delay.
|
--- Triggers the FSM event "Request" after a delay. Executes a request if possible.
|
||||||
-- @function [parent=#WAREHOUSE] __Request
|
-- @function [parent=#WAREHOUSE] __Request
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #number Delay Delay in seconds.
|
-- @param #number Delay Delay in seconds.
|
||||||
@ -229,12 +241,13 @@ function WAREHOUSE:NewAirbase(airbase)
|
|||||||
-- @param #number nAsset Number of groups requested that match the asset specification.
|
-- @param #number nAsset Number of groups requested that match the asset specification.
|
||||||
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
||||||
|
|
||||||
--- Triggers the FSM event "Delivered".
|
|
||||||
|
--- Triggers the FSM event "Delivered". A group has been delivered from the warehouse to another airbase or warehouse.
|
||||||
-- @function [parent=#WAREHOUSE] Delivered
|
-- @function [parent=#WAREHOUSE] Delivered
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param Wrapper.Group#GROUP group Group that was delivered.
|
-- @param Wrapper.Group#GROUP group Group that was delivered.
|
||||||
|
|
||||||
--- Triggers the FSM event "Delivered" after a delay.
|
--- Triggers the FSM event "Delivered" after a delay. A group has been delivered from the warehouse to another airbase or warehouse.
|
||||||
-- @function [parent=#WAREHOUSE] __Delivered
|
-- @function [parent=#WAREHOUSE] __Delivered
|
||||||
-- @param #WAREHOUSE self
|
-- @param #WAREHOUSE self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
@ -337,14 +350,14 @@ function WAREHOUSE:AddRequest(Airbase, AssetDescriptor, AssetDescriptorValue, nA
|
|||||||
|
|
||||||
-- Add request to queue.
|
-- Add request to queue.
|
||||||
table.insert(self.queue, request)
|
table.insert(self.queue, request)
|
||||||
|
|
||||||
end
|
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
|
||||||
function WAREHOUSE:_WorkQueue()
|
function WAREHOUSE:_WorkQueue()
|
||||||
|
|
||||||
-- sort queue by prio and uid
|
-- Sort queue wrt to first prio and then qid.
|
||||||
|
self:_SortQueue()
|
||||||
|
|
||||||
---@param #WAREHOUSE.Queueitem qitem
|
---@param #WAREHOUSE.Queueitem qitem
|
||||||
--@return #boolean True if request is okay.
|
--@return #boolean True if request is okay.
|
||||||
@ -376,7 +389,7 @@ function WAREHOUSE:_WorkQueue()
|
|||||||
|
|
||||||
-- Execute request.
|
-- Execute request.
|
||||||
if request then
|
if request then
|
||||||
self:Request(request.airbase, request.assetdesc, request.assetdescval, request.nasset, request.transporttype)
|
self:Request(request.airbase, request.assetdesc, request.assetdescval, request.nasset, request.transporttype, request.ntransport)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -443,14 +456,13 @@ end
|
|||||||
-- @param AssetDescriptorValue Value of the asset descriptor. Type depends on descriptor, i.e. could be a string, etc.
|
-- @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 #number nAsset Number of groups requested that match the asset specification.
|
||||||
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
|
||||||
function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType)
|
function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType, nTransport)
|
||||||
env.info(self.wid..string.format("Airbase %s requesting asset %s = %s.", Airbase:GetName(), tostring(AssetDescriptor), tostring(AssetDescriptorValue)))
|
env.info(self.wid..string.format("Airbase %s requesting asset %s = %s.", Airbase:GetName(), tostring(AssetDescriptor), tostring(AssetDescriptorValue)))
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
-- Filter the requested assets.
|
-- Filter the requested assets.
|
||||||
local _assetstock=self:_FilterStock(self.stock, AssetDescriptor, AssetDescriptorValue)
|
local _assetstock=self:_FilterStock(self.stock, AssetDescriptor, AssetDescriptorValue)
|
||||||
|
|
||||||
-- New empty cargo set.
|
|
||||||
local CargoGroups = SET_CARGO:New()
|
|
||||||
|
|
||||||
-- Spawn the assets.
|
-- Spawn the assets.
|
||||||
local _delid={}
|
local _delid={}
|
||||||
@ -475,6 +487,8 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
self:_DeleteStockItem(_id)
|
self:_DeleteStockItem(_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
-- No transport unit requested. Assets go by themselfes.
|
-- No transport unit requested. Assets go by themselfes.
|
||||||
if TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
if TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
||||||
for _i,_spawngroup in pairs(_spawngroups) do
|
for _i,_spawngroup in pairs(_spawngroups) do
|
||||||
@ -484,6 +498,9 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
-- New empty cargo set.
|
||||||
|
local CargoGroups = SET_CARGO:New()
|
||||||
|
|
||||||
--TODO: make nearradius depended on transport type and asset type.
|
--TODO: make nearradius depended on transport type and asset type.
|
||||||
local _loadradius=5000
|
local _loadradius=5000
|
||||||
@ -497,7 +514,9 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
CargoGroups:AddCargo(cargogroup)
|
CargoGroups:AddCargo(cargogroup)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
--[[
|
||||||
-- Filter the requested assets.
|
-- Filter the requested assets.
|
||||||
local _transportitem --#WAREHOUSE.Stockitem
|
local _transportitem --#WAREHOUSE.Stockitem
|
||||||
if TransportType ~= WAREHOUSE.TransportType.SELFPROPELLED then
|
if TransportType ~= WAREHOUSE.TransportType.SELFPROPELLED then
|
||||||
@ -506,10 +525,55 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
-- Select asset template group name.
|
-- Select asset template group name.
|
||||||
_transportitem=_transportstock[_chosenone]
|
_transportitem=_transportstock[_chosenone]
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
|
local TransportSet = SET_GROUP:New() --:AddGroupsByName(Plane:GetName())
|
||||||
|
|
||||||
|
-- Pickup and depoly locations.
|
||||||
|
local PickupAirbaseSet = SET_AIRBASE:New():AddAirbase(self.homebase)
|
||||||
|
local DeployAirbaseSet = SET_AIRBASE:New():AddAirbase(Airbase)
|
||||||
|
local DeployZoneSet = SET_ZONE:New():AddZonesByName(Airbase:GetZone():GetName())
|
||||||
|
|
||||||
|
local CargoTransport --AI.AI_Cargo_Dispatcher#AI_CARGO_DISPATCHER
|
||||||
|
|
||||||
-- Dependent on transport type, spawn the transports and set up the dispatchers.
|
-- Dependent on transport type, spawn the transports and set up the dispatchers.
|
||||||
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
|
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
|
||||||
|
|
||||||
|
-- Spawn the transport groups.
|
||||||
|
local _delid={}
|
||||||
|
for i=1,nTransport do
|
||||||
|
|
||||||
|
-- Get stock item.
|
||||||
|
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
|
||||||
|
|
||||||
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
|
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
|
||||||
|
-- Spawn plane at airport in uncontrolled state.
|
||||||
|
-- TODO: check terminal type.
|
||||||
|
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):InitUnControlled(true):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.OpenBig, false)
|
||||||
|
|
||||||
|
if spawngroup then
|
||||||
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
|
spawngroup:SetState(spawngroup, "WAREHOUSE", self)
|
||||||
|
|
||||||
|
-- Add group to transportset.
|
||||||
|
TransportSet:AddGroup(spawngroup)
|
||||||
|
|
||||||
|
table.insert(_delid,_assetitem.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Delete spawned items from warehouse stock.
|
||||||
|
for _,_id in pairs(_delid) do
|
||||||
|
self:_DeleteStockItem(_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Define dispatcher for this task.
|
||||||
|
CargoTransport = AI_CARGO_DISPATCHER_AIRPLANE:New(TransportSet, CargoGroups, PickupAirbaseSet, DeployAirbaseSet)
|
||||||
|
|
||||||
|
|
||||||
|
--[[
|
||||||
-- Spawn plane at warehouse homebase.
|
-- Spawn plane at warehouse homebase.
|
||||||
--TODO: Check available parking spots in onbefore!
|
--TODO: Check available parking spots in onbefore!
|
||||||
local Plane=SPAWN:New(_transportitem.templatename):InitUnControlled(true):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.OpenBig, false)
|
local Plane=SPAWN:New(_transportitem.templatename):InitUnControlled(true):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.OpenBig, false)
|
||||||
@ -524,8 +588,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
-- Remove chosen transport asset from list.
|
-- Remove chosen transport asset from list.
|
||||||
self:_DeleteStockItem(_transportitem.id)
|
self:_DeleteStockItem(_transportitem.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[
|
|
||||||
-- Define cargo airplane object.
|
-- Define cargo airplane object.
|
||||||
local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups)
|
local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups)
|
||||||
|
|
||||||
@ -541,19 +604,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
function CargoPlane:OnAfterLoaded(Airplane, From, Event, To)
|
function CargoPlane:OnAfterLoaded(Airplane, From, Event, To)
|
||||||
CargoPlane:__Deploy(10, Airbase)
|
CargoPlane:__Deploy(10, Airbase)
|
||||||
end
|
end
|
||||||
]]
|
|
||||||
|
|
||||||
local TransportSet = SET_GROUP:New():AddGroupsByName(Plane:GetName())
|
|
||||||
local PickupAirbasesSet = SET_AIRBASE:New():AddAirbasesByName(self.homebase:GetName())
|
|
||||||
local DeployAirbasesSet = SET_AIRBASE:New():AddAirbasesByName(Airbase:GetName())
|
|
||||||
|
|
||||||
-- Define dispatcher for this task.
|
|
||||||
local CargoPlane = AI_CARGO_DISPATCHER_AIRPLANE:New(TransportSet, CargoGroups, PickupAirbasesSet, DeployAirbasesSet)
|
|
||||||
|
|
||||||
-- Cargo set.
|
|
||||||
CargoPlane:Start()
|
|
||||||
|
|
||||||
--[[
|
|
||||||
--- Function called when cargo has arrived and was unloaded.
|
--- Function called when cargo has arrived and was unloaded.
|
||||||
function CargoPlane:OnAfterUnloaded(Airplane, From, Event, To)
|
function CargoPlane:OnAfterUnloaded(Airplane, From, Event, To)
|
||||||
|
|
||||||
@ -564,20 +615,49 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
-- Trigger Delivered event.
|
-- Trigger Delivered event.
|
||||||
warehouse:__Delivered(1, group)
|
warehouse:__Delivered(1, group)
|
||||||
end
|
end
|
||||||
]]
|
]]
|
||||||
--- Function called when cargo has arrived and was unloaded.
|
|
||||||
function CargoPlane:OnAfterUnloaded(From, Event, To, Carrier, Cargo)
|
|
||||||
|
|
||||||
local group=Cargo:GetObject() --Wrapper.Group#GROUP
|
|
||||||
local warehouse=Carrier:GetState(Carrier, "WAREHOUSE") --#WAREHOUSE
|
|
||||||
|
|
||||||
-- Trigger Delivered event.
|
|
||||||
warehouse:__Delivered(1, group)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
elseif TransportType==WAREHOUSE.TransportType.HELICOPTER then
|
elseif TransportType==WAREHOUSE.TransportType.HELICOPTER then
|
||||||
|
|
||||||
|
-- Spawn the transport groups.
|
||||||
|
local _delid={}
|
||||||
|
for i=1,nTransport do
|
||||||
|
|
||||||
|
-- Get stock item.
|
||||||
|
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
|
||||||
|
|
||||||
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
|
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
|
||||||
|
-- Spawn plane at airport in uncontrolled state.
|
||||||
|
-- TODO: check terminal type.
|
||||||
|
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):InitUnControlled(false):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.HelicopterUsable, false)
|
||||||
|
|
||||||
|
if spawngroup then
|
||||||
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
|
spawngroup:SetState(spawngroup, "WAREHOUSE", self)
|
||||||
|
|
||||||
|
-- Add group to transportset.
|
||||||
|
TransportSet:AddGroup(spawngroup)
|
||||||
|
|
||||||
|
table.insert(_delid,_assetitem.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Delete spawned items from warehouse stock.
|
||||||
|
for _,_id in pairs(_delid) do
|
||||||
|
self:_DeleteStockItem(_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Define dispatcher for this task.
|
||||||
|
CargoTransport = AI_CARGO_DISPATCHER_HELICOPTER:New(TransportSet, CargoGroups, DeployZoneSet)
|
||||||
|
|
||||||
|
-- Home zone.
|
||||||
|
CargoTransport:SetHomeZone(self.spawnzone)
|
||||||
|
|
||||||
|
--CargoTransport = AI_CARGO_DISPATCHER_AIRPLANE:New(TransportSet, CargoGroups, PickupAirbasesSet, DeployAirbasesSet)
|
||||||
|
|
||||||
|
--[[
|
||||||
local Helo=SPAWN:New(_transportitem.templatename):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.HelicopterUsable, false)
|
local Helo=SPAWN:New(_transportitem.templatename):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.HelicopterUsable, false)
|
||||||
|
|
||||||
if Helo==nil then
|
if Helo==nil then
|
||||||
@ -611,9 +691,43 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
-- Trigger Delivered event.
|
-- Trigger Delivered event.
|
||||||
warehouse:__Delivered(1, group)
|
warehouse:__Delivered(1, group)
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
elseif TransportType==WAREHOUSE.TransportType.APC then
|
elseif TransportType==WAREHOUSE.TransportType.APC then
|
||||||
|
|
||||||
|
-- Spawn the transport groups.
|
||||||
|
local _delid={}
|
||||||
|
for i=1,nTransport do
|
||||||
|
|
||||||
|
-- Get stock item.
|
||||||
|
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
|
||||||
|
|
||||||
|
-- Spawn with ALIAS here or DCS crashes!
|
||||||
|
local _alias=string.format("%s_%d", _assetitem.templatename,_assetitem.id)
|
||||||
|
|
||||||
|
-- Spawn plane at airport in uncontrolled state.
|
||||||
|
local spawngroup=SPAWN:NewWithAlias(_assetitem.templatename,_alias):SpawnFromCoordinate(self.spawnzone:GetRandomCoordinate())
|
||||||
|
|
||||||
|
if spawngroup then
|
||||||
|
-- Set state of warehouse so we can retrieve it later.
|
||||||
|
spawngroup:SetState(spawngroup, "WAREHOUSE", self)
|
||||||
|
|
||||||
|
-- Add group to transportset.
|
||||||
|
TransportSet:AddGroup(spawngroup)
|
||||||
|
|
||||||
|
table.insert(_delid,_assetitem.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Delete spawned items from warehouse stock.
|
||||||
|
for _,_id in pairs(_delid) do
|
||||||
|
self:_DeleteStockItem(_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Define dispatcher for this task.
|
||||||
|
CargoTransport = AI_CARGO_DISPATCHER_APC:NewWithZones(TransportSet, CargoGroups, DeployZoneSet, 0)
|
||||||
|
|
||||||
|
--[[
|
||||||
-- Spawn APC in spawn zone.
|
-- Spawn APC in spawn zone.
|
||||||
local APC=SPAWN:New(_transportitem.templatename):SpawnFromCoordinate(self.spawnzone:GetCoordinate())
|
local APC=SPAWN:New(_transportitem.templatename):SpawnFromCoordinate(self.spawnzone:GetCoordinate())
|
||||||
|
|
||||||
@ -638,22 +752,44 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
|
|||||||
-- Trigger Delivered event.
|
-- Trigger Delivered event.
|
||||||
warehouse:__Delivered(1, group)
|
warehouse:__Delivered(1, group)
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
elseif TransportType==WAREHOUSE.TransportType.TRAIN then
|
elseif TransportType==WAREHOUSE.TransportType.TRAIN then
|
||||||
|
|
||||||
self:E(self.wid.."ERROR: transport by train not supported yet!")
|
self:E(self.wid.."ERROR: transport by train not supported yet!")
|
||||||
|
return
|
||||||
|
|
||||||
elseif TransportType==WAREHOUSE.TransportType.SHIP then
|
elseif TransportType==WAREHOUSE.TransportType.SHIP then
|
||||||
|
|
||||||
self:E(self.wid.."ERROR: transport by ship not supported yet!")
|
self:E(self.wid.."ERROR: transport by ship not supported yet!")
|
||||||
|
return
|
||||||
|
|
||||||
elseif TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
elseif TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
else
|
else
|
||||||
self:E(self.wid.."ERROR: unknown transport type!")
|
self:E(self.wid.."ERROR: unknown transport type!")
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Function called when cargo has arrived and was unloaded.
|
||||||
|
function CargoTransport:OnAfterUnloaded(From, Event, To, Carrier, Cargo)
|
||||||
|
|
||||||
|
-- Get group obejet.
|
||||||
|
local group=Cargo:GetObject() --Wrapper.Group#GROUP
|
||||||
|
|
||||||
|
-- Get warehouse state.
|
||||||
|
local warehouse=Carrier:GetState(Carrier, "WAREHOUSE") --#WAREHOUSE
|
||||||
|
|
||||||
|
-- Trigger Delivered event.
|
||||||
|
warehouse:__Delivered(1, group)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Start dispatcher.
|
||||||
|
CargoTransport:__Start(5)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -904,6 +1040,25 @@ function WAREHOUSE:_DeleteStockItem(_uid)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Sort requests queue wrt prio and request uid.
|
||||||
|
-- @param #WAREHOUSE self
|
||||||
|
function WAREHOUSE:_SortQueue()
|
||||||
|
self:F2()
|
||||||
|
|
||||||
|
-- Sort results table wrt times they have already been engaged.
|
||||||
|
local function _sort(a, b)
|
||||||
|
return (a.prio < b.prio) or (a.prio==b.prio and a.uid < b.uid)
|
||||||
|
end
|
||||||
|
table.sort(self.queue, _sort)
|
||||||
|
|
||||||
|
-- Debug output.
|
||||||
|
self:T3(self.wid.."Sorted queue wrt prio and uid:")
|
||||||
|
for i=1,#self.queue do
|
||||||
|
local _target=self.queue[i] --#WAREHOUSE#Queueitem
|
||||||
|
--self:T3(self.wid)..string.format("Queue %s", self:_TargetInfo(_target)))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user