--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. -- @module DEPLOYTASK --- A DeployTask -- @type DEPLOYTASK DEPLOYTASK = { ClassName = "DEPLOYTASK", TEXT = { "Deploy", "deployed", "unloaded" }, GoalVerb = "Deployment" } --- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. -- @function [parent=#DEPLOYTASK] New -- @param #string CargoType Type of the Cargo. -- @return #DEPLOYTASK The created DeployTask function DEPLOYTASK:New( CargoType ) local self = BASE:Inherit( self, TASK:New() ) self:F() local Valid = true if Valid then self.Name = 'Deploy Cargo' self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." self.CargoType = CargoType self.GoalVerb = CargoType .. " " .. self.GoalVerb self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } self.SetStage( self, 1 ) end return self end function DEPLOYTASK:ToZone( LandingZone ) self:F() self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone return self end function DEPLOYTASK:InitCargo( InitCargos ) self:F( { InitCargos } ) if type( InitCargos ) == "table" then self.Cargos.InitCargos = InitCargos else self.Cargos.InitCargos = { InitCargos } end return self end function DEPLOYTASK:LoadCargo( LoadCargos ) self:F( { LoadCargos } ) if type( LoadCargos ) == "table" then self.Cargos.LoadCargos = LoadCargos else self.Cargos.LoadCargos = { LoadCargos } end return self end --- When the cargo is unloaded, it will move to the target zone name. -- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) self:F() local Valid = true Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) if Valid then self.TargetZoneName = TargetZoneName end return Valid end function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) self:F() local ClientGroupID = Client:GetClientGroupID() self:T( ClientGroupID ) for CargoID, Cargo in pairs( Cargos ) do self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then if Client._Menus[Cargo.CargoType] == nil then Client._Menus[Cargo.CargoType] = {} end if not Client._Menus[Cargo.CargoType].DeployMenu then Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( ClientGroupID, self.TEXT[1] .. " " .. Cargo.CargoType, nil ) self:T( 'Added DeployMenu ' .. self.TEXT[1] ) end if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then Client._Menus[Cargo.CargoType].DeploySubMenus = {} end if Client._Menus[Cargo.CargoType].DeployMenu == nil then self:T( 'deploymenu is nil' ) end Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( ClientGroupID, Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", Client._Menus[Cargo.CargoType].DeployMenu, self.MenuAction, { ReferenceTask = self, CargoTask = Cargo } ) self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) end end end function DEPLOYTASK:RemoveCargoMenus( Client ) self:F() local ClientGroupID = Client:GetClientGroupID() self:T( ClientGroupID ) for MenuID, MenuData in pairs( Client._Menus ) do if MenuData.DeploySubMenus ~= nil then for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) self:T( "Removed DeploySubMenu " ) SubMenuData = nil end end if MenuData.DeployMenu then missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) self:T( "Removed DeployMenu " ) MenuData.DeployMenu = nil end end end