WAREHOUSE

This commit is contained in:
funkyfranky 2018-08-03 00:01:41 +02:00
parent f8b1056c98
commit 4a424dd3d8
2 changed files with 99 additions and 52 deletions

View File

@ -274,7 +274,8 @@ end
-- @param Wrapper.Point#COORDINATE Coordinate -- @param Wrapper.Point#COORDINATE Coordinate
function AI_CARGO_AIRPLANE:onafterLoad( Airplane, From, Event, To, Coordinate ) function AI_CARGO_AIRPLANE:onafterLoad( Airplane, From, Event, To, Coordinate )
if Airplane and Airplane:IsAlive() then if Airplane and Airplane:IsAlive()==true or Airplane:IsAlive()==false then
--if Airplane then
for _, Cargo in pairs( self.CargoSet:GetSet() ) do for _, Cargo in pairs( self.CargoSet:GetSet() ) do
local Cargo=Cargo --Cargo.Cargo#CARGO local Cargo=Cargo --Cargo.Cargo#CARGO
@ -472,6 +473,8 @@ function AI_CARGO_AIRPLANE:Route( Airplane, Airbase, Speed )
self:T3( Points ) self:T3( Points )
Template.route.points = Points Template.route.points = Points
Template.uncontrolled=false
--self:Respawn( Template ) --self:Respawn( Template )

View File

@ -22,7 +22,8 @@
-- @field DCS#Coalition coalition Coalition the warehouse belongs to. -- @field DCS#Coalition coalition Coalition 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 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 #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.Stock}. -- @field #table stock Table holding all assets in stock. Table entries are of type @{#WAREHOUSE.Stock}.
-- @extends Core.Fsm#FSM -- @extends Core.Fsm#FSM
@ -62,6 +63,7 @@ WAREHOUSE = {
homebase = nil, homebase = nil,
coordinate = nil, coordinate = nil,
spawnzone = nil, spawnzone = nil,
markerid = nil,
assetid = 0, assetid = 0,
stock = {}, stock = {},
} }
@ -153,7 +155,9 @@ function WAREHOUSE:NewAirbase(airbase)
local _road=self.coordinate:GetClosestPointToRoad():GetVec2() local _road=self.coordinate:GetClosestPointToRoad():GetVec2()
-- Define the default spawn zone. -- Define the default spawn zone.
self.spawnzone=ZONE:New("Spawnzone",_road, 200) self.spawnzone=ZONE_RADIUS:New("Spawnzone",_road, 200)
self.spawnzone:BoundZone(60,country.id.GERMANY)
self.spawnzone:GetCoordinate():MarkToAll("Spawnzone")
-- Add FSM transitions. -- Add FSM transitions.
self:AddTransition("*", "Start", "Running") self:AddTransition("*", "Start", "Running")
@ -232,14 +236,15 @@ end
-- @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)
env.info("FF starting warehouse at airbase "..self.homebase:GetName()) self:E(self.wid..string.format("Starting warehouse at airbase %s.", self.homebase:GetName()))
-- handle events -- handle events
-- event takeoff -- event takeoff
-- event landing -- event landing
-- event crash/dead -- event crash/dead
-- event base captured -- event base captured
self:__Status(-5)
self:__Status(5)
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -250,10 +255,32 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function WAREHOUSE:onafterStatus(From, Event, To) function WAREHOUSE:onafterStatus(From, Event, To)
env.info("FF checking warehouse status of airbase "..self.homebase:GetName()) self:E(self.wid..string.format("Checking warehouse status of airbase %s", self.homebase:GetName()))
--env.info(string.format("FF warehouse at %s: number of stock = %d", self.homebase:GetName(), #self.stock)) -- Create a mark with the current assets in stock.
self:_DisplayStockItems(self.stock) if self.markerid~=nil then
trigger.action.removeMark(self.markerid)
end
local marktext="Warehouse stock:\n"
local text="Warehouse stock:\n"
local _data=self:GetStockInfo(self.stock)
for _attribute,_count in pairs(_data) do
marktext=marktext..string.format("%s=%d, ", _attribute,_count) -- Dont use \n because too many make DCS crash!
text=text..string.format("%s = %d\n", _attribute,_count)
end
self.markerid=self.coordinate:MarkToCoalition(marktext, self.coalition, true)
-- Debug output.
self:E(self.wid..text)
MESSAGE:New(text, 10):ToAllIf(self.Debug)
-- Display complete list of stock itmes.
if self.Debug then
--self:_DisplayStockItems(self.stock)
end
-- Call status again in 30 sec.
self:__Status(30) self:__Status(30)
end end
@ -272,7 +299,8 @@ end
-- @param #WAREHOUSE.TransportType TransportType Type of transport. -- @param #WAREHOUSE.TransportType TransportType Type of transport.
-- @return #boolean If true, request is granted. -- @return #boolean If true, request is granted.
function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType) function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType)
env.info(self.wid..string.format("Airbase %s requesting asset %s = %s.", Airbase:GetName(), tostring(AssetDescriptor), tostring(AssetDescriptorValue)))
-- Default. -- Default.
nAsset=nAsset or 1 nAsset=nAsset or 1
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
@ -294,13 +322,11 @@ function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, As
-- Get the attibute of the requested asset. -- Get the attibute of the requested asset.
local _stockitem=_stockrequest[1] --#WAREHOUSE.Stockitem local _stockitem=_stockrequest[1] --#WAREHOUSE.Stockitem
local _assetattribute=self:_GetAttribute(_stockitem.templatename) local _assetattribute=self:_GetAttribute(_stockitem.templatename)
--if _assetattribute==WAREHOUSE.Attribute.
-- Shortcut -- Shortcut
local _TT=TransportType:lower() local _instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType)
local _instock
--[[
-- Check the availability of transport units. -- Check the availability of transport units.
if _TT == WAREHOUSE.TransportType.AIRPLANE then if _TT == WAREHOUSE.TransportType.AIRPLANE then
_instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, WAREHOUSE.Attribute.TRANSPORT_PLANE) _instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, WAREHOUSE.Attribute.TRANSPORT_PLANE)
@ -318,15 +344,16 @@ function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, As
self:E(self.wid..string.format("ERROR: unknown transport type requested! type = %s", tostring(TransportType))) self:E(self.wid..string.format("ERROR: unknown transport type requested! type = %s", tostring(TransportType)))
return false return false
end end
]]
if #_instock==0 then -- Check that a transport unit is available.
if #_instock==0 and TransportType~=WAREHOUSE.TransportType.SELFPROPELLED then
local text=string.format("Request denied! No transport unit currently available.") local text=string.format("Request denied! No transport unit currently available.")
MESSAGE:New(text, 10):ToCoalitionIf(self.coalition, self.Report or self.Debug) MESSAGE:New(text, 10):ToCoalitionIf(self.coalition, self.Report or self.Debug)
self:E(self.wid..text) self:E(self.wid..text)
return false return false
end end
return true return true
end end
@ -343,54 +370,43 @@ end
-- @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)
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)
-- Get a random template from the stock list.
local _chosenone=math.random(#_assetstock)
-- Select asset template group name.
local assettemplate=_assetstock[_chosenone].templatename
-- New empty cargo set. -- New empty cargo set.
local CargoGroups = SET_CARGO:New() local CargoGroups = SET_CARGO:New()
-- Spawn the assets. -- Spawn the assets.
local _delid={} local _delid={}
local _spawngroups={}
for i=1,nAsset do for i=1,nAsset do
-- Get stock item. -- Get stock item.
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
table.insert(_delid,_assetitem.id) table.insert(_delid,_assetitem.id)
-- Spawn group in spawn zone. -- Find a random point within the spawn zone.
local spawn=SPAWN(_assetitem.templatename) local spawnvec3=self.spawnzone:GetRandomVec3()
local spawngroup=spawn:SpawnFromVec3(self.spawnzone:GetRandomPointVec3()) local spawncoord=COORDINATE:NewFromVec3(spawnvec3)
spawncoord:MarkToAll(string.format("spawnpoint %d",i))
-- Add spawned group to cargo group object.
--TODO: check near and load radius. -- Spawn with ALIAS here or DCS crashes!
local cargogroup = CARGO_GROUP:New(spawngroup, "Infantry", string.format( "Infantry Platoon %d", i), 5000, 35) _spawngroups[i]=SPAWN:NewWithAlias(_assetitem.templatename,string.format("%s_%d", _assetitem.templatename,i)):SpawnFromVec3(spawnvec3)
CargoGroups:AddCargo(cargogroup)
end end
-- Add spawned groups to cargo group object.
for _i,_spawngroup in pairs(_spawngroups) do
--TODO: check near and load radius.
local cargogroup = CARGO_GROUP:New(_spawngroup, AssetDescriptorValue, string.format("%s %d",AssetDescriptorValue, _i), 5000, 35)
CargoGroups:AddCargo(cargogroup)
end
-- Delete spawned items from warehouse stock. -- Delete spawned items from warehouse stock.
for _,_id in pairs(_delid) do for _,_id in pairs(_delid) do
self:_DeleteStockItem(_id) self:_DeleteStockItem(_id)
end end
--[[
-- Spawn requested assets.
local spawn=SPAWN:New("Infantry Platoon Alpha")
self.homebase:GetZone():GetRandomCoordinate(inner,outer)
local spawngroup=spawn:SpawnFromVec3(self.homebase:GetZone():GetRandomPointVec3(100,500))
for i=1,nAsset do
local spawngroup=spawn:SpawnFromVec3(self.homebase:GetZone():GetRandomPointVec3(100,500))
local cargogroup = CARGO_GROUP:New(spawngroup, "Infantry", string.format( "Infantry Platoon %d", i), 5000, 35)
CargoGroups:AddCargo(cargogroup)
end
]]
-- Filter the requested assets. -- Filter the requested assets.
@ -398,7 +414,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
local _transportitem --#WAREHOUSE.Stockitem local _transportitem --#WAREHOUSE.Stockitem
if TransportType~=WAREHOUSE.TransportType.SELFPROPELLED then if TransportType~=WAREHOUSE.TransportType.SELFPROPELLED then
_transportstock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType) _transportstock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType)
_chosenone=math.random(#_transportstock) local _chosenone=math.random(#_transportstock)
-- Select asset template group name. -- Select asset template group name.
_transportitem=_transportstock[_chosenone] _transportitem=_transportstock[_chosenone]
end end
@ -408,7 +424,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
-- 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):SpawnAtAirbase(Airbase, 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)
if Plane==nil then if Plane==nil then
-- Plane was not spawned correctly. Try again in 60 seconds. -- Plane was not spawned correctly. Try again in 60 seconds.
@ -421,11 +437,14 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
self:_DeleteStockItem() self:_DeleteStockItem()
end end
-- Define cargo airplane. -- Define cargo airplane object.
local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups) local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups)
CargoPlane.Airbase=self.homebase
-- Pickup cargo at homebase. -- Pickup cargo at homebase.
CargoPlane:__Pickup(5, self.homebase) --CargoPlane:Pickup(self.homebase)
--CargoPlane:__Landed(1)
CargoPlane:__Load(1, Plane:GetCoordinate())
-- Set warehouse state so that we can retreive it later. -- Set warehouse state so that we can retreive it later.
Plane:SetState(Plane, "WAREHOUSE", self) Plane:SetState(Plane, "WAREHOUSE", self)
@ -618,7 +637,8 @@ function WAREHOUSE:_GetAttribute(groupname)
local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks") local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks")
local truck=group:HasAttribute("Trucks") local truck=group:HasAttribute("Trucks")
-- Debug output. -- Debug output.
--[[
env.info(string.format("transport pane = %s", tostring(transportplane))) env.info(string.format("transport pane = %s", tostring(transportplane)))
env.info(string.format("transport helo = %s", tostring(transporthelo))) env.info(string.format("transport helo = %s", tostring(transporthelo)))
env.info(string.format("transport apc = %s", tostring(transportapc))) env.info(string.format("transport apc = %s", tostring(transportapc)))
@ -631,7 +651,8 @@ function WAREHOUSE:_GetAttribute(groupname)
env.info(string.format("bomber = %s", tostring(bomber))) env.info(string.format("bomber = %s", tostring(bomber)))
env.info(string.format("tank = %s", tostring(tank))) env.info(string.format("tank = %s", tostring(tank)))
env.info(string.format("truck = %s", tostring(truck))) env.info(string.format("truck = %s", tostring(truck)))
]]
if transportplane then if transportplane then
attribute=WAREHOUSE.Attribute.TRANSPORT_PLANE attribute=WAREHOUSE.Attribute.TRANSPORT_PLANE
elseif transporthelo then elseif transporthelo then
@ -665,6 +686,29 @@ function WAREHOUSE:_GetAttribute(groupname)
return attribute return attribute
end end
--- Returns the number of assets for each generalized attribute.
-- @param #WAREHOUSE self
-- @param #table stock The stock of the warehouse.
-- @return #table Data table holding the numbers.
function WAREHOUSE:GetStockInfo(stock)
local _data={}
for _j,_attribute in pairs(WAREHOUSE.Attribute) do
local n=0
for _i,_item in pairs(stock) do
local _ite=_item --#WAREHOUSE.Stockitem
if _ite.attribute==_attribute then
n=n+1
end
end
_data[_attribute]=n
end
return _data
end
--- Delete item from stock. --- Delete item from stock.
-- @param #WAREHOUSE self -- @param #WAREHOUSE self
-- @param #number uid The id of the item to be deleted. -- @param #number uid The id of the item to be deleted.