From bdbb1ea01834da49bb744f24cae1cdca97b23b19 Mon Sep 17 00:00:00 2001 From: Sven Van de Velde Date: Thu, 11 Aug 2016 09:01:47 +0200 Subject: [PATCH] Progress --- Moose Development/Moose/Cargo.lua | 286 ++++++++++++------ Moose Development/Moose/Point.lua | 49 ++- .../MOOSE_Test_CARGO_UNIT_Board.miz | Bin 16744 -> 16851 bytes .../Moose_Test_CARGO_UNIT_Board.lua | 4 +- .../MOOSE_Test_CARGO_UNIT_UnBoard.miz | Bin 17592 -> 17532 bytes .../Moose_Test_CARGO_UNIT_UnBoard.lua | 6 +- 6 files changed, 217 insertions(+), 128 deletions(-) diff --git a/Moose Development/Moose/Cargo.lua b/Moose Development/Moose/Cargo.lua index ac0c669e8..07dde6240 100644 --- a/Moose Development/Moose/Cargo.lua +++ b/Moose Development/Moose/Cargo.lua @@ -118,38 +118,28 @@ end --- Board Cargo to a Carrier with a defined Speed. -- @param #CARGO self -- @param Unit#UNIT CargoCarrier --- @param #number Speed --- @param #number BoardDistance --- @param #number Angle -function CARGO:Board( CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) +function CARGO:Board( CargoCarrier ) self:F() - self:_NextEvent( self.FsmP.Board, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:_NextEvent( self.FsmP.Board, CargoCarrier ) end ---- UnBoard Cargo from a Carrier with a defined Speed. +--- UnLoad Cargo from a Carrier. -- @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 ) +function CARGO:UnLoad() self:F() - self:_NextEvent( self.FsmP.UnBoard, Speed, UnLoadDistance, UnBoardDistance, UnBoardRadius, Angle ) + self:_NextEvent( self.FsmP.UnLoad ) end --- Check if CargoCarrier is near the Cargo to be Loaded. -- @param #CARGO self --- @param Unit#UNIT CargoCarrier +-- @param Point#POINT_VEC2 PointVec2 -- @return #boolean -function CARGO:IsNear( CargoCarrier ) +function CARGO:IsNear( PointVec2 ) self:F() - local CargoCarrierPoint = CargoCarrier:GetPointVec2() - - local Distance = CargoCarrierPoint:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) + local Distance = PointVec2:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) self:T( Distance ) if Distance <= self.NearRadius then @@ -260,23 +250,22 @@ function CARGO_UNIT:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, N initial = 'UnLoaded', events = { { name = 'Board', from = 'UnLoaded', to = 'Boarding' }, - { name = 'Boarded', from = 'Boarding', to = 'Boarding' }, { name = 'Load', from = 'Boarding', to = 'Loaded' }, + { name = 'UnLoad', from = 'Loaded', to = 'UnBoarding' }, + { name = 'UnBoard', from = 'UnBoarding', to = 'UnLoaded' }, { 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, + onenterBoarding = self.EnterStateBoarding, + onleaveBoarding = self.LeaveStateBoarding, + onenterLoaded = self.EnterStateLoaded, + onenterUnBoarding = self.EnterStateUnBoarding, + onleaveUnBoarding = self.LeaveStateUnBoarding, + onenterUnLoaded = self.EnterStateUnLoaded, }, } ) @@ -285,14 +274,182 @@ function CARGO_UNIT:New( Mission, CargoUnit, Type, Name, Weight, ReportRadius, N return self end ---- Board Event. +--- Enter UnBoarding State. +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Point#POINT_VEC2 ToPointVec2 +function CARGO_UNIT:EnterStateUnBoarding( FsmP, Event, From, To, ToPointVec2 ) + self:F() + + local Angle = 180 + local Speed = 10 + local DeployDistance = 5 + local RouteDistance = 60 + + if From == "Loaded" then + + local CargoCarrierPointVec2 = 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 = CargoCarrierPointVec2:Translate( DeployDistance, CargoDeployHeading ) + local CargoRoutePointVec2 = CargoCarrierPointVec2:Translate( RouteDistance, CargoDeployHeading ) + + if not ToPointVec2 then + ToPointVec2 = CargoRoutePointVec2 + end + + local FromPointVec2 = CargoCarrierPointVec2 + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) + self.CargoCarrier = nil + + local Points = {} + Points[#Points+1] = FromPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = ToPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 1 ) + end + end + +end + +--- Leave UnBoarding State. +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Point#POINT_VEC2 ToPointVec2 +function CARGO_UNIT:LeaveStateUnBoarding( FsmP, Event, From, To, ToPointVec2 ) + self:F() + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + if self:IsNear( ToPointVec2 ) then + return true + else + self:_NextEvent( FsmP.UnLoad, ToPointVec2 ) + end + return false + end + +end + +--- Enter UnLoaded State. +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_UNIT:EnterStateUnLoaded( FsmP, Event, From, To, ToPointVec2 ) + self:F() + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "Loaded" then + 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... + if self.CargoObject then + self.CargoObject:ReSpawn( ToPointVec2:GetVec3(), 0 ) + self.CargoCarrier = nil + end + end + +end + + + +--- Enter Boarding State. -- @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:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed ) +function CARGO_UNIT:EnterStateBoarding( FsmP, Event, From, To, CargoCarrier ) + self:F() + + local Speed = 10 + local Angle = 180 + local Distance = 5 + + if From == "UnLoaded" then + local CargoCarrierPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( Distance, CargoDeployHeading ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 2 ) + end +end + +--- Leave Boarding State. +-- @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:LeaveStateBoarding( FsmP, Event, From, To, CargoCarrier ) + self:F() + + if self:IsNear( CargoCarrier:GetPointVec2() ) then + return true + else + self:_NextEvent( FsmP.Load, CargoCarrier ) + end + return false +end + +--- Loaded State. +-- @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:EnterStateLoaded( FsmP, Event, From, To, CargoCarrier ) + self:F() + + self.CargoCarrier = CargoCarrier + + -- Only destroy the CargoObject is if there is a CargoObject (packages don't have CargoObjects). + if self.CargoObject then + self.CargoObject:Destroy() + end +end + + +--- Board Event. +-- @param #CARGO_UNIT self +-- @param StateMachine#STATEMACHINE_PROCESS FsmP +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_UNIT:OnBoard( FsmP, Event, From, To, CargoCarrier ) self:F() self.CargoInAir = self.CargoObject:InAir() @@ -302,21 +459,9 @@ function CARGO_UNIT:OnBoard( FsmP, Event, From, To, CargoCarrier, Speed ) -- Only move the group to the carrier when the cargo 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 - - local Points = {} - - local PointStartVec2 = self.CargoObject:GetPointVec2() - local PointEndVec2 = CargoCarrier:GetPointVec2() - - - Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) - Points[#Points+1] = PointEndVec2:RoutePointGround( Speed ) - - local TaskRoute = self.CargoObject:TaskRoute( Points ) - self.CargoObject:SetTask( TaskRoute, 4 ) + self:_NextEvent( FsmP.Load, CargoCarrier ) end - self:_NextEvent( FsmP.Boarded, CargoCarrier ) end @@ -343,12 +488,7 @@ end -- @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_UNIT:OnUnBoard( FsmP, Event, From, To, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) +function CARGO_UNIT:OnUnBoard( FsmP, Event, From, To ) self:F() self.CargoInAir = self.CargoObject:InAir() @@ -361,24 +501,10 @@ function CARGO_UNIT:OnUnBoard( FsmP, Event, From, To, Speed, UnLoadDistance, UnB end - self:_NextEvent( FsmP.UnBoarded, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) + self:_NextEvent( FsmP.UnLoad ) end ---- 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_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 @@ -391,12 +517,6 @@ function CARGO_UNIT:OnLoad( FsmP, Event, From, To, CargoCarrier ) self:T( self.ClassName ) - self.CargoCarrier = CargoCarrier - - -- 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. @@ -405,35 +525,9 @@ end -- @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 ) +function CARGO_UNIT:OnUnLoad( FsmP, Event, From, To ) 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 diff --git a/Moose Development/Moose/Point.lua b/Moose Development/Moose/Point.lua index e21e1fc5a..de49027cb 100644 --- a/Moose Development/Moose/Point.lua +++ b/Moose Development/Moose/Point.lua @@ -304,24 +304,6 @@ function POINT_VEC3:Get3DDistance( TargetPointVec3 ) return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.y - SourceVec3.y ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 end ---- Add a Distance in meters from the POINT_VEC3 orthogonal plane, with the given angle, and calculate the new POINT_VEC3. --- @param #POINT_VEC3 self --- @param DCSTypes#Distance Distance The Distance to be added in meters. --- @param DCSTypes#Angle Angle The Angle in degrees. --- @return #POINT_VEC3 The new calculated POINT_VEC3. -function POINT_VEC3:Translate( Distance, Angle ) - local SX = self:GetX() - local SY = self:GetY() - local Radians = Angle / 180 * math.pi - local TX = Distance * math.cos( Radians ) + SX - local TY = Distance * math.sin( Radians ) + SY - - self:SetX( TX ) - self:SetY( TY ) - - return self -end - --- Provides a Bearing / Range string -- @param #POINT_VEC3 self -- @param #number AngleRadians The angle in randians @@ -580,9 +562,9 @@ POINT_VEC2 = { function POINT_VEC2:New( x, y, LandHeightAdd ) local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) - if LandHeightAdd then - LandHeight = LandHeight + LandHeightAdd - end + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) @@ -595,12 +577,10 @@ end -- @return Point#POINT_VEC2 self function POINT_VEC2:NewFromVec2( Vec2, LandHeightAdd ) - local self = BASE:Inherit( self, BASE:New() ) - local LandHeight = land.getHeight( Vec2 ) - if LandHeightAdd then - LandHeight = LandHeight + LandHeightAdd - end + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd local self = BASE:Inherit( self, POINT_VEC3:New( Vec2.x, LandHeight, Vec2.y ) ) self:F2( { Vec2.x, Vec2.y, LandHeightAdd } ) @@ -694,3 +674,20 @@ function POINT_VEC2:GetAltitudeText() return '' end +--- Add a Distance in meters from the POINT_VEC2 orthonormal plane, with the given angle, and calculate the new POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param DCSTypes#Distance Distance The Distance to be added in meters. +-- @param DCSTypes#Angle Angle The Angle in degrees. +-- @return #POINT_VEC2 The new calculated POINT_VEC2. +function POINT_VEC2:Translate( Distance, Angle ) + local SX = self:GetX() + local SY = self:GetY() + local Radians = Angle / 180 * math.pi + local TX = Distance * math.cos( Radians ) + SX + local TY = Distance * math.sin( Radians ) + SY + + return POINT_VEC2:New( TX, TY ) +end + + + diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/MOOSE_Test_CARGO_UNIT_Board.miz b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/MOOSE_Test_CARGO_UNIT_Board.miz index 3437b5289c851f9b3b5e439d74f98d29d99e00f9..0d212d6e7524b5eaaf456371ba815f9a4b3b576e 100644 GIT binary patch delta 5183 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 delta 5082 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 diff --git a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua index 3e1e338a2..b45425e7c 100644 --- a/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua +++ b/Moose Test Missions/Moose_Test_CARGO/Moose_Test_CARGO_UNIT_Board/Moose_Test_CARGO_UNIT_Board.lua @@ -1,5 +1,5 @@ -local Mission = MISSION:New( "Pickup Cargo", "High", "Test for Cargo Pickup", coalition.side.RED ) +local Mission = MISSION:New( "Transfer Cargo", "High", "Test for Cargo", coalition.side.RED ) local CargoEngineer = UNIT:FindByName( "Engineer" ) local InfantryCargo = CARGO_UNIT:New( Mission, CargoEngineer, "Engineer", "Engineer Sven", "81", 2000, 25 ) @@ -9,5 +9,5 @@ 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. -InfantryCargo:Board( CargoCarrier, 10 ) +InfantryCargo:Board( CargoCarrier ) 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 index ce5bc6adc02d356f239723e500be4cf71a736803..51caecd1581f94e988dbb0e699ecfa611956ad9d 100644 GIT binary patch delta 4998 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 delta 5066 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%0AxrK*W;Do_*oleN0!}#SQ ztLB3XYibp+9igt6vZ7TXjs!18)Z!5#X&o6GQCAWD0mm8V{3j-b@~sZrTs0oEG|7nH zQl#1a1L53JTb}G;6knj9siUDYNuMvLwny&QZ4@lsgpMM|9$zqIpQ&?6px~#0^ZPv# zR>Knk_FQ#?awf%FXDLh#7t9KbOh3`|p4-0E((1-68A*DYZND*Wfe)t3eRcJ1DD3aq|xw zE`04zXjIR14J~M;w~wfa(aV{t``(nE@$cZcu51kM%ghlFi(frer_~|qqg_rKm zdB;YgZ&^W`>ohnzY@$5dhG=?$7W^{K2Cn>47wLfkhjwQhK?)ReJ$?A~bCM+JFaC#& zLGNU^p7dt<)8Aun}(ss yAPUO=-$DPaZ$s&2`RU1|004h0Z#zd1-*