mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Warehouse v0.2.8
- Added first version of naval assets (self propelled). - Changed WAREHOUSE.Attribute
This commit is contained in:
parent
a9a040626e
commit
8e16fbd000
@ -358,42 +358,49 @@ WAREHOUSE.Descriptor = {
|
||||
|
||||
--- Generalized asset attributes. Can be used to request assets with certain general characteristics.
|
||||
-- @type WAREHOUSE.Attribute
|
||||
-- @field #string TRANSPORT_PLANE Airplane with transport capability. Usually bigger, i.e. needs larger airbases and parking spots.
|
||||
-- @field #string TRANSPORT_HELO Helicopter with transport capability.
|
||||
-- @field #string TRANSPORT_APC Amoured Personell Carrier.
|
||||
-- @field #string TRANSPORT_SHIP Ship defined for troop transport. Since most ships can, this attribute must be manually requestet in the AddAddet() function.
|
||||
-- @field #string FIGHTER Fighter, interceptor, ... airplane.
|
||||
-- @field #string TANKER Airplane which can refuel other aircraft.
|
||||
-- @field #string AWACS Airborne Early Warning and Control System.
|
||||
-- @field #string ARTILLERY Artillery assets.
|
||||
-- @field #string INFANTRY Ground infantry assets.
|
||||
-- @field #string BOMBER Aircraft which can be used for bombing.
|
||||
-- @field #string TANK Tanks.
|
||||
-- @field #string TRUCK Unarmed ground vehicles.
|
||||
-- @field #string TRAIN Trains. Not that trains are **not** yet properly implemented in DCS and cannot be used currently.
|
||||
-- @field #string AIRCRAFTCARRIER Ship able to carrier aircraft.
|
||||
-- @field #string WARSHIP Armed war ship, e.g. cruisers, destroyers, firgates and corvettes.
|
||||
-- @filed #string UNARMED_SHIP Any unarmed naval vessel.
|
||||
-- @field #string OTHER Anything that does not fall into any other category.
|
||||
-- @field #string AIR_TRANSPORTPLANE Airplane with transport capability. This can be used to transport other assets.
|
||||
-- @field #string AIR_AWACS Airborne Early Warning and Control System.
|
||||
-- @field #string AIR_FIGHTER Fighter, interceptor, ... airplane.
|
||||
-- @field #string AIR_BOMBER Aircraft which can be used for strategic bombing.
|
||||
-- @field #string AIR_TANKER Airplane which can refuel other aircraft.
|
||||
-- @field #string AIR_TRANSPORTHELO Helicopter with transport capability. This can be used to transport other assets.
|
||||
-- @field #string AIR_ATTACKHELO Attack helicopter.
|
||||
-- @field #string AIR_OTHER Any airborne unit that does not fall into any other airborne category.
|
||||
-- @field #string GROUND_APC Infantry carriers, in particular Amoured Personell Carrier. This can be used to transport other assets.
|
||||
-- @field #string GROUND_TRUCK Unarmed ground vehicles.
|
||||
-- @field #string GROUND_INFANTRY Ground infantry assets.
|
||||
-- @field #string GROUND_ARTILLERY Artillery assets.
|
||||
-- @field #string GROUND_TANK Tanks (modern or old).
|
||||
-- @field #string GROUND_TRAIN Trains. Not that trains are **not** yet properly implemented in DCS and cannot be used currently.
|
||||
-- @field #string GROUND_OTHER Any ground unit that does not fall into any other ground category.
|
||||
-- @field #string NAVAL_AIRCRAFTCARRIER Aircraft carrier.
|
||||
-- @field #string NAVAL_WARSHIP War ship, i.e. cruisers, destroyers, firgates and corvettes.
|
||||
-- @field #string NAVAL_ARMEDSHIP Any armed ship that is not an aircraft carrier, a cruiser, destroyer, firgatte or corvette.
|
||||
-- @field #string NAVAL_UNARMEDSHIP Any unarmed naval vessel.
|
||||
-- @field #string NAVAL_OTHER Any naval unit that does not fall into any other naval category.
|
||||
-- @field #string UNKNOWN Anything that does not fall into any other category.
|
||||
WAREHOUSE.Attribute = {
|
||||
TRANSPORT_PLANE="Transport_Plane",
|
||||
TRANSPORT_HELO="Transport_Helo",
|
||||
TRANSPORT_APC="Transport_APC",
|
||||
TRANSPORT_SHIP="Transport_Ship",
|
||||
FIGHTER="Fighter",
|
||||
TANKER="Tanker",
|
||||
AWACS="AWACS",
|
||||
ARTILLERY="Artillery",
|
||||
ATTACKHELICOPTER="Attackhelicopter",
|
||||
INFANTRY="Infantry",
|
||||
BOMBER="Bomber",
|
||||
TANK="Tank",
|
||||
TRUCK="Truck",
|
||||
TRAIN="Train",
|
||||
AIRCRAFTCARRIER="Aircraftcarrier",
|
||||
WAR_SHIP="Warship",
|
||||
UNARMED_SHIP="Unarmedship",
|
||||
OTHER="Other",
|
||||
AIR_TRANSPORTPLANE="Air_TransportPlane",
|
||||
AIR_AWACS="Air_AWACS",
|
||||
AIR_FIGHTER="Air_Fighter",
|
||||
AIR_BOMBER="Air_Bomber",
|
||||
AIR_TANKER="Air_Tanker",
|
||||
AIR_TRANSPORTHELO="Air_TransportHelo",
|
||||
AIR_ATTACKHELO="Air_AttackHelo",
|
||||
AIR_OTHER="Air_Other",
|
||||
GROUND_APC="Ground_APC",
|
||||
GROUND_TRUCK="Ground_Truck",
|
||||
GROUND_INFANTRY="Ground_Infantry",
|
||||
GROUND_ARTILLERY="Ground_Artillery",
|
||||
GROUND_TANK="Ground_Tank",
|
||||
GROUND_TRAIN="Ground_Train",
|
||||
GROUND_OTHER="Ground_Other",
|
||||
NAVAL_AIRCRAFTCARRIER="Naval_AircraftCarrier",
|
||||
NAVAL_WARSHIP="Naval_WarShip",
|
||||
NAVAL_ARMEDSHIP="Naval_ArmedShip",
|
||||
NAVAL_UNARMEDSHIP="Naval_UnarmedShip",
|
||||
NAVAL_OTHER="Naval_Other",
|
||||
UNKNOWN="Unknown",
|
||||
}
|
||||
|
||||
--- Cargo transport type. Defines how assets are transported to their destination.
|
||||
@ -405,11 +412,11 @@ WAREHOUSE.Attribute = {
|
||||
-- @field #string TRAIN Transports are conducted by trains. Not yet implemented.
|
||||
-- @field #string SELFPROPELLED Assets go to their destination by themselves. No transport carrier needed.
|
||||
WAREHOUSE.TransportType = {
|
||||
AIRPLANE = "Transport_Plane",
|
||||
HELICOPTER = "Transport_Helo",
|
||||
APC = "Transport_APC",
|
||||
SHIP = "Ship",
|
||||
TRAIN = "Train",
|
||||
AIRPLANE = "Air_TransportPlane",
|
||||
HELICOPTER = "Air_TransportHelo",
|
||||
APC = "Ground_APC",
|
||||
TRAIN = "Ground_Train",
|
||||
SHIP = "Naval_UnarmedShip",
|
||||
SELFPROPELLED = "Selfpropelled",
|
||||
}
|
||||
|
||||
@ -424,7 +431,7 @@ WAREHOUSE.db = {
|
||||
|
||||
--- Warehouse class version.
|
||||
-- @field #string version
|
||||
WAREHOUSE.version="0.2.7w"
|
||||
WAREHOUSE.version="0.2.8"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- TODO: Warehouse todo list.
|
||||
@ -844,7 +851,7 @@ end
|
||||
--- Set the port zone for this warehouse.
|
||||
-- The port zone is the zone, where all naval assets of the warehouse are spawned.
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param Core.Zone#ZONE The zone defining the naval port of the warehouse.
|
||||
-- @param Core.Zone#ZONE zone The zone defining the naval port of the warehouse.
|
||||
-- @return #WAREHOUSE self
|
||||
function WAREHOUSE:SetPortZone(zone)
|
||||
self.portzone=zone
|
||||
@ -884,31 +891,32 @@ function WAREHOUSE:AddShippingLane(remotewarehouse, group)
|
||||
|
||||
-- Add the shipping lane. Need to take care of the wrong "direction".
|
||||
local lane={}
|
||||
lane.towarehouse=remotewarehouse.warehouse:GetName()
|
||||
lane.coordinates={}
|
||||
--lane.towarehouse=remotewarehouse.warehouse:GetName()
|
||||
--lane.coordinates={}
|
||||
if distF<distL then
|
||||
for i=1,#lanepoints do
|
||||
local point=lanepoints[i]
|
||||
local coord=COORDINATE:New(point.x,0, point.y)
|
||||
table.insert(lane.coordinate, coord)
|
||||
table.insert(lane, coord)
|
||||
end
|
||||
else
|
||||
for i=#lanepoints,1,-1 do
|
||||
local point=lanepoints[i]
|
||||
local coord=COORDINATE:New(point.x,0, point.y)
|
||||
table.insert(lane.coordinate, coord)
|
||||
table.insert(lane, coord)
|
||||
end
|
||||
end
|
||||
|
||||
-- Debug info. Marks along shipping lane.
|
||||
for i=1,#lane.coordinates do
|
||||
local coord=lane.coordinates[i] --Core.Point#COORDINATE
|
||||
for i=1,#lane do
|
||||
local coord=lane[i] --Core.Point#COORDINATE
|
||||
local text=string.format("Shipping lane %s to %s. Point %d.", self.alias, remotewarehouse.alias, i)
|
||||
coord:MarkToCoalition(text, self.coalition)
|
||||
end
|
||||
|
||||
-- Add shipping lane.
|
||||
table.insert(self.shippinglanes, lane)
|
||||
self.shippinglanes[remotewarehouse.warehouse:GetName()]=lane
|
||||
--table.insert(self.shippinglanes, lane)
|
||||
|
||||
return self
|
||||
end
|
||||
@ -981,6 +989,31 @@ function WAREHOUSE:HasConnectionRail(warehouse, markpath, smokepath)
|
||||
return nil, -1
|
||||
end
|
||||
|
||||
--- Check if the warehouse has a shipping lane defined to another warehouse.
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param #WAREHOUSE warehouse The remote warehose to where the connection is checked.
|
||||
-- @param #boolean markpath If true, place markers of path segments on the F10 map.
|
||||
-- @param #boolean smokepath If true, put green smoke on path segments.
|
||||
-- @return #boolean If true, the two warehouses are connected by road.
|
||||
-- @return #number Path length in meters. Negative distance -1 meter indicates no connection.
|
||||
function WAREHOUSE:HasConnectionNaval(warehouse, markpath, smokepath)
|
||||
|
||||
if warehouse then
|
||||
|
||||
local shippinglane=self.shippinglanes[warehouse.warehouse:GetName()]
|
||||
|
||||
if shippinglane then
|
||||
return true,1
|
||||
else
|
||||
env.info("FF no shipping lane!")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return nil, -1
|
||||
end
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- FSM states
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@ -1347,19 +1380,20 @@ end
|
||||
-- @param #string templategroupname Name of the late activated template group as defined in the mission editor.
|
||||
-- @param #number ngroups Number of groups to add to the warehouse stock. Default is 1.
|
||||
function WAREHOUSE:_AddAssetFromZombie(group, ngroups)
|
||||
|
||||
--TODO
|
||||
end
|
||||
|
||||
|
||||
--- Spawn a ground asset in the spawnzone of the warehouse.
|
||||
--- Spawn a ground or naval asset in the corresponding spawn zone of the warehouse.
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param #WAREHOUSE.Assetitem asset Ground asset that will be spawned.
|
||||
-- @param #WAREHOUSE.Queueitem request Request belonging to this asset. Needed for the name/alias.
|
||||
-- @param Core.Zone#ZONE spawnzone Zone where the assets should be spawned.
|
||||
-- @param boolean aioff If true, AI of ground units are set to off.
|
||||
-- @return Wrapper.Group#GROUP The spawned group or nil if the group could not be spawned.
|
||||
function WAREHOUSE:_SpawnAssetGround(asset, request, aioff)
|
||||
function WAREHOUSE:_SpawnAssetGroundNaval(asset, request, spawnzone, aioff)
|
||||
|
||||
if asset and asset.category==Group.Category.GROUND then
|
||||
if asset and (asset.category==Group.Category.GROUND or asset.category==Group.Category.SHIP) then
|
||||
|
||||
-- Prepare spawn template.
|
||||
local template=self:_SpawnAssetPrepareTemplate(asset, request)
|
||||
@ -1368,7 +1402,7 @@ function WAREHOUSE:_SpawnAssetGround(asset, request, aioff)
|
||||
template.route.points[1]={}
|
||||
|
||||
-- Get a random coordinate in the spawn zone.
|
||||
local coord=self.spawnzone:GetRandomCoordinate()
|
||||
local coord=spawnzone:GetRandomCoordinate()
|
||||
|
||||
-- Translate the position of the units.
|
||||
for i=1,#template.units do
|
||||
@ -1542,7 +1576,6 @@ function WAREHOUSE:_SpawnAssetPrepareTemplate(asset, request)
|
||||
|
||||
-- Create an own copy of the template!
|
||||
local template=UTILS.DeepCopy(asset.template)
|
||||
--local template=asset.template
|
||||
|
||||
-- Set unique name.
|
||||
template.name=self:_Alias(asset, request)
|
||||
@ -1776,19 +1809,22 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
||||
elseif _cargocategory==Group.Category.AIRPLANE or _cargocategory==Group.Category.HELICOPTER then
|
||||
self:I(self.wid..string.format("Route airborne group %s.", group:GetName()))
|
||||
|
||||
-- Route plane the the requesting warehouses airbase.
|
||||
-- Route plane to the requesting warehouses airbase.
|
||||
-- Actually, the route is already set. We only need to activate the uncontrolled group.
|
||||
self:_RouteAir(group, Request.airbase)
|
||||
|
||||
elseif _cargocategory==Group.Category.SHIP then
|
||||
self:I(self.wid..string.format("Route naval group %s.", group:GetName()))
|
||||
|
||||
self:E("ERROR: self propelled ship not implemented yet!")
|
||||
-- Route plane to the requesting warehouses airbase.
|
||||
self:_RouteNaval(group, Request)
|
||||
|
||||
elseif _cargocategory==Group.Category.TRAIN then
|
||||
self:I(self.wid..string.format("Route train group %s.", group:GetName()))
|
||||
|
||||
-- Route train to the rail connection of the requesting warehouse.
|
||||
self:_RouteTrain(group, Request.warehouse.rail)
|
||||
|
||||
else
|
||||
self:E(self.wid..string.format("ERROR: unknown category %s for self propelled cargo %s!", tostring(_cargocategory), tostring(group:GetName())))
|
||||
end
|
||||
@ -1963,7 +1999,7 @@ function WAREHOUSE:onafterRequest(From, Event, To, Request)
|
||||
local _alias=self:_Alias(_assetitem, Request)
|
||||
|
||||
-- Spawn ground asset.
|
||||
local spawngroup=self:_SpawnAssetGround(_assetitem, Request)
|
||||
local spawngroup=self:_SpawnAssetGround(_assetitem, Request, self.spawnzone)
|
||||
|
||||
if spawngroup then
|
||||
-- Set state of warehouse so we can retrieve it later.
|
||||
@ -2122,7 +2158,7 @@ function WAREHOUSE:_SpawnAssetRequest(Request)
|
||||
if _assetitem.category==Group.Category.GROUND then
|
||||
|
||||
-- Spawn ground troops.
|
||||
_group=self:_SpawnAssetGround(_assetitem, Request)
|
||||
_group=self:_SpawnAssetGroundNaval(_assetitem, Request, self.spawnzone)
|
||||
|
||||
elseif _assetitem.category==Group.Category.AIRPLANE or _assetitem.category==Group.Category.HELICOPTER then
|
||||
|
||||
@ -2142,9 +2178,12 @@ function WAREHOUSE:_SpawnAssetRequest(Request)
|
||||
self:E(self.wid.."ERROR: Spawning of TRAIN assets not possible yet!")
|
||||
|
||||
elseif _assetitem.category==Group.Category.SHIP then
|
||||
self:E(self.wid.."ERROR: Spawning of SHIP assets not possible yet!")
|
||||
else
|
||||
|
||||
-- Spawn naval assets.
|
||||
_group=self:_SpawnAssetGroundNaval(_assetitem, Request, self.portzone)
|
||||
|
||||
else
|
||||
self:E(self.wid.."ERROR: Unknown asset category!")
|
||||
end
|
||||
|
||||
-- Add group to group set and asset list.
|
||||
@ -2532,8 +2571,6 @@ function WAREHOUSE:_RouteGround(group, request)
|
||||
|
||||
-- Set speed to 70% of max possible.
|
||||
local _speed=group:GetSpeedMax()*0.7
|
||||
|
||||
-- Create task.
|
||||
|
||||
-- Waypoints for road-to-road connection.
|
||||
local Waypoints, canroad = group:TaskGroundOnRoad(request.warehouse.road, _speed, "Off Road", false, self.road)
|
||||
@ -2562,6 +2599,61 @@ function WAREHOUSE:_RouteGround(group, request)
|
||||
end
|
||||
end
|
||||
|
||||
--- Route naval units along user defined shipping lanes to destination warehouse.
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param Wrapper.Group#GROUP group The naval group to be routed
|
||||
-- @param #WAREHOUSE.Queueitem request The request for this group.
|
||||
function WAREHOUSE:_RouteNaval(group, request)
|
||||
|
||||
-- Check if we have a group and it is alive.
|
||||
if group and group:IsAlive() then
|
||||
|
||||
-- Set speed to 80% of max possible.
|
||||
local _speed=group:GetSpeedMax()*0.8
|
||||
|
||||
-- Get shipping lane to remote warehouse.
|
||||
local lane=self.shippinglanes[request.warehouse.warehouse:GetName()]
|
||||
|
||||
if lane then
|
||||
|
||||
-- Route waypoints.
|
||||
local Waypoints={}
|
||||
|
||||
-- Loop over user defined shipping lanes.
|
||||
for i=1,#lane do
|
||||
|
||||
-- Shortcut and coordinate intellisense.
|
||||
local coord=lane[i] --Core.Point#COORDINATE
|
||||
|
||||
-- Get waypoint for coordinate.
|
||||
-- TODO: Might need optimization for Naval.
|
||||
local Waypoint=coord:WaypointGround(_speed)
|
||||
|
||||
-- Add waypoint to route.
|
||||
table.insert(Waypoints, Waypoint)
|
||||
end
|
||||
|
||||
-- Task function triggering the arrived event at the last waypoint.
|
||||
local TaskFunction = group:TaskFunction("WAREHOUSE._Arrived", self)
|
||||
|
||||
-- Put task function on last waypoint.
|
||||
local Waypoint = Waypoints[#Waypoints]
|
||||
group:SetTaskWaypoint(Waypoint, TaskFunction)
|
||||
|
||||
-- Route group to destination.
|
||||
group:Route(Waypoints, 1)
|
||||
|
||||
-- Set ROE (Naval units dont have and alaram state.)
|
||||
group:OptionROEReturnFire()
|
||||
|
||||
else
|
||||
-- This should not happen! Existance of shipping lane was checked before executing this request.
|
||||
self:E(self.wid..string.format("ERROR: No shipping lane defined for Naval asset!"))
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Route the airplane from one airbase another. Activates uncontrolled aircraft and sets ROE/ROT for ferry flights.
|
||||
-- @param #WAREHOUSE self
|
||||
@ -2629,11 +2721,9 @@ end
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param Wrapper.Group#GROUP group The group that arrived.
|
||||
function WAREHOUSE:_ArrivedSimple(group)
|
||||
|
||||
if group then
|
||||
--local self:_GetIDsFromGroup(group)
|
||||
env.info(self.wid..string.format("Group %s arrived at warehouse ", tostring(group:GetName())))
|
||||
env.info(string.format("Group %s arrived (simple)!", tostring(group:GetName())))
|
||||
|
||||
if group then
|
||||
--Trigger "Arrived event.
|
||||
self:__Arrived(1, group)
|
||||
end
|
||||
@ -3045,221 +3135,7 @@ function WAREHOUSE:_CheckRequestConsistancy(queue)
|
||||
self:_DeleteQueueItem(_request, self.queue)
|
||||
end
|
||||
|
||||
-- Stuff below is probably obsolete.
|
||||
if true then
|
||||
return
|
||||
end
|
||||
|
||||
-- Asset is air, ground etc.
|
||||
local asset_air=false
|
||||
local asset_plane=false
|
||||
local asset_helo=false
|
||||
local asset_ground=false
|
||||
local asset_train=false
|
||||
local asset_naval=false
|
||||
|
||||
-- Check if category was provided.
|
||||
if request.assetdesc==WAREHOUSE.Descriptor.CATEGORY then
|
||||
|
||||
if request.assetdescval==Group.Category.AIRPLANE then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==Group.Category.HELICOPTER then
|
||||
asset_helo=true
|
||||
elseif request.assetdescval==Group.Category.GROUND then
|
||||
asset_ground=true
|
||||
elseif request.assetdescval==Group.Category.SHIP then
|
||||
asset_naval=true
|
||||
elseif request.assetdescval==Group.Category.TRAIN then
|
||||
asset_ground=true
|
||||
asset_train=true
|
||||
else
|
||||
self:E("ERROR: Incorrect request. Asset Descriptor missmatch! Has to be Group.Cagetory.AIRPLANE, ...")
|
||||
valid=false
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Check attribute is matching
|
||||
if request.assetdesc==WAREHOUSE.Descriptor.ATTRIBUTE then
|
||||
if request.assetdescval==WAREHOUSE.Attribute.ARTILLERY then
|
||||
asset_ground=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.ATTACKHELICOPTER then
|
||||
asset_helo=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.AWACS then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.BOMBER then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.FIGHTER then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.INFANTRY then
|
||||
asset_ground=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.OTHER then
|
||||
self:E("ERROR: Incorrect request. Asset attribute WAREHOUSE.Attribute.OTHER is not valid!")
|
||||
valid=false
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.SHIP then
|
||||
asset_naval=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TANK then
|
||||
asset_ground=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TANKER then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TRAIN then
|
||||
asset_ground=true
|
||||
asset_train=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TRANSPORT_APC then
|
||||
asset_ground=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TRANSPORT_HELO then
|
||||
asset_helo=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TRANSPORT_PLANE then
|
||||
asset_plane=true
|
||||
elseif request.assetdescval==WAREHOUSE.Attribute.TRUCK then
|
||||
asset_ground=true
|
||||
else
|
||||
self:E("ERROR: Incorrect request. Unknown asset attribute!")
|
||||
valid=false
|
||||
end
|
||||
end
|
||||
|
||||
-- General air request.
|
||||
asset_air=asset_helo or asset_plane
|
||||
|
||||
if request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then
|
||||
-------------------------------------------
|
||||
-- Case where the units go my themselves --
|
||||
-------------------------------------------
|
||||
|
||||
if asset_air then
|
||||
|
||||
if asset_plane then
|
||||
|
||||
-- No airplane to or from FARPS.
|
||||
if request.category==Airbase.Category.HELIPAD or self.category==Airbase.Category.HELIPAD then
|
||||
self:E("ERROR: Incorrect request. Asset airplane requested but warehouse or requestor is HELIPAD/FARP!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
-- Category SHIP is not general enough! Fighters can go to carriers. Which fighters, is there an attibute?
|
||||
-- Also for carriers, attibute?
|
||||
|
||||
elseif asset_helo then
|
||||
|
||||
-- Helos need a FARP or AIRBASE or SHIP for spawning. Also at the the receiving warehouse. So even if they could go there they "cannot" be spawned again.
|
||||
-- Unless I allow spawning of helos in the the spawn zone. But one should place at least a FARP there.
|
||||
if self.category==-1 or request.category==-1 then
|
||||
self:E("ERROR: Incorrect request. Helos need a AIRBASE/HELIPAD/SHIP as home/destination base!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- All aircraft need an airbase of any type as depature or destination.
|
||||
if self.airbase==nil or request.airbase==nil then
|
||||
self:E("ERROR: Incorrect request. Either warehouse or requesting warehouse does not have any kind of airbase!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
elseif asset_ground then
|
||||
|
||||
-- No ground assets directly to or from ships.
|
||||
-- TODO: May needs refinement if warehouse is on land and requestor is ship in harbour?!
|
||||
if (request.category==Airbase.Category.SHIP or self.category==Airbase.Category.SHIP) then
|
||||
self:E("ERROR: Incorrect request. Ground asset requested but warehouse or requestor is SHIP!")
|
||||
--valid=false
|
||||
end
|
||||
|
||||
if asset_train then
|
||||
-- Check if there is a valid path on rail.
|
||||
local hasrail=self:HasConnectionRail(request.warehouse)
|
||||
if not hasrail then
|
||||
self:E("ERROR: Incorrect request. No valid path on rail for train assets!")
|
||||
valid=false
|
||||
end
|
||||
else
|
||||
if self.warehouse:GetName()~=request.warehouse.warehouse:GetName() then
|
||||
-- Check if there is a valid path on road.
|
||||
local hasroad=self:HasConnectionRoad(request.warehouse)
|
||||
if not hasroad then
|
||||
self:E("ERROR: Incorrect request. No valid path on road for ground assets!")
|
||||
valid=false
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif asset_naval then
|
||||
|
||||
self:E("ERROR: Incorrect request. Naval units not supported yet!")
|
||||
valid=false
|
||||
|
||||
end
|
||||
|
||||
else
|
||||
-------------------------------
|
||||
-- Assests need a transport ---
|
||||
-------------------------------
|
||||
|
||||
if request.transporttype==WAREHOUSE.TransportType.AIRPLANE then
|
||||
|
||||
-- Airplanes only to AND from airdromes.
|
||||
if self.category~=Airbase.Category.AIRDROME or request.category~=Airbase.Category.AIRDROME then
|
||||
self:E("ERROR: Incorrect request. Warehouse or requestor does not have an airdrome. No transport by plane possible!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
--TODO: Not sure if there are any transport planes that can land on a carrier?
|
||||
|
||||
elseif request.transporttype==WAREHOUSE.TransportType.APC then
|
||||
|
||||
-- Transport by ground units.
|
||||
|
||||
-- No transport to or from ships
|
||||
if self.category==Airbase.Category.SHIP or request.category==Airbase.Category.SHIP then
|
||||
self:E("ERROR: Incorrect request. Warehouse or requestor is SHIP. No transport by APC possible!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
-- Check if there is a valid path on road.
|
||||
local hasroad=self:HasConnectionRoad(request.warehouse)
|
||||
if not hasroad then
|
||||
self:E("ERROR: Incorrect request. No valid path on road for ground transport assets!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
elseif request.transporttype==WAREHOUSE.TransportType.HELICOPTER then
|
||||
|
||||
-- Transport by helicopters ==> need airbase for spawning but not for delivering to the spawn zone of the receiver.
|
||||
if self.category==-1 then
|
||||
self:E("ERROR: Incorrect request. Warehouse has no airbase. Transport by helicopter not possible!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
elseif request.transporttype==WAREHOUSE.TransportType.SHIP then
|
||||
|
||||
-- Transport by ship.
|
||||
self:E("ERROR: Incorrect request. Transport by SHIP not implemented yet!")
|
||||
valid=false
|
||||
|
||||
elseif request.transporttype==WAREHOUSE.TransportType.TRAIN then
|
||||
|
||||
-- Transport by train.
|
||||
self:E("ERROR: Incorrect request. Transport by TRAIN not implemented yet!")
|
||||
valid=false
|
||||
|
||||
else
|
||||
-- No match.
|
||||
self:E("ERROR: Incorrect request. Transport type unknown!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- 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))
|
||||
table.insert(invalid, request)
|
||||
else
|
||||
self:T3(self.wid..string.format("Got valid request id=%d.", request.uid))
|
||||
end
|
||||
|
||||
end -- loop queue items.
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
--- Check if a request is valid in general. If not, it will be removed from the queue.
|
||||
@ -3339,13 +3215,16 @@ function WAREHOUSE:_CheckRequestValid(request)
|
||||
end
|
||||
|
||||
if asset_train then
|
||||
|
||||
-- Check if there is a valid path on rail.
|
||||
local hasrail=self:HasConnectionRail(request.warehouse)
|
||||
if not hasrail then
|
||||
self:E("ERROR: Incorrect request. No valid path on rail for train assets!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
if self.warehouse:GetName()~=request.warehouse.warehouse:GetName() then
|
||||
-- Check if there is a valid path on road.
|
||||
local hasroad=self:HasConnectionRoad(request.warehouse)
|
||||
@ -3354,11 +3233,17 @@ function WAREHOUSE:_CheckRequestValid(request)
|
||||
valid=false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
elseif asset_naval then
|
||||
|
||||
self:E("ERROR: Incorrect request. Naval units not supported yet!")
|
||||
valid=false
|
||||
local shippinglane=self:HasConnectionNaval(request.warehouse)
|
||||
|
||||
if not shippinglane then
|
||||
self:E("ERROR: Incorrect request. No shipping lane has been defined between warehouses!")
|
||||
valid=false
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -3597,14 +3482,17 @@ end
|
||||
--@return Wrapper.Airbase#AIRBASE.TerminalType Terminal type for this group.
|
||||
function WAREHOUSE:_GetTerminal(_attribute)
|
||||
|
||||
-- Default terminal is "large".
|
||||
local _terminal=AIRBASE.TerminalType.OpenBig
|
||||
if _attribute==WAREHOUSE.Attribute.FIGHTER then
|
||||
|
||||
|
||||
if _attribute==WAREHOUSE.Attribute.AIR_FIGHTER then
|
||||
-- Fighter ==> small.
|
||||
_terminal=AIRBASE.TerminalType.FighterAircraft
|
||||
elseif _attribute==WAREHOUSE.Attribute.BOMBER or _attribute==WAREHOUSE.Attribute.TRANSPORT_PLANE or _attribute==WAREHOUSE.Attribute.TANKER or _attribute==WAREHOUSE.Attribute.AWACS then
|
||||
elseif _attribute==WAREHOUSE.Attribute.AIR_BOMBER or _attribute==WAREHOUSE.Attribute.AIR_TRANSPORTPLANE or _attribute==WAREHOUSE.Attribute.AIR_TANKER or _attribute==WAREHOUSE.Attribute.AIR_AWACS then
|
||||
-- Bigger aircraft.
|
||||
_terminal=AIRBASE.TerminalType.OpenBig
|
||||
elseif _attribute==WAREHOUSE.Attribute.TRANSPORT_HELO or _attribute==WAREHOUSE.Attribute.ATTACKHELICOPTER then
|
||||
elseif _attribute==WAREHOUSE.Attribute.AIR_TRANSPORTHELO or _attribute==WAREHOUSE.Attribute.AIR_ATTACKHELO then
|
||||
-- Helicopter.
|
||||
_terminal=AIRBASE.TerminalType.HelicopterUsable
|
||||
end
|
||||
@ -3963,6 +3851,7 @@ function WAREHOUSE:_HasAttribute(groupname, attribute)
|
||||
end
|
||||
|
||||
--- Get the generalized attribute of a group.
|
||||
-- Note that for a heterogenious group, the attribute is determined from the attribute of the first unit!
|
||||
-- @param #WAREHOUSE self
|
||||
-- @param #string groupname Name of the group.
|
||||
-- @return #WAREHOUSE.Attribute Generalized attribute of the group.
|
||||
@ -3978,61 +3867,76 @@ function WAREHOUSE:_GetAttribute(groupname)
|
||||
-- TODO: need to work on ships and trucks and SAMs and ...
|
||||
-- Also the Yak-52 for example is OTHER since it only has the attribute "Battleplanes".
|
||||
|
||||
-- Airplanes
|
||||
-----------
|
||||
--- Air ---
|
||||
-----------
|
||||
-- Planes
|
||||
local transportplane=group:HasAttribute("Transports") and group:HasAttribute("Planes")
|
||||
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 fighter=group:HasAttribute("Fighters") or group:HasAttribute("Interceptors") or group:HasAttribute("Multirole fighters")
|
||||
local bomber=group:HasAttribute("Bombers")
|
||||
|
||||
local tanker=group:HasAttribute("Tankers")
|
||||
-- Helicopters
|
||||
local transporthelo=group:HasAttribute("Transport helicopters")
|
||||
local attackhelicopter=group:HasAttribute("Attack helicopters")
|
||||
|
||||
|
||||
--------------
|
||||
--- Ground ---
|
||||
--------------
|
||||
-- Ground
|
||||
local transportapc=group:HasAttribute("Infantry carriers")
|
||||
local artillery=group:HasAttribute("Artillery")
|
||||
local infantry=group:HasAttribute("Infantry")
|
||||
local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks")
|
||||
local apc=group:HasAttribute("Infantry carriers")
|
||||
local truck=group:HasAttribute("Trucks") and not group:GetCategory()==Group.Category.TRAIN
|
||||
|
||||
-- Naval
|
||||
local aircraftcarrier=group:HasAttribute("Aircraft Carriers")
|
||||
local warship=group:HasAttribute("Armed ships")
|
||||
local ship=group:HasAttribute("Ships")
|
||||
|
||||
local infantry=group:HasAttribute("Infantry")
|
||||
local artillery=group:HasAttribute("Artillery")
|
||||
local tank=group:HasAttribute("Old Tanks") or group:HasAttribute("Modern Tanks")
|
||||
-- Train
|
||||
local train=group:GetCategory()==Group.Category.TRAIN
|
||||
|
||||
-------------
|
||||
--- Naval ---
|
||||
-------------
|
||||
-- Ships
|
||||
local aircraftcarrier=group:HasAttribute("Aircraft Carriers")
|
||||
local warship=group:HasAttribute("Heavy armed ships")
|
||||
local armedship=group:HasAttribute("Armed ships")
|
||||
local unarmedship=group:HasAttribute("Unarmed ships")
|
||||
|
||||
|
||||
-- Define attribute. Order is important.
|
||||
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
|
||||
attribute=WAREHOUSE.Attribute.AIR_TRANSPORTPLANE
|
||||
elseif awacs then
|
||||
attribute=WAREHOUSE.Attribute.AWACS
|
||||
attribute=WAREHOUSE.Attribute.AIR_AWACS
|
||||
elseif fighter then
|
||||
attribute=WAREHOUSE.Attribute.AIR_FIGHTER
|
||||
elseif bomber then
|
||||
attribute=WAREHOUSE.Attribute.BOMBER
|
||||
elseif artillery then
|
||||
attribute=WAREHOUSE.Attribute.ARTILLERY
|
||||
elseif infantry then
|
||||
attribute=WAREHOUSE.Attribute.INFANTRY
|
||||
elseif attackhelicopter then
|
||||
attribute=WAREHOUSE.Attribute.ATTACKHELICOPTER
|
||||
elseif tank then
|
||||
attribute=WAREHOUSE.Attribute.TANK
|
||||
attribute=WAREHOUSE.Attribute.AIR_BOMBER
|
||||
elseif tanker then
|
||||
attribute=WAREHOUSE.Attribute.AIR_TANKER
|
||||
elseif transporthelo then
|
||||
attribute=WAREHOUSE.Attribute.AIR_TRANSPORTHELO
|
||||
elseif apc then
|
||||
attribute=WAREHOUSE.Attribute.GROUND_APC
|
||||
elseif truck then
|
||||
attribute=WAREHOUSE.Attribute.TRUCK
|
||||
attribute=WAREHOUSE.Attribute.GROUND_TRUCK
|
||||
elseif infantry then
|
||||
attribute=WAREHOUSE.Attribute.GROUND_INFANTRY
|
||||
elseif artillery then
|
||||
attribute=WAREHOUSE.Attribute.GROUND_ARTILLERY
|
||||
elseif tank then
|
||||
attribute=WAREHOUSE.Attribute.GROUND_TANK
|
||||
elseif train then
|
||||
attribute=WAREHOUSE.Attribute.TRAIN
|
||||
attribute=WAREHOUSE.Attribute.GROUND_TRAIN
|
||||
elseif aircraftcarrier then
|
||||
attribute=WAREHOUSE.Attribute.NAVAL_AIRCRAFTCARRIER
|
||||
elseif warship then
|
||||
attribute=WAREHOUSE.Attribute.NAVAL_WARSHIP
|
||||
elseif armedship then
|
||||
attribute=WAREHOUSE.Attribute.NAVAL_ARMEDSHIP
|
||||
elseif unarmedship then
|
||||
attribute=WAREHOUSE.Attribute.NAVAL_UNARMEDSHIP
|
||||
else
|
||||
attribute=WAREHOUSE.Attribute.OTHER
|
||||
attribute=WAREHOUSE.Attribute.UNKNOWN
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user