From 4a424dd3d8dab18cfe57a0a812af863597a2da70 Mon Sep 17 00:00:00 2001 From: funkyfranky Date: Fri, 3 Aug 2018 00:01:41 +0200 Subject: [PATCH] WAREHOUSE --- .../Moose/AI/AI_Cargo_Airplane.lua | 5 +- .../Moose/Functional/Warehouse.lua | 146 ++++++++++++------ 2 files changed, 99 insertions(+), 52 deletions(-) diff --git a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua index b1422cb11..f1fdfab54 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua @@ -274,7 +274,8 @@ end -- @param Wrapper.Point#COORDINATE 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 local Cargo=Cargo --Cargo.Cargo#CARGO @@ -472,6 +473,8 @@ function AI_CARGO_AIRPLANE:Route( Airplane, Airbase, Speed ) self:T3( Points ) Template.route.points = Points + + Template.uncontrolled=false --self:Respawn( Template ) diff --git a/Moose Development/Moose/Functional/Warehouse.lua b/Moose Development/Moose/Functional/Warehouse.lua index 3d90f7c65..6c983738a 100644 --- a/Moose Development/Moose/Functional/Warehouse.lua +++ b/Moose Development/Moose/Functional/Warehouse.lua @@ -22,7 +22,8 @@ -- @field DCS#Coalition coalition Coalition 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 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 #table stock Table holding all assets in stock. Table entries are of type @{#WAREHOUSE.Stock}. -- @extends Core.Fsm#FSM @@ -62,6 +63,7 @@ WAREHOUSE = { homebase = nil, coordinate = nil, spawnzone = nil, + markerid = nil, assetid = 0, stock = {}, } @@ -153,7 +155,9 @@ function WAREHOUSE:NewAirbase(airbase) local _road=self.coordinate:GetClosestPointToRoad():GetVec2() -- 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. self:AddTransition("*", "Start", "Running") @@ -232,14 +236,15 @@ end -- @param #string Event Event. -- @param #string To To state. 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 -- event takeoff -- event landing -- event crash/dead -- event base captured - self:__Status(-5) + + self:__Status(5) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -250,10 +255,32 @@ end -- @param #string Event Event. -- @param #string To To state. 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)) - self:_DisplayStockItems(self.stock) + -- Create a mark with the current assets in 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) end @@ -272,7 +299,8 @@ end -- @param #WAREHOUSE.TransportType TransportType Type of transport. -- @return #boolean If true, request is granted. 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. nAsset=nAsset or 1 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. local _stockitem=_stockrequest[1] --#WAREHOUSE.Stockitem local _assetattribute=self:_GetAttribute(_stockitem.templatename) - - --if _assetattribute==WAREHOUSE.Attribute. - + -- Shortcut - local _TT=TransportType:lower() - local _instock + local _instock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType) + --[[ -- Check the availability of transport units. if _TT == WAREHOUSE.TransportType.AIRPLANE then _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))) return false 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.") MESSAGE:New(text, 10):ToCoalitionIf(self.coalition, self.Report or self.Debug) self:E(self.wid..text) return false end - return true end @@ -343,54 +370,43 @@ end -- @param #WAREHOUSE.TransportType TransportType Type of transport. 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))) - + + -- Filter the requested assets. 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. local CargoGroups = SET_CARGO:New() - + -- Spawn the assets. local _delid={} + local _spawngroups={} 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) + -- Find a random point within the spawn zone. + local spawnvec3=self.spawnzone:GetRandomVec3() + local spawncoord=COORDINATE:NewFromVec3(spawnvec3) + spawncoord:MarkToAll(string.format("spawnpoint %d",i)) + + -- Spawn with ALIAS here or DCS crashes! + _spawngroups[i]=SPAWN:NewWithAlias(_assetitem.templatename,string.format("%s_%d", _assetitem.templatename,i)):SpawnFromVec3(spawnvec3) 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. for _,_id in pairs(_delid) do - self:_DeleteStockItem(_id) + self:_DeleteStockItem(_id) 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. @@ -398,7 +414,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass local _transportitem --#WAREHOUSE.Stockitem if TransportType~=WAREHOUSE.TransportType.SELFPROPELLED then _transportstock=self:_FilterStock(self.stock, WAREHOUSE.Descriptor.ATTRIBUTE, TransportType) - _chosenone=math.random(#_transportstock) + local _chosenone=math.random(#_transportstock) -- Select asset template group name. _transportitem=_transportstock[_chosenone] end @@ -408,7 +424,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Airbase, AssetDescriptor, Ass -- 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) + local Plane=SPAWN:New(_transportitem.templatename):InitUnControlled(true):SpawnAtAirbase(self.homebase, SPAWN.Takeoff.Cold, nil, AIRBASE.TerminalType.OpenBig, false) if Plane==nil then -- 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() end - -- Define cargo airplane. + -- Define cargo airplane object. local CargoPlane = AI_CARGO_AIRPLANE:New(Plane, CargoGroups) + CargoPlane.Airbase=self.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. 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 truck=group:HasAttribute("Trucks") - -- Debug output. + -- 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))) @@ -631,7 +651,8 @@ function WAREHOUSE:_GetAttribute(groupname) 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 @@ -665,6 +686,29 @@ function WAREHOUSE:_GetAttribute(groupname) return attribute 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. -- @param #WAREHOUSE self -- @param #number uid The id of the item to be deleted.