WAREHOUSE

This commit is contained in:
funkyfranky 2018-08-02 16:35:25 +02:00
parent 52e69cb697
commit f8b1056c98
2 changed files with 283 additions and 134 deletions

View File

@ -17,9 +17,13 @@
--- WAREHOUSE class. --- WAREHOUSE class.
-- @type WAREHOUSE -- @type WAREHOUSE
-- @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 Report If true, send status messages to coalition.
-- @field DCS#Coalition coalition Coalition the warehouse belongs to. -- @field DCS#Coalition coalition Coalition the warehouse belongs to.
-- @field Core.Point#COORDINATE coordinate Coordinate of the warehouse.
-- @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.Zone#ZONE spawnzone Zone in which assets are spawned.
-- @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
@ -52,14 +56,19 @@
-- @field #WAREHOUSE -- @field #WAREHOUSE
WAREHOUSE = { WAREHOUSE = {
ClassName = "WAREHOUSE", ClassName = "WAREHOUSE",
Debug = false,
Report = true,
coalition = nil, coalition = nil,
homebase = nil, homebase = nil,
coordinate = nil, coordinate = nil,
spawnzone = nil,
assetid = 0,
stock = {}, stock = {},
} }
--- Item of the warehouse stock table. --- Item of the warehouse stock table.
-- @type WAREHOUSE.Stockitem -- @type WAREHOUSE.Stockitem
-- @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 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.
@ -68,6 +77,7 @@ WAREHOUSE = {
--- Descriptors enumerator describing the type of the asset in stock. --- Descriptors enumerator describing the type of the asset in stock.
-- @type WAREHOUSE.Descriptor -- @type WAREHOUSE.Descriptor
WAREHOUSE.Descriptor = { WAREHOUSE.Descriptor = {
ID="id",
TEMPLATENAME="templatename", TEMPLATENAME="templatename",
CATEGORY="category", CATEGORY="category",
UNITTYPE="unittype", UNITTYPE="unittype",
@ -77,7 +87,9 @@ WAREHOUSE.Descriptor = {
--- Warehouse unit categories. These are used for --- Warehouse unit categories. These are used for
-- @type WAREHOUSE.Attribute -- @type WAREHOUSE.Attribute
WAREHOUSE.Attribute = { WAREHOUSE.Attribute = {
TRANSPORT="transport", TRANSPORT_PLANE="transportplane",
TRANSPORT_HELO="transporthelo",
TRANSPORT_APC="transportapc",
FIGHTER="fighter", FIGHTER="fighter",
TANKER="tanker", TANKER="tanker",
AWACS="awacs", AWACS="awacs",
@ -86,15 +98,17 @@ WAREHOUSE.Attribute = {
INFANTRY="infantry", INFANTRY="infantry",
BOMBER="bomber", BOMBER="bomber",
TANK="tank", TANK="tank",
TRUCK="truck",
OTHER="other",
} }
--- Cargo transport type. --- Cargo transport type.
-- @type WAREHOUSE.TransportType -- @type WAREHOUSE.TransportType
-- @field #string AIRPLANE plane blabla -- @field #string AIRPLANE plane blabla
WAREHOUSE.TransportType = { WAREHOUSE.TransportType = {
AIRPLANE = "plane", AIRPLANE = "transportplane",
HELICOPTER = "helo", HELICOPTER = "transporthelo",
GROUND = "ground", APC = "transportapc",
SHIP = "ship", SHIP = "ship",
TRAIN = "train", TRAIN = "train",
SELFPROPELLED = "selfporpelled", SELFPROPELLED = "selfporpelled",
@ -135,6 +149,13 @@ function WAREHOUSE:NewAirbase(airbase)
self.coordinate=airbase:GetCoordinate() self.coordinate=airbase:GetCoordinate()
self.coalition=airbase:GetCoalition() self.coalition=airbase:GetCoalition()
-- Get the closest point on road.
local _road=self.coordinate:GetClosestPointToRoad():GetVec2()
-- Define the default spawn zone.
self.spawnzone=ZONE:New("Spawnzone",_road, 200)
-- Add FSM transitions.
self:AddTransition("*", "Start", "Running") self:AddTransition("*", "Start", "Running")
self:AddTransition("*", "Status", "*") self:AddTransition("*", "Status", "*")
self:AddTransition("*", "Request", "*") self:AddTransition("*", "Request", "*")
@ -163,9 +184,12 @@ function WAREHOUSE:NewAirbase(airbase)
--- Triggers the FSM event "Request". --- Triggers the FSM event "Request".
-- @function [parent=#WAREHOUSE] Request -- @function [parent=#WAREHOUSE] Request
-- @param #WAREHOUSE self -- @param #WAREHOUSE self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply. -- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
-- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested. -- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
-- @param #depends 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.
-- @return boolean If true, request is granted. -- @return boolean If true, request is granted.
@ -175,11 +199,14 @@ function WAREHOUSE:NewAirbase(airbase)
--- Triggers the FSM event "Request" after a delay. --- Triggers the FSM event "Request" after a delay.
-- @function [parent=#WAREHOUSE] __Request -- @function [parent=#WAREHOUSE] __Request
-- @param #WAREHOUSE self -- @param #WAREHOUSE self
-- @param #number delay Delay in seconds. -- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply. -- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
-- @param #string Asset Asset that is requested. -- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
-- @param #number nAsset Number of assets requested. Default 1. -- @param AssetDescriptorValue Value of the asset descriptor. Type depends on descriptor, i.e. could be a string, etc.
-- @param #string TransportType Type of transport: "Plane", "Helicopter", "APC" -- @param #number nAsset Number of groups requested that match the asset specification.
-- @param #WAREHOUSE.TransportType TransportType Type of transport.
--- Triggers the FSM event "Delivered". --- Triggers the FSM event "Delivered".
-- @function [parent=#WAREHOUSE] Delivered -- @function [parent=#WAREHOUSE] Delivered
@ -240,14 +267,16 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply. -- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
-- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested. -- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
-- @param depends 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.
-- @return boolean If true, request is granted. -- @return #boolean If true, request is granted.
--
-- @usage mywarehouse:Request(AIRBASE:)...
function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType) function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType)
-- Default.
nAsset=nAsset or 1
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
-- Distance from warehouse to -- Distance from warehouse to
local distance=self.coordinate:Get2DDistance(Airbase:GetCoordinate()) local distance=self.coordinate:Get2DDistance(Airbase:GetCoordinate())
@ -256,90 +285,141 @@ function WAREHOUSE:onbeforeRequest(From, Event, To, Airbase, AssetDescriptor, As
-- Asset is not in stock ==> request denied. -- Asset is not in stock ==> request denied.
if #_stockrequest < nAsset then if #_stockrequest < nAsset then
self:E(self.wid..string.format("Request denied! Not enought assets currently in stock. Requested %d < %d in stock.", nAsset, #_stockrequest)) local text=string.format("Request denied! Not enought assets currently in stock. Requested %d < %d in stock.", nAsset, #_stockrequest)
MESSAGE:New(text, 10):ToCoalitionIf(self.coalition, self.Report or self.Debug)
self:E(self.wid..text)
return false return false
end end
-- Get the attibute of the requested asset.
local _stockitem=_stockrequest[1] --#WAREHOUSE.Stockitem
local _assetattribute=self:_GetAttribute(_stockitem.templatename)
--if _assetattribute==WAREHOUSE.Attribute.
-- Shortcut -- Shortcut
local _TT=TransportType:lower() local _TT=TransportType:lower()
local _instock
-- Check the availability of transport units.
if _TT == WAREHOUSE.TransportType.AIRPLANE then if _TT == WAREHOUSE.TransportType.AIRPLANE then
-- here check the availability of transport units! _instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, WAREHOUSE.Attribute.TRANSPORT_PLANE)
elseif _TT == WAREHOUSE.TransportType.HELICOPTER then elseif _TT == WAREHOUSE.TransportType.HELICOPTER then
_instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, WAREHOUSE.Attribute.TRANSPORT_HELO)
elseif _TT == WAREHOUSE.TransportType.GROUND then elseif _TT == WAREHOUSE.TransportType.GROUND then
_instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, WAREHOUSE.Attribute.TRANSPORT_APC)
elseif _TT == WAREHOUSE.TransportType.SHIP then elseif _TT == WAREHOUSE.TransportType.SHIP then
_instock=0
elseif _TT == WAREHOUSE.TransportType.TRAIN then elseif _TT == WAREHOUSE.TransportType.TRAIN then
_instock=0
elseif _TT == WAREHOUSE.TransportType.SELFPROPELLED then elseif _TT == WAREHOUSE.TransportType.SELFPROPELLED then
_instock=_stockrequest
else else
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
end end
if #_instock==0 then
local text=string.format("Request denied! No transport unit currently available.")
MESSAGE:New(text, 10):ToCoalitionIf(self.coalition, self.Report or self.Debug)
self:E(self.wid..text)
return false
end
return true return true
end end
--- On before "Request" event. Checks if the request can be fullfilled. --- On after "Request" event. Initiates the transport of the assets to the requesting airbase.
-- @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.Airbase#AIRBASE Airbase Airbase requesting supply. -- @param Wrapper.Airbase#AIRBASE Airbase Airbase requesting supply.
-- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested. -- @param #WAREHOUSE.Descriptor AssetDescriptor Descriptor describing the asset that is requested.
-- @param depends 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.
-- @return boolean If true, request is granted.
--
-- @usage mywarehouse:Request(AIRBASE:)...
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)))
local nAsset=nAsset or 1
-- Filter the requested assets. -- Filter the requested assets.
local _stock=self:_FilterStock(self.stock, AssetDescriptor, AssetDescriptorValue) local _assetstock=self:_FilterStock(self.stock, AssetDescriptor, AssetDescriptorValue)
-- Get a random template from the stock list. -- Get a random template from the stock list.
local _chosenone=math.random(#_stock) local _chosenone=math.random(#_assetstock)
-- Select template group name. -- Select asset template group name.
local template=_stock[_chosenone].templatename local assettemplate=_assetstock[_chosenone].templatename
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
if template then
-- Spawn plane at warehouse homebase.
--TODO: this is wrong. we need to filter the transports and get the right template!
local Plane=SPAWN:New(template):SpawnAtAirbase(Airbase, nil, nil, nil, false)
if Plane==nil then
-- Plane was not spawned correctly. Try again in 60 seconds.
self:__Request(60, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType)
return
else
-- Remove chosen asset from list.
table.remove(self.stock,_stock.pos)
end
-- New empty cargo set. -- New empty cargo set.
local CargoGroups = SET_CARGO:New() local CargoGroups = SET_CARGO:New()
-- Spawn the assets.
local _delid={}
for i=1,nAsset do
-- Get stock item.
local _assetitem=_assetstock[i] --#WAREHOUSE.Stockitem
table.insert(_delid,_assetitem.id)
-- Spawn group in spawn zone.
local spawn=SPAWN(_assetitem.templatename)
local spawngroup=spawn:SpawnFromVec3(self.spawnzone:GetRandomPointVec3())
-- Add spawned group to cargo group object.
--TODO: check near and load radius.
local cargogroup = CARGO_GROUP:New(spawngroup, "Infantry", string.format( "Infantry Platoon %d", i), 5000, 35)
CargoGroups:AddCargo(cargogroup)
end
-- Delete spawned items from warehouse stock.
for _,_id in pairs(_delid) do
self:_DeleteStockItem(_id)
end
--[[
-- Spawn requested assets. -- Spawn requested assets.
local spawn=SPAWN:New("Infantry Platoon Alpha") 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 for i=1,nAsset do
local spawngroup=spawn:SpawnFromVec3(self.homebase:GetZone():GetRandomPointVec3(100,500)) 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) local cargogroup = CARGO_GROUP:New(spawngroup, "Infantry", string.format( "Infantry Platoon %d", i), 5000, 35)
CargoGroups:AddCargo(cargogroup) CargoGroups:AddCargo(cargogroup)
end end
]]
-- Filter the requested assets.
local _transportstock
local _transportitem --#WAREHOUSE.Stockitem
if TransportType~=WAREHOUSE.TransportType.SELFPROPELLED then
_transportstock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType)
_chosenone=math.random(#_transportstock)
-- Select asset template group name.
_transportitem=_transportstock[_chosenone]
end
if TransportType==WAREHOUSE.TransportType.AIRPLANE then
-- Spawn plane at warehouse homebase.
--TODO: Check available parking spots in onbefore!
local Plane=SPAWN:New(_transportitem.templatename):SpawnAtAirbase(Airbase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.OpenBig, false)
if Plane==nil then
-- Plane was not spawned correctly. Try again in 60 seconds.
local text="Technical problems with the transport plane occurred. Request was cancelled! Try again later."
--self:__Request(60, Airbase, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType)
--TODO: despawn units and but them back into the warehouse.
return
else
-- Remove chosen transport asset from list.
self:_DeleteStockItem()
end
-- Define cargo airplane. -- Define cargo airplane.
local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups) local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups)
@ -366,9 +446,15 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass
warehouse:__Delivered(1, group) warehouse:__Delivered(1, group)
end end
else elseif TransportType==WAREHOUSE.TransportType.HELICOPTER then
self:E(self.wid.."ERROR: template does not exist!")
end elseif TransportType==WAREHOUSE.TransportType.APC then
elseif TransportType==WAREHOUSE.TransportType.TRAIN then
elseif TransportType==WAREHOUSE.TransportType.SHIP then
elseif TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
else else
self:E(self.wid.."ERROR: unknown transport type!") self:E(self.wid.."ERROR: unknown transport type!")
@ -405,6 +491,7 @@ end
-- @return #WAREHOUSE self -- @return #WAREHOUSE self
function WAREHOUSE:AddAsset(templategroupname, ngroups, istransport) function WAREHOUSE:AddAsset(templategroupname, ngroups, istransport)
-- Set default.
local n=ngroups or 1 local n=ngroups or 1
local group=GROUP:FindByName(templategroupname) local group=GROUP:FindByName(templategroupname)
@ -424,57 +511,17 @@ function WAREHOUSE:AddAsset(templategroupname, ngroups, istransport)
env.info(string.format("type = %s", DCStype)) env.info(string.format("type = %s", DCStype))
self:E({desc=DCSdesc}) self:E({desc=DCSdesc})
-- Get generalized attributes. local attribute=self:_GetAttribute(templategroupname)
local transport=group:HasAttribute("Transport helicopters") or group:HasAttribute("Transports") or group:HasAttribute("Infantry carriers")
local fighter=group:HasAttribute("Fighters") or group:HasAttribute("Interceptors") or group:HasAttribute("Multirole fighters")
local tanker=group:HasAttribute("Tankers")
local awacs=group:HasAttribute("AWACS")
local artillery=group:HasAttribute("Artillery")
local infantry=group:HasAttribute("Infantry")
local attackhelicopter=group:HasAttribute("Attack helicopters")
local bomber=group:HasAttribute("Bombers")
local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks")
-- Debug output.
env.info(string.format("attribute transport = %s", tostring(transport)))
env.info(string.format("attribute figther = %s", tostring(fighter)))
env.info(string.format("attribute tanker = %s", tostring(tanker)))
env.info(string.format("attribute awacs = %s", tostring(awacs)))
env.info(string.format("attribute artillery = %s", tostring(artillery)))
env.info(string.format("attribute infantry = %s", tostring(infantry)))
env.info(string.format("attribute attackhelo = %s", tostring(attackhelicopter)))
env.info(string.format("attribute bomber = %s", tostring(bomber)))
env.info(string.format("attribute tank = %s", tostring(tank)))
local attribute="unknown" --#WAREHOUSE.Attribute
if transport then
attribute=WAREHOUSE.Attribute.TRANSPORT
elseif fighter then
attribute=WAREHOUSE.Attribute.FIGHTER
elseif tanker then
attribute=WAREHOUSE.Attribute.TANKER
elseif awacs then
attribute=WAREHOUSE.Attribute.AWACS
elseif artillery then
attribute=WAREHOUSE.Attribute.ARTILLERY
elseif infantry then
attribute=WAREHOUSE.Attribute.INFANTRY
elseif attackhelicopter then
attribute=WAREHOUSE.Attribute.ATTACKHELICOPTER
elseif bomber then
attribute=WAREHOUSE.Attribute.BOMBER
elseif tank then
attribute=WAREHOUSE.Attribute.TANK
end
-- Add this n times to the table. -- Add this n times to the table.
for i=1,n do for i=1,n do
local stockitem={} --#WAREHOUSE.Stockitem local stockitem={} --#WAREHOUSE.Stockitem
self.assetid=self.assetid+1
stockitem.id=self.assetid
stockitem.templatename=templategroupname stockitem.templatename=templategroupname
stockitem.category=DCScategory stockitem.category=DCScategory
stockitem.attribute=attribute
stockitem.unittype=DCStype stockitem.unittype=DCStype
stockitem.attribute=attribute
table.insert(self.stock, stockitem) table.insert(self.stock, stockitem)
end end
@ -494,7 +541,7 @@ end
-- @param #WAREHOUSE self -- @param #WAREHOUSE self
-- @param #table stock Table holding all assets in stock of the warehouse. Each entry is of type @{#WAREHOUSE.Stockitem}. -- @param #table stock Table holding all assets in stock of the warehouse. Each entry is of type @{#WAREHOUSE.Stockitem}.
-- @param #string item Descriptor -- @param #string item Descriptor
-- @param depends value Value of the descriptor. -- @param value Value of the descriptor.
-- @return #table Filtered stock items table. -- @return #table Filtered stock items table.
function WAREHOUSE:_FilterStock(stock, item, value) function WAREHOUSE:_FilterStock(stock, item, value)
@ -524,7 +571,109 @@ function WAREHOUSE:_DisplayStockItems(stock)
end end
env.info(text) env.info(text)
MESSAGE:New(text,30):ToAll() MESSAGE:New(text, 10):ToAll()
end
--- Check if a group has a generalized attribute.
-- @param #WAREHOUSE self
-- @param #string groupname Name of the group.
-- @param #WAREHOUSE.Attribute attribute Attribute to check.
-- @return #boolean True if group has the specified attribute.
function WAREHOUSE:_HasAttribute(groupname, attribute)
local group=GROUP:FindByName(groupname)
if group then
local groupattribute=self:_HasAttribute(groupname,attribute)
return groupattribute==attribute
end
return false
end
--- Get the generalized attribute of a group.
-- @param #WAREHOUSE self
-- @param #string groupname Name of the group.
-- @return #WAREHOUSE.Attribute Generalized attribute of the group.
function WAREHOUSE:_GetAttribute(groupname)
local group=GROUP:FindByName(groupname)
local attribute=WAREHOUSE.Attribute.OTHER --#WAREHOUSE.Attribute
if group then
-- Get generalized attributes.
-- Transports: Helos, planes and APCs
local transportplane=group:HasAttribute("Transports") and group:HasAttribute("Planes")
local transporthelo=group:HasAttribute("Transport helicopters")
local transportapc=group:HasAttribute("Infantry carriers")
local fighter=group:HasAttribute("Fighters") or group:HasAttribute("Interceptors") or group:HasAttribute("Multirole fighters")
local tanker=group:HasAttribute("Tankers")
local awacs=group:HasAttribute("AWACS")
local artillery=group:HasAttribute("Artillery")
local infantry=group:HasAttribute("Infantry")
local attackhelicopter=group:HasAttribute("Attack helicopters")
local bomber=group:HasAttribute("Bombers")
local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks")
local truck=group:HasAttribute("Trucks")
-- Debug output.
env.info(string.format("transport pane = %s", tostring(transportplane)))
env.info(string.format("transport helo = %s", tostring(transporthelo)))
env.info(string.format("transport apc = %s", tostring(transportapc)))
env.info(string.format("figther = %s", tostring(fighter)))
env.info(string.format("tanker = %s", tostring(tanker)))
env.info(string.format("awacs = %s", tostring(awacs)))
env.info(string.format("artillery = %s", tostring(artillery)))
env.info(string.format("infantry = %s", tostring(infantry)))
env.info(string.format("attack helo = %s", tostring(attackhelicopter)))
env.info(string.format("bomber = %s", tostring(bomber)))
env.info(string.format("tank = %s", tostring(tank)))
env.info(string.format("truck = %s", tostring(truck)))
if transportplane then
attribute=WAREHOUSE.Attribute.TRANSPORT_PLANE
elseif transporthelo then
attribute=WAREHOUSE.Attribute.TRANSPORT_HELO
elseif transportapc then
attribute=WAREHOUSE.Attribute.TRANSPORT_APC
elseif fighter then
attribute=WAREHOUSE.Attribute.FIGHTER
elseif tanker then
attribute=WAREHOUSE.Attribute.TANKER
elseif awacs then
attribute=WAREHOUSE.Attribute.AWACS
elseif artillery then
attribute=WAREHOUSE.Attribute.ARTILLERY
elseif infantry then
attribute=WAREHOUSE.Attribute.INFANTRY
elseif attackhelicopter then
attribute=WAREHOUSE.Attribute.ATTACKHELICOPTER
elseif bomber then
attribute=WAREHOUSE.Attribute.BOMBER
elseif tank then
attribute=WAREHOUSE.Attribute.TANK
elseif truck then
attribute=WAREHOUSE.Attribute.TRUCK
else
attribute=WAREHOUSE.Attribute.OTHER
end
end
return attribute
end
--- Delete item from stock.
-- @param #WAREHOUSE self
-- @param #number uid The id of the item to be deleted.
function WAREHOUSE:_DeleteStockItem(uid)
for _i,_item in pairs(self.stock) do
if _item.id==uid then
self.stock[_i]=nil
end
end
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -349,7 +349,7 @@ function AIRBASE.GetAllAirbases(coalition)
local airbases={} local airbases={}
for _,airbase in pairs(_DATABASE.AIRBASES) do for _,airbase in pairs(_DATABASE.AIRBASES) do
if (coalition~=nil and self:GetCoalition()==coalition) or coalition==nil then if (coalition~=nil and airbase:GetCoalition()==coalition) or coalition==nil then
table.insert(airbases, airbase) table.insert(airbases, airbase)
end end
end end