mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Warehouse v0.3.1
Ships back to stock is now working. Fixed some bugs.
This commit is contained in:
parent
0ebbbde6c3
commit
d51690a3cf
@ -48,6 +48,7 @@
|
||||
-- @field #table defending Table holding all defending requests, i.e. self requests that were if the warehouse is under attack. Table elements are of type @{#WAREHOUSE.Pendingitem}.
|
||||
-- @field Core.Zone#ZONE portzone Zone defining the port of a warehouse. This is where naval assets are spawned.
|
||||
-- @field #table shippinglanes Table holding the user defined shipping between warehouses.
|
||||
-- @field #boolean selfdefence When the warehouse is under attack, automatically spawn assets to defend the warehouse.
|
||||
-- @extends Core.Fsm#FSM
|
||||
|
||||
--- Have your assets at the right place at the right time - or not!
|
||||
@ -347,6 +348,7 @@ WAREHOUSE = {
|
||||
defending = {},
|
||||
portzone = nil,
|
||||
shippinglanes = {},
|
||||
selfdefence = false,
|
||||
}
|
||||
|
||||
--- Item of the warehouse stock table.
|
||||
@ -369,15 +371,16 @@ WAREHOUSE = {
|
||||
--- Item of the warehouse queue table.
|
||||
-- @type WAREHOUSE.Queueitem
|
||||
-- @field #number uid Unique id of the queue item.
|
||||
-- @field #number prio Priority of the request.
|
||||
-- @field #WAREHOUSE warehouse Requesting warehouse.
|
||||
-- @field Wrapper.Airbase#AIRBASE airbase Requesting airbase or airbase beloning to requesting warehouse.
|
||||
-- @field DCS#Airbase.Category category Category of the requesting airbase, i.e. airdrome, helipad/farp or ship.
|
||||
-- @field #WAREHOUSE.Descriptor assetdesc Descriptor of the requested asset. Enumerator of type @{#WAREHOUSE.Descriptor}.
|
||||
-- @field assetdescval Value of the asset descriptor. Type depends on "assetdesc" descriptor.
|
||||
-- @field #number nasset Number of asset groups requested.
|
||||
-- @field #WAREHOUSE.TransportType transporttype Transport unit type.
|
||||
-- @field #number ntransport Max. number of transport units requested.
|
||||
-- @field #string assignment A keyword or text that later be used to identify this request and postprocess the assets.
|
||||
-- @field #number prio Priority of the request. Number between 1 (high) and 100 (low).
|
||||
-- @field Wrapper.Airbase#AIRBASE airbase The airbase beloning to requesting warehouse if any.
|
||||
-- @field DCS#Airbase.Category category Category of the requesting airbase, i.e. airdrome, helipad/farp or ship.
|
||||
-- @field #boolean toself Self request, i.e. warehouse requests assets from itself.
|
||||
-- @field #table assets Table of self propelled (or cargo) and transport assets. Each element of the table is a @{#WAREHOUSE.Assetitem} and can be accessed by their asset ID.
|
||||
-- @field #table cargoassets Table of cargo (or self propelled) assets. Each element of the table is a @{#WAREHOUSE.Assetitem}.
|
||||
@ -483,14 +486,16 @@ WAREHOUSE.db = {
|
||||
|
||||
--- Warehouse class version.
|
||||
-- @field #string version
|
||||
WAREHOUSE.version="0.3.0w"
|
||||
WAREHOUSE.version="0.3.1"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- TODO: Warehouse todo list.
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- TODO: Warehouse re-capturing not working?!
|
||||
-- TODO: Naval assets dont go back into stock once arrived.
|
||||
-- TODO: How to get a specific request once the cargo is delivered? Make addrequest addasset non FSM function? Callback for requests like in SPAWN?
|
||||
-- TODO: Add autoselfdefence switch and user function. Default should be off.
|
||||
-- DONE: Warehouse re-capturing not working?!
|
||||
-- DONE: Naval assets dont go back into stock once arrived.
|
||||
-- TODO: Take cargo weight into consideration, when selecting transport assets.
|
||||
-- TODO: Add transport units from dispatchers back to warehouse stock once they completed their mission.
|
||||
-- DONE: Add ports for spawning naval assets.
|
||||
@ -500,14 +505,14 @@ WAREHOUSE.version="0.3.0w"
|
||||
-- TODO: Add possibility to add active groups. Need to create a pseudo template before destroy.
|
||||
-- TODO: Write documentation.
|
||||
-- TODO: Handle the case when units of a group die during the transfer. Adjust template?! See Grouping in SPAWN.
|
||||
-- TODO: Handle cases with immobile units.
|
||||
-- DONE: Handle cases with immobile units <== should be handled by dispatcher classes.
|
||||
-- TODO: Handle cargo crates.
|
||||
-- TODO: Handle cases for aircraft carriers and other ships. Place warehouse on carrier possible? On others probably not - exclude them?
|
||||
-- TODO: Add general message function for sending to coaliton or debug.
|
||||
-- TODO: Fine tune event handlers.
|
||||
-- TODO: Add save/load capability of warehouse <==> percistance after mission restart.
|
||||
-- DONE: Improve generalized attributes.
|
||||
-- TODO: Add a time stamp when an asset is added to the stock and for requests
|
||||
-- TODO: Add a time stamp when an asset is added to the stock and for requests.
|
||||
-- DONE: If warehouse is destoyed, all asssets are gone.
|
||||
-- DONE: Add event handlers.
|
||||
-- DONE: Add AI_CARGO_AIRPLANE
|
||||
@ -676,6 +681,7 @@ function WAREHOUSE:New(warehouse, alias)
|
||||
-- @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 #string Assignment A keyword or text that later be used to identify this request and postprocess the assets.
|
||||
-- @param #number Prio Priority of the request. Number ranging from 1=high to 100=low.
|
||||
|
||||
--- Triggers the FSM event "AddRequest" with a delay. Add a request to the warehouse queue, which is processed when possible.
|
||||
@ -688,6 +694,7 @@ function WAREHOUSE:New(warehouse, alias)
|
||||
-- @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 #string Assignment A keyword or text that later be used to identify this request and postprocess the assets.
|
||||
-- @param #number Prio Priority of the request. Number ranging from 1=high to 100=low.
|
||||
|
||||
|
||||
@ -1708,22 +1715,10 @@ end
|
||||
-- @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.
|
||||
-- @param #string Assignment A keyword or text that
|
||||
-- @param #string Assignment A keyword or text that later be used to identify this request and postprocess the assets.
|
||||
-- @return #boolean If true, request is okay at first glance.
|
||||
function WAREHOUSE:onbeforeAddRequest(From, Event, To, warehouse, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType, nTransport, Assignment, Prio)
|
||||
|
||||
-- Defaults.
|
||||
nAsset=nAsset or 1
|
||||
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
|
||||
Prio=Prio or 50
|
||||
if nTransport==nil then
|
||||
if TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
||||
nTransport=0
|
||||
else
|
||||
nTransport=1
|
||||
end
|
||||
end
|
||||
|
||||
-- Request is okay.
|
||||
local okay=true
|
||||
|
||||
@ -1788,13 +1783,30 @@ end
|
||||
-- @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 #string Assignment A keyword or text that later be used to identify this request and postprocess the assets.
|
||||
-- @param #number Prio Priority of the request. Number ranging from 1=high to 100=low.
|
||||
-- @param #string Assignment A keyword or text that
|
||||
function WAREHOUSE:onafterAddRequest(From, Event, To, warehouse, AssetDescriptor, AssetDescriptorValue, nAsset, TransportType, nTransport, Assignment, Prio)
|
||||
|
||||
-- Defaults.
|
||||
nAsset=nAsset or 1
|
||||
TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED
|
||||
Prio=Prio or 50
|
||||
if nTransport==nil then
|
||||
if TransportType==WAREHOUSE.TransportType.SELFPROPELLED then
|
||||
nTransport=0
|
||||
else
|
||||
nTransport=1
|
||||
end
|
||||
end
|
||||
|
||||
-- Not more transports than assets.
|
||||
--if type(nAsset)=="number" then
|
||||
-- nTransport=math.min(nAsset, nTransport)
|
||||
--end
|
||||
|
||||
-- Self request?
|
||||
local toself=false
|
||||
if self.warehouse:GetName()==warehouse:GetName() then
|
||||
if self.warehouse:GetName()==warehouse.warehouse:GetName() then
|
||||
toself=true
|
||||
end
|
||||
|
||||
@ -1806,13 +1818,14 @@ function WAREHOUSE:onafterAddRequest(From, Event, To, warehouse, AssetDescriptor
|
||||
uid=self.queueid,
|
||||
prio=Prio,
|
||||
warehouse=warehouse,
|
||||
airbase=warehouse.airbase,
|
||||
category=warehouse.category,
|
||||
assetdesc=AssetDescriptor,
|
||||
assetdescval=AssetDescriptorValue,
|
||||
nasset=nAsset,
|
||||
transporttype=TransportType,
|
||||
ntransport=nTransport,
|
||||
assignment=tostring(Assignment),
|
||||
airbase=warehouse.airbase,
|
||||
category=warehouse.category,
|
||||
ndelivered=0,
|
||||
ntransporthome=0,
|
||||
assets={},
|
||||
@ -2544,8 +2557,10 @@ function WAREHOUSE:onafterAttacked(From, Event, To, Coalition, Country)
|
||||
self:I(self.wid..text)
|
||||
|
||||
-- Spawn all ground units in the spawnzone?
|
||||
if self.selfdefence then
|
||||
self:AddRequest(self, WAREHOUSE.Descriptor.CATEGORY, Group.Category.GROUND, "all", nil, nil , 0)
|
||||
end
|
||||
end
|
||||
|
||||
--- On after "Defeated" event. Warehouse defeated an attack by another coalition. Defender assets are added back to warehouse stock.
|
||||
-- @param #WAREHOUSE self
|
||||
@ -2562,9 +2577,6 @@ function WAREHOUSE:onafterDefeated(From, Event, To)
|
||||
--if self.defenderrequest then
|
||||
for _,request in pairs(self.defending) do
|
||||
|
||||
-- Get all assets that were deployed for defending the warehouse.
|
||||
--local request=self.defenderrequest --#WAREHOUSE.Pendingitem
|
||||
|
||||
-- Route defenders back to warehoue (for visual reasons only) and put them back into stock.
|
||||
for _,_group in pairs(request.cargogroupset:GetSetObjects()) do
|
||||
local group=_group --Wrapper.Group#GROUP
|
||||
@ -2579,9 +2591,6 @@ function WAREHOUSE:onafterDefeated(From, Event, To)
|
||||
self:__AddAsset(60, group)
|
||||
end
|
||||
|
||||
-- Set defender request back to nil.
|
||||
--self.defenderrequest=nil
|
||||
|
||||
--self:_DeleteQueueItem(request, self.defending)
|
||||
end
|
||||
|
||||
@ -2664,7 +2673,7 @@ end
|
||||
function WAREHOUSE:onafterAirbaseRecaptured(From, Event, To, Coalition)
|
||||
|
||||
-- Message.
|
||||
local text=string.format("Warehouse %s: We recaptured our airbase %d from the enemy (coalition=%d)!", self.alias, self.airbasename, Coalition)
|
||||
local text=string.format("Warehouse %s: We recaptured our airbase %s from the enemy (coalition=%d)!", self.alias, self.airbasename, Coalition)
|
||||
MESSAGE:New(text, 20):ToCoalitionIf(self.coalition, self.Report or self.Debug)
|
||||
self:I(self.wid..text)
|
||||
|
||||
@ -2771,8 +2780,7 @@ function WAREHOUSE:_RouteNaval(group, request)
|
||||
end
|
||||
|
||||
-- Task function triggering the arrived event at the last waypoint.
|
||||
--local TaskFunction = group:TaskFunction("WAREHOUSE._Arrived", self)
|
||||
local TaskFunction = self:_SimpleTaskFunction("WAREHOUSE:_ArrivedSimple", group)
|
||||
local TaskFunction = self:_SimpleTaskFunction("warehouse:_ArrivedSimple", group)
|
||||
|
||||
-- Put task function on last waypoint.
|
||||
local Waypoint = Waypoints[#Waypoints]
|
||||
@ -3046,40 +3054,39 @@ end
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
||||
function WAREHOUSE:_OnEventBaseCaptured(EventData)
|
||||
self:T3(self.wid..string.format("Warehouse %s captured event base captured!",self.alias))
|
||||
|
||||
-- This warehouse does not have an airbase and never had one. So i could not be captured.
|
||||
-- This warehouse does not have an airbase and never had one. So it could not have been captured.
|
||||
if self.airbasename==nil then
|
||||
-- This warehouse never had an airbase so I cannot have been captured.
|
||||
return
|
||||
end
|
||||
|
||||
self:E(self.wid..string.format("Warehouse %s captured event base captured!",self.alias))
|
||||
|
||||
if EventData and EventData.Place then
|
||||
|
||||
-- Place is the airbase that was captured.
|
||||
local airbase=EventData.Place --Wrapper.Airbase#AIRBASE
|
||||
|
||||
-- Check that this airbase belongs or did belong to this warehouse.
|
||||
if EventData.PlaceName==self.airbasename then
|
||||
-- Okay, this airbase belongs or did belong to this warehouse.
|
||||
|
||||
self:I(self.wid..string.format("Airbase of warehouse %s was captured! ",self.alias))
|
||||
|
||||
-- New coalition of airbase after it was captured.
|
||||
local coalitionAirbase=airbase:GetCoalition()
|
||||
local NewCoalitionAirbase=airbase:GetCoalition()
|
||||
|
||||
-- Debug info
|
||||
self:I(self.wid..string.format("Airbase of warehouse %s (coalition = %d) was captured! New owner coalition = %d.",self.alias, self.coalition, NewCoalitionAirbase))
|
||||
|
||||
-- So what can happen?
|
||||
-- Warehouse is blue, airbase is blue and belongs to warehouse and red captures it ==> self.airbase=nil
|
||||
-- Warehouse is blue, airbase is blue self.airbase is nil and blue (re-)captures it ==> self.airbase=Event.Place
|
||||
if self.airbase==nil then
|
||||
-- Warehouse lost this airbase previously and not it was re-captured.
|
||||
if coalitionAirbase == self.coalition then
|
||||
self:AirbaseRecaptured(coalitionAirbase)
|
||||
-- New coalition is the same as of the warehouse ==> warehouse previously lost this airbase and now it was re-captured.
|
||||
if NewCoalitionAirbase == self.coalition then
|
||||
self:AirbaseRecaptured(NewCoalitionAirbase)
|
||||
end
|
||||
else
|
||||
-- Captured airbase belongs to this warehouse but was captured by other coaltion.
|
||||
if coalitionAirbase ~= self.coalition then
|
||||
self:AirbaseCaptured(coalitionAirbase)
|
||||
if NewCoalitionAirbase ~= self.coalition then
|
||||
self:AirbaseCaptured(NewCoalitionAirbase)
|
||||
end
|
||||
end
|
||||
|
||||
@ -3353,7 +3360,9 @@ function WAREHOUSE:_CheckRequestValid(request)
|
||||
|
||||
else
|
||||
|
||||
-- Check if enough parking spots are available
|
||||
-- Check if enough parking spots are available. This checks the spots available in general, i.e. not the free spots.
|
||||
-- TODO: For FARPS/ships, is it possible to send more assets than parking spots? E.g. a FARPS has only four (or even one).
|
||||
-- TODO: maybe only check if spots > 0 for the necessary terminal type? At least for FARPS.
|
||||
|
||||
-- Get necessary terminal type.
|
||||
local termtype=self:_GetTerminal(asset.attribute)
|
||||
@ -3362,15 +3371,18 @@ function WAREHOUSE:_CheckRequestValid(request)
|
||||
local np_departure=self.airbase:GetParkingSpotsNumber(termtype)
|
||||
local np_destination=request.airbase:GetParkingSpotsNumber(termtype)
|
||||
|
||||
-- Debug info.
|
||||
self:E(string.format("Asset attribute = %s, terminal type = %d, spots at departure = %d, destination = %d", asset.attribute, termtype, np_departure, np_destination))
|
||||
|
||||
-- Not enough parking at sending warehouse.
|
||||
if np_departure < request.nasset then
|
||||
self:E("ERROR: Incorrect request. No enough parking spots of terminal type at warehouse.")
|
||||
self:E(string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at warehouse. Available spots = %d.", termtype, np_departure))
|
||||
valid=false
|
||||
end
|
||||
|
||||
-- Not enough parking at requesting warehouse.
|
||||
if np_destination < request.nasset then
|
||||
self:E("ERROR: Incorrect request. No enough parking spots of terminal type at requesting warehouse.")
|
||||
self:E(string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at requesting warehouse. Available spots = %d.", termtype, np_destination))
|
||||
valid=false
|
||||
end
|
||||
|
||||
@ -3483,7 +3495,7 @@ function WAREHOUSE:_CheckRequestValid(request)
|
||||
|
||||
-- Add request as unvalid and delete it later.
|
||||
if valid==false then
|
||||
self:E(self.wid..string.format("Got invalid request id=%d.", request.uid))
|
||||
self:E(self.wid..string.format("ERROR: Got invalid request id=%d.", request.uid))
|
||||
else
|
||||
self:T3(self.wid..string.format("Got valid request id=%d.", request.uid))
|
||||
end
|
||||
@ -3733,7 +3745,7 @@ function WAREHOUSE:_CheckQueue()
|
||||
|
||||
-- Remember invalid request and delete later in order not to confuse the loop.
|
||||
if not valid then
|
||||
table.insert(invalid,request)
|
||||
table.insert(invalid, qitem)
|
||||
end
|
||||
|
||||
-- Get the first valid request that can be executed now.
|
||||
@ -3767,12 +3779,11 @@ function WAREHOUSE:_SimpleTaskFunction(Function, group)
|
||||
|
||||
-- Task script.
|
||||
local DCSScript = {}
|
||||
--DCSScript[#DCSScript+1] = string.format('env.info("WAREHOUSE: Simple task function called!") ')
|
||||
--DCSScript[#DCSScript+1] = string.format('local mygroup = GROUP:Find( ... ) ') -- The group that executes the task function. Very handy with the "...".
|
||||
DCSScript[#DCSScript+1] = string.format('local mygroup = GROUP:FindByName(%s) ', groupname) -- The group that executes the task function. Very handy with the "...".
|
||||
DCSScript[#DCSScript+1] = string.format('local mystatic = STATIC:FindByName(%s) ', warehouse) -- The static that holds the warehouse self object.
|
||||
DCSScript[#DCSScript+1] = string.format('local warehouse = mygroup:GetState(mystatic, "WAREHOUSE") ') -- Get the warehouse self object from the static.
|
||||
DCSScript[#DCSScript+1] = string.format('%s(warehouse, mygroup)', Function) -- Call the function, e.g. myfunction.(warehouse,mygroup)
|
||||
--DCSScript[#DCSScript+1] = string.format('env.info(\"WAREHOUSE: Simple task function called!\") ')
|
||||
DCSScript[#DCSScript+1] = string.format('local mygroup = GROUP:FindByName(\"%s\") ', groupname) -- The group that executes the task function. Very handy with the "...".
|
||||
DCSScript[#DCSScript+1] = string.format("local mystatic = STATIC:FindByName(\"%s\") ", warehouse) -- The static that holds the warehouse self object.
|
||||
DCSScript[#DCSScript+1] = string.format('local warehouse = mystatic:GetState(mystatic, \"WAREHOUSE\") ') -- Get the warehouse self object from the static.
|
||||
DCSScript[#DCSScript+1] = string.format('%s(mygroup)', Function) -- Call the function, e.g. myfunction.(warehouse,mygroup)
|
||||
|
||||
-- Create task.
|
||||
local DCSTask = CONTROLLABLE.TaskWrappedAction(self, CONTROLLABLE.CommandDoScript(self, table.concat(DCSScript)))
|
||||
@ -4219,6 +4230,8 @@ function WAREHOUSE:_GetAttribute(groupname)
|
||||
attribute=WAREHOUSE.Attribute.AIR_TANKER
|
||||
elseif transporthelo then
|
||||
attribute=WAREHOUSE.Attribute.AIR_TRANSPORTHELO
|
||||
elseif attackhelicopter then
|
||||
attribute=WAREHOUSE.Attribute.AIR_ATTACKHELO
|
||||
elseif apc then
|
||||
attribute=WAREHOUSE.Attribute.GROUND_APC
|
||||
elseif truck then
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user