From df909553475e6c5dc8cebb83cffb8ea40d33eb88 Mon Sep 17 00:00:00 2001 From: Sven Van de Velde Date: Mon, 8 Aug 2016 11:16:50 +0200 Subject: [PATCH] Progress --- Moose Development/Moose/Cargo.lua | 677 ++++++++++-------- Moose Development/Moose/Point.lua | 2 +- Moose Development/Moose/StateMachine.lua | 7 + .../MOOSE_Test_CARGO_PACKAGE_Board.miz | Bin 0 -> 17588 bytes .../Moose_Test_CARGO_PACKAGE_Board.lua | 13 + .../MOOSE_Test_CARGO_PACKAGE_UnBoard.miz} | Bin 17597 -> 17592 bytes .../Moose_Test_CARGO_PACKAGE_UnBoard.lua} | 2 +- .../MOOSE_Test_CARGO_UNIT_Board.miz} | Bin .../Moose_Test_CARGO_UNIT_Board.lua} | 0 .../MOOSE_Test_CARGO_UNIT_UnBoard.miz | Bin 0 -> 17592 bytes .../Moose_Test_CARGO_UNIT_UnBoard.lua | 15 + 11 files changed, 418 insertions(+), 298 deletions(-) create mode 100644 Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/MOOSE_Test_CARGO_PACKAGE_Board.miz create mode 100644 Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/Moose_Test_CARGO_PACKAGE_Board.lua rename Moose Test Missions/Moose_Test_CARGO/{Moose_Test_CARGO_UnBoard/MOOSE_Test_CARGO_UnBoard.miz => Moose_Test_CARGO_PACKAGE_UnBoard/MOOSE_Test_CARGO_PACKAGE_UnBoard.miz} (73%) rename Moose Test Missions/Moose_Test_CARGO/{Moose_Test_CARGO_UnBoard/Moose_Test_CARGO_UnBoard.lua => Moose_Test_CARGO_PACKAGE_UnBoard/Moose_Test_CARGO_PACKAGE_UnBoard.lua} (94%) rename Moose Test Missions/Moose_Test_CARGO/{Moose_Test_CARGO_Board/MOOSE_Test_CARGO_Board.miz => Moose_Test_CARGO_UNIT_Board/MOOSE_Test_CARGO_UNIT_Board.miz} (100%) rename Moose Test Missions/Moose_Test_CARGO/{Moose_Test_CARGO_Board/Moose_Test_CARGO_Board.lua => Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua} (100%) create mode 100644 Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/MOOSE_Test_CARGO_UNIT_UnBoard.miz create mode 100644 Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/Moose_Test_CARGO_UNIT_UnBoard.lua diff --git a/Moose Development/Moose/Cargo.lua b/Moose Development/Moose/Cargo.lua index edcfa94b1..cb0b4ab66 100644 --- a/Moose Development/Moose/Cargo.lua +++ b/Moose Development/Moose/Cargo.lua @@ -72,7 +72,7 @@ function CARGO:New( Mission, Type, Name, Weight, ReportRadius, NearRadius ) self.Weight = Weight self.ReportRadius = ReportRadius self.NearRadius = NearRadius - self.CargoObjects = nil + self.CargoObject = nil self.CargoCarrier = nil self.Representable = false self.Slingloadable = false @@ -96,46 +96,49 @@ function CARGO:Spawn( PointVec2 ) end ---- Board Cargo to a Carrier with a defined Speed. --- @param #CARGO self --- @param Unit#UNIT CargoCarrier --- @param #number Speed -function CARGO:Board( CargoCarrier, Speed ) - self:F() - - self:_NextEvent( self.FsmP.Board, CargoCarrier, Speed ) -end - ---- UnBoard Cargo from a Carrier with a defined Speed. --- @param #CARGO self --- @param Unit#UNIT CargoCarrier --- @param #number Speed -function CARGO:UnBoard( Speed, Distance, Angle ) - self:F() - - self:_NextEvent( self.FsmP.UnBoard, Speed, Distance, Angle ) -end - --- Load Cargo to a Carrier. -- @param #CARGO self -- @param Unit#UNIT CargoCarrier --- @param #number Speed function CARGO:Load( CargoCarrier ) self:F() self:_NextEvent( self.FsmP.Load, CargoCarrier ) end ---- UnLoad Cargo from a Carrier. +--- UnLoad Cargo from a Carrier with a UnLoadDistance and an Angle. +-- @param #CARGO self +-- @param #number UnLoadDistance +-- @param #number Angle +function CARGO:UnLoad( CargoCarrier ) + self:F() + + self:_NextEvent( self.FsmP.Board, CargoCarrier ) +end + +--- Board Cargo to a Carrier with a defined Speed. -- @param #CARGO self -- @param Unit#UNIT CargoCarrier -- @param #number Speed -function CARGO:UnLoad() +-- @param #number BoardDistance +-- @param #number Angle +function CARGO:Board( CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) self:F() - self:_NextEvent( self.FsmP.UnLoad ) + self:_NextEvent( self.FsmP.Board, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) end +--- UnBoard Cargo from a Carrier with a defined Speed. +-- @param #CARGO self +-- @param #number Speed +-- @param #number UnLoadDistance +-- @param #number UnBoardDistance +-- @param #number UnBoardRadius +-- @param #number Angle +function CARGO:UnBoard( Speed, UnLoadDistance, UnBoardDistance, UnBoardRadius, Angle ) + self:F() + + self:_NextEvent( self.FsmP.UnBoard, Speed, UnLoadDistance, UnBoardDistance, UnBoardRadius, Angle ) +end --- Check if CargoCarrier is near the Cargo to be Loaded. -- @param #CARGO self @@ -167,8 +170,7 @@ end function CARGO:OnLoaded( FsmP, Event, From, To, CargoCarrier ) self:F() - self.CargoCarrier = CargoCarrier - self:T( "Cargo " .. self.Name .. " loaded in " .. self.CargoCarrier:GetName() ) + self:T( "Cargo " .. self.Name .. " loaded in " .. CargoCarrier:GetName() ) end --- UnLoaded State. @@ -189,6 +191,12 @@ function CARGO:_NextEvent( NextEvent, ... ) SCHEDULER:New( self.FsmP, NextEvent, arg, 1 ) -- This schedules the next event, but only if scheduling is activated. end +--- @param #CARGO self +function CARGO:_Next( NextEvent, ... ) + self:F( self.Name ) + self.FsmP.NextEvent( self, unpack(arg) ) -- This calls the next event... +end + end do -- CARGO_REPRESENTABLE @@ -213,20 +221,52 @@ function CARGO_REPRESENTABLE:New( Mission, CargoObject, Type, Name, Weight, Repo local self = BASE:Inherit( self, CARGO:New( Mission, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) - self:T( CargoObject ) - self.CargoObject = CargoObject - self.FsmP = STATEMACHINE_PROCESS:New( self, { + + + return self +end + + + +end + +do -- CARGO_UNIT + + --- @type CARGO_UNIT + -- @extends #CARGO_REPRESENTABLE + CARGO_UNIT = { + ClassName = "CARGO_UNIT" + } + +--- CARGO_UNIT Constructor. +-- @param #CARGO_UNIT self +-- @param Mission#MISSION Mission +-- @param Unit#UNIT CargoUnit +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #CARGO_UNIT +function CARGO_UNIT:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoUnit ) + self.CargoObject = CargoUnit + + self.FsmP = STATEMACHINE_PROCESS:New( self, { initial = 'UnLoaded', events = { - { name = 'Board', from = 'UnLoaded', to = 'Boarding' }, - { name = 'Boarded', from = 'Boarding', to = 'Boarding' }, - { name = 'Load', from = 'Boarding', to = 'Loaded' }, - { name = 'Load', from = 'UnLoaded', to = 'Loaded' }, - { name = 'UnBoard', from = 'Loaded', to = 'UnBoarding' }, - { name = 'UnBoarded', from = 'UnBoarding', to = 'UnBoarding' }, - { name = 'UnLoad', from = 'UnBoarding', to = 'UnLoaded' }, - { name = 'UnLoad', from = 'Loaded', to = 'UnLoaded' }, + { name = 'Board', from = 'UnLoaded', to = 'Boarding' }, + { name = 'Boarded', from = 'Boarding', to = 'Boarding' }, + { name = 'Load', from = 'Boarding', to = 'Loaded' }, + { name = 'Load', from = 'UnLoaded', to = 'Loaded' }, + { name = 'UnBoard', from = 'Loaded', to = 'UnBoarding' }, + { name = 'UnBoarded', from = 'UnBoarding', to = 'UnBoarding' }, + { name = 'UnLoad', from = 'UnBoarding', to = 'UnLoaded' }, + { name = 'UnLoad', from = 'Loaded', to = 'UnLoaded' }, }, callbacks = { onBoard = self.OnBoard, @@ -239,19 +279,20 @@ function CARGO_REPRESENTABLE:New( Mission, CargoObject, Type, Name, Weight, Repo onUnLoaded = self.OnUnLoaded, }, } ) - + + self:T( self.ClassName ) return self end --- Board Event. --- @param #CARGO_REPRESENTABLE self +-- @param #CARGO_UNIT self -- @param StateMachine#STATEMACHINE_PROCESS FsmP -- @param #string Event -- @param #string From -- @param #string To -- @param Unit#UNIT CargoCarrier -function CARGO_REPRESENTABLE:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed ) +function CARGO_UNIT:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed ) self:F() self.CargoInAir = self.CargoObject:InAir() @@ -280,13 +321,13 @@ function CARGO_REPRESENTABLE:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed end --- Boarded Event. --- @param #CARGO self +-- @param #CARGO_UNIT self -- @param StateMachine#STATEMACHINE_PROCESS FsmP -- @param #string Event -- @param #string From -- @param #string To -- @param Unit#UNIT CargoCarrier -function CARGO_REPRESENTABLE:OnBoarded( FsmP, Event, From, To, CargoCarrier ) +function CARGO_UNIT:OnBoarded( FsmP, Event, From, To, CargoCarrier ) self:F() if self:IsNear( CargoCarrier ) then @@ -297,13 +338,17 @@ function CARGO_REPRESENTABLE:OnBoarded( FsmP, Event, From, To, CargoCarrier ) end --- UnBoard Event. --- @param #CARGO_REPRESENTABLE self +-- @param #CARGO_UNIT self -- @param StateMachine#STATEMACHINE_PROCESS FsmP -- @param #string Event -- @param #string From -- @param #string To --- @param Unit#UNIT CargoCarrier -function CARGO_REPRESENTABLE:OnUnBoard( FsmP, Event, From, To, Speed, Distance, Angle ) +-- @param #number Speed +-- @param #number UnLoadDistance +-- @param #number UnBoardDistance +-- @param #number Radius +-- @param #number Angle +function CARGO_UNIT:OnUnBoard( FsmP, Event, From, To, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) self:F() self.CargoInAir = self.CargoObject:InAir() @@ -313,293 +358,333 @@ function CARGO_REPRESENTABLE:OnUnBoard( FsmP, Event, From, To, Speed, Distance, -- Only unboard the cargo when the carrier is not in the air. -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). if not self.CargoInAir then - - if self.FsmP:is( "UnLoading" ) then - self:_NextEvent( FsmP.UnLoad, 3, Angle ) - self:_NextEvent( FsmP.UnBoard, Speed, Distance, Angle ) - else - local Points = {} - - local StartPointVec2 = self.CargoCarrier:GetPointVec2() - local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. - local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) - self:T( { CargoCarrierHeading, CargoDeployHeading } ) - local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) - local CargoDeployPointVec2 = CargoDeployPointVec2:GetRandomPointVec2InRadius( self.NearRadius ) - - Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) - Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) - - local TaskRoute = self.CargoObject:TaskRoute( Points ) - self.CargoObject:SetTask( TaskRoute, 1 ) - end + end + self:_NextEvent( FsmP.UnBoarded, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) end ---- Load Event. --- @param #CARGO self +--- UnBoarded Event. +-- @param #CARGO_UNIT self -- @param StateMachine#STATEMACHINE_PROCESS FsmP -- @param #string Event -- @param #string From -- @param #string To -- @param Unit#UNIT CargoCarrier -function CARGO_REPRESENTABLE:OnLoad( FsmP, Event, From, To, CargoCarrier ) +function CARGO_UNIT:OnUnBoarded( FsmP, Event, From, To, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) self:F() + self:_NextEvent( FsmP.UnLoad, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) +end + + +--- Load Event. +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Unit#UNIT CargoCarrier +function CARGO_UNIT:OnLoad( FsmP, Event, From, To, CargoCarrier ) + self:F() + + self:T( self.ClassName ) + self.CargoCarrier = CargoCarrier - self.CargoObject:Destroy() + + -- Only destroy the CargoObject is if there is a CargoObject (packages don't have CargoObjects). + if self.CargoObject then + self.CargoObject:Destroy() + end end --- UnLoad Event. --- @param #CARGO self +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Distance +-- @param #number Angle +function CARGO_UNIT:OnUnLoad( FsmP, Event, From, To, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) + self:F() + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( UnLoadDistance, CargoDeployHeading ) + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) + + local Points = {} + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = StartPointVec2:Translate( UnBoardDistance, CargoDeployHeading ) + local CargoDeployPointVec2 = CargoDeployPointVec2:GetRandomPointVec2InRadius( Radius ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 4 ) + end +end + +end + +do -- CARGO_PACKAGE + + --- @type CARGO_PACKAGE + -- @extends #CARGO_REPRESENTABLE + CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" + } + +--- CARGO_PACKAGE Constructor. +-- @param #CARGO_PACKAGE self +-- @param Mission#MISSION Mission +-- @param Unit#UNIT CargoCarrier The UNIT carrying the package. +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #CARGO_PACKAGE +function CARGO_PACKAGE:New( Mission, CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( Mission, CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoCarrier ) + self.CargoCarrier = CargoCarrier + + self.FsmP = STATEMACHINE_PROCESS:New( self, { + initial = 'UnLoaded', + events = { + { name = 'Board', from = 'UnLoaded', to = 'Boarding' }, + { name = 'Boarded', from = 'Boarding', to = 'Boarding' }, + { name = 'Load', from = 'Boarding', to = 'Loaded' }, + { name = 'Load', from = 'UnLoaded', to = 'Loaded' }, + { name = 'UnBoard', from = 'Loaded', to = 'UnBoarding' }, + { name = 'UnBoarded', from = 'UnBoarding', to = 'UnBoarding' }, + { name = 'UnLoad', from = 'UnBoarding', to = 'UnLoaded' }, + { name = 'UnLoad', from = 'Loaded', to = 'UnLoaded' }, + }, + callbacks = { + onBoard = self.OnBoard, + onBoarded = self.OnBoarded, + onLoad = self.OnLoad, + onUnBoard = self.OnUnBoard, + onUnBoarded = self.OnUnBoarded, + onUnLoad = self.OnUnLoad, + onLoaded = self.OnLoaded, + onUnLoaded = self.OnUnLoaded, + }, + } ) + + return self +end + +--- Board Event. +-- @param #CARGO_PACKAGE self -- @param StateMachine#STATEMACHINE_PROCESS FsmP -- @param #string Event -- @param #string From -- @param #string To -- @param Unit#UNIT CargoCarrier -function CARGO_REPRESENTABLE:OnUnLoad( FsmP, Event, From, To, Distance, Angle ) +-- @param #number Speed +-- @param #number BoardDistance +-- @param #number Angle +function CARGO_PACKAGE:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only move the CargoCarrier to the New CargoCarrier when the New CargoCarrier is not in the air. + if not self.CargoInAir then + + local Points = {} + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = CargoCarrier:GetPointVec2():Translate( BoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:_NextEvent( FsmP.Boarded, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + +end + +--- Check if CargoCarrier is near the Cargo to be Loaded. +-- @param #CARGO_PACKAGE self +-- @param Unit#UNIT CargoCarrier +-- @return #boolean +function CARGO_PACKAGE:IsNear( CargoCarrier ) + self:F() + + local CargoCarrierPoint = CargoCarrier:GetPointVec2() + + local Distance = CargoCarrierPoint:DistanceFromPointVec2( self.CargoCarrier:GetPointVec2() ) + self:T( Distance ) + + if Distance <= self.NearRadius then + return true + else + return false + end +end + +--- Boarded Event. +-- @param #CARGO_PACKAGE self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Unit#UNIT CargoCarrier +function CARGO_PACKAGE:OnBoarded( FsmP, Event, From, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:_NextEvent( FsmP.Load, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + else + self:_NextEvent( FsmP.Boarded, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + end +end + +--- UnBoard Event. +-- @param #CARGO_PACKAGE self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Speed +-- @param #number UnLoadDistance +-- @param #number UnBoardDistance +-- @param #number Radius +-- @param #number Angle +function CARGO_PACKAGE:OnUnBoard( FsmP, Event, From, To, CargoCarrier, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only unboard the cargo when the carrier is not in the air. + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + self:_Next( self.FsmP.UnLoad, UnLoadDistance, Angle ) + + local Points = {} + + local StartPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = StartPointVec2:Translate( UnBoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = CargoCarrier:TaskRoute( Points ) + CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:_NextEvent( FsmP.UnBoarded, CargoCarrier, Speed ) + +end + +--- UnBoarded Event. +-- @param #CARGO_PACKAGE self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Unit#UNIT CargoCarrier +function CARGO_PACKAGE:OnUnBoarded( FsmP, Event, From, To, CargoCarrier, Speed ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:_NextEvent( FsmP.UnLoad, CargoCarrier, Speed ) + else + self:_NextEvent( FsmP.UnBoarded, CargoCarrier, Speed ) + end +end + +--- Load Event. +-- @param #CARGO_PACKAGE self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Unit#UNIT CargoCarrier +-- @param #number Speed +-- @param #number LoadDistance +-- @param #number Angle +function CARGO_PACKAGE:OnLoad( FsmP, Event, From, To, CargoCarrier, Speed, LoadDistance, Angle ) + self:F() + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( LoadDistance, CargoDeployHeading ) + + self.CargoCarrier = CargoCarrier + + local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + +end + +--- UnLoad Event. +-- @param #CARGO_PACKAGE self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Distance +-- @param #number Angle +function CARGO_PACKAGE:OnUnLoad( FsmP, Event, From, To, CargoCarrier, Speed, Distance, Angle ) self:F() local StartPointVec2 = self.CargoCarrier:GetPointVec2() local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) - - -- Respawn the group... - self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) -end - -end - -do -- CARGO_UNIT - - --- @type CARGO_UNIT - -- @extends #CARGO_REPRESENTABLE - CARGO_UNIT = { - ClassName = "CARGO_UNIT" - } - ---- CARGO_UNIT Constructor. --- @param #CARGO_UNIT self --- @param Mission#MISSION Mission --- @param Unit#UNIT CargoUnit --- @param #string Type --- @param #string Name --- @param #number Weight --- @param #number ReportRadius (optional) --- @param #number NearRadius (optional) --- @return #CARGO_UNIT -function CARGO_UNIT:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) - local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO - self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) - - return self -end - -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() + + self.CargoCarrier = CargoCarrier local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) end -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded end -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - CARGO_SLINGLOAD = { ClassName = "CARGO_SLINGLOAD" diff --git a/Moose Development/Moose/Point.lua b/Moose Development/Moose/Point.lua index d2223ad14..e21e1fc5a 100644 --- a/Moose Development/Moose/Point.lua +++ b/Moose Development/Moose/Point.lua @@ -224,7 +224,7 @@ end function POINT_VEC3:GetRandomPointVec2InRadius( OuterRadius, InnerRadius ) self:F2( { OuterRadius, InnerRadius } ) - return POINT_VEC2:NewFromVec2( self:GetRandomPointVec2InRadius( OuterRadius, InnerRadius ) ) + return POINT_VEC2:NewFromVec2( self:GetRandomVec2InRadius( OuterRadius, InnerRadius ) ) end --- Return a random Vec3 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. diff --git a/Moose Development/Moose/StateMachine.lua b/Moose Development/Moose/StateMachine.lua index 23ef36db1..c597cadff 100644 --- a/Moose Development/Moose/StateMachine.lua +++ b/Moose Development/Moose/StateMachine.lua @@ -67,6 +67,13 @@ function STATEMACHINE:New( options ) return self end +function STATEMACHINE:LoadCallBacks( CallBackTable ) + + for name, callback in pairs( CallBackTable or {} ) do + self[name] = callback + end + +end function STATEMACHINE:_submap( subs, sub, name ) self:E( { sub = sub, name = name } ) diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/MOOSE_Test_CARGO_PACKAGE_Board.miz b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/MOOSE_Test_CARGO_PACKAGE_Board.miz new file mode 100644 index 0000000000000000000000000000000000000000..0def4c99fdd848981c213a82d88cff8dc41589c1 GIT binary patch literal 17588 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 N|21Hm-{J`30RVizsoDSl literal 0 HcmV?d00001 diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/Moose_Test_CARGO_PACKAGE_Board.lua b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/Moose_Test_CARGO_PACKAGE_Board.lua new file mode 100644 index 000000000..773a96c7a --- /dev/null +++ b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_Board/Moose_Test_CARGO_PACKAGE_Board.lua @@ -0,0 +1,13 @@ + +local Mission = MISSION:New( "Pickup Cargo", "High", "Test for Cargo Pickup", coalition.side.RED ) + +local DeliveryUnit = UNIT:FindByName( "Delivery" ) +local Letter = CARGO_PACKAGE:New( Mission, DeliveryUnit, "Letter", "Secret Orders", "0.3", 2000, 25 ) + +local CargoCarrier = UNIT:FindByName( "Carrier" ) + +-- This call will make the Cargo run to the CargoCarrier. +-- Upon arrival at the CargoCarrier, the Cargo will be Loaded into the Carrier. +-- This process is now fully automated. +Letter:Board( CargoCarrier, 40, 3, 25, 90 ) + diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UnBoard/MOOSE_Test_CARGO_UnBoard.miz b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_UnBoard/MOOSE_Test_CARGO_PACKAGE_UnBoard.miz similarity index 73% rename from Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UnBoard/MOOSE_Test_CARGO_UnBoard.miz rename to Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_UnBoard/MOOSE_Test_CARGO_PACKAGE_UnBoard.miz index cde3f57847f1e4367260eac0af5aa1740c950b34..ce5bc6adc02d356f239723e500be4cf71a736803 100644 GIT binary patch delta 4091 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 diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UnBoard/Moose_Test_CARGO_UnBoard.lua b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_UnBoard/Moose_Test_CARGO_PACKAGE_UnBoard.lua similarity index 94% rename from Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UnBoard/Moose_Test_CARGO_UnBoard.lua rename to Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_UnBoard/Moose_Test_CARGO_PACKAGE_UnBoard.lua index 88ebd7573..259cdc968 100644 --- a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UnBoard/Moose_Test_CARGO_UnBoard.lua +++ b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_PACKAGE_UnBoard/Moose_Test_CARGO_PACKAGE_UnBoard.lua @@ -12,4 +12,4 @@ InfantryCargo:Load( CargoCarrier ) -- This will Unboard the Cargo from the Carrier. -- The Cargo will run from the Carrier to a point in the NearRadius around the Carrier. -- Unboard the Cargo with a speed of 10 km/h, go to 200 meters 180 degrees from the Carrier, iin a zone of 25 meters (NearRadius). -InfantryCargo:UnBoard( 10, 200, 180 ) \ No newline at end of file +InfantryCargo:UnBoard( 10, 2, 20, 10, 180 ) \ No newline at end of file diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_Board/MOOSE_Test_CARGO_Board.miz b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/MOOSE_Test_CARGO_UNIT_Board.miz similarity index 100% rename from Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_Board/MOOSE_Test_CARGO_Board.miz rename to Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/MOOSE_Test_CARGO_UNIT_Board.miz diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_Board/Moose_Test_CARGO_Board.lua b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua similarity index 100% rename from Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_Board/Moose_Test_CARGO_Board.lua rename to Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/MOOSE_Test_CARGO_UNIT_UnBoard.miz b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/MOOSE_Test_CARGO_UNIT_UnBoard.miz new file mode 100644 index 0000000000000000000000000000000000000000..ce5bc6adc02d356f239723e500be4cf71a736803 GIT binary patch literal 17592 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 O_4})}cM1Hzfp`EgUcX2H literal 0 HcmV?d00001 diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/Moose_Test_CARGO_UNIT_UnBoard.lua b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/Moose_Test_CARGO_UNIT_UnBoard.lua new file mode 100644 index 000000000..259cdc968 --- /dev/null +++ b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_UnBoard/Moose_Test_CARGO_UNIT_UnBoard.lua @@ -0,0 +1,15 @@ + +local Mission = MISSION:New( "Pickup Cargo", "High", "Test for Cargo Pickup", coalition.side.RED ) + +local CargoEngineer = UNIT:FindByName( "Engineer" ) +local InfantryCargo = CARGO_UNIT:New( Mission, CargoEngineer, "Engineer", "Engineer Sven", "81", 2000, 25 ) + +local CargoCarrier = UNIT:FindByName( "Carrier" ) + +-- This will Load the Cargo into the Carrier, regardless where the Cargo is. +InfantryCargo:Load( CargoCarrier ) + +-- This will Unboard the Cargo from the Carrier. +-- The Cargo will run from the Carrier to a point in the NearRadius around the Carrier. +-- Unboard the Cargo with a speed of 10 km/h, go to 200 meters 180 degrees from the Carrier, iin a zone of 25 meters (NearRadius). +InfantryCargo:UnBoard( 10, 2, 20, 10, 180 ) \ No newline at end of file