From 01add98b7a0a639e37c9e73dbc978ea734ee05aa Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 5 Sep 2018 16:33:31 +0200 Subject: [PATCH] Improved logic --- Moose Development/Moose/AI/AI_Cargo.lua | 2 - Moose Development/Moose/AI/AI_Cargo_APC.lua | 3 + .../Moose/AI/AI_Cargo_Airplane.lua | 177 +-------------- .../Moose/AI/AI_Cargo_Helicopter.lua | 201 +----------------- .../Moose/Wrapper/Controllable.lua | 4 +- 5 files changed, 7 insertions(+), 380 deletions(-) diff --git a/Moose Development/Moose/AI/AI_Cargo.lua b/Moose Development/Moose/AI/AI_Cargo.lua index d2ba6f494..bd379f299 100644 --- a/Moose Development/Moose/AI/AI_Cargo.lua +++ b/Moose Development/Moose/AI/AI_Cargo.lua @@ -363,7 +363,6 @@ end function AI_CARGO:onafterPickedUp( Carrier, From, Event, To, PickupZone ) self:F( { Carrier, From, Event, To } ) - self.Transporting = true Carrier:RouteResume() end @@ -474,7 +473,6 @@ end function AI_CARGO:onafterDeployed( Carrier, From, Event, To, DeployZone ) self:F( { Carrier, From, Event, To, DeployZone = DeployZone } ) - self.Transporting = false self:__Guard( 0.1 ) end diff --git a/Moose Development/Moose/AI/AI_Cargo_APC.lua b/Moose Development/Moose/AI/AI_Cargo_APC.lua index 4c00f17c6..f991346a9 100644 --- a/Moose Development/Moose/AI/AI_Cargo_APC.lua +++ b/Moose Development/Moose/AI/AI_Cargo_APC.lua @@ -263,6 +263,7 @@ function AI_CARGO_APC:onafterMonitor( APC, From, Event, To ) if self:Is( "Following" ) then for Cargo, APCUnit in pairs( self.Carrier_Cargo ) do local Cargo = Cargo -- Cargo.Cargo#CARGO + local APCUnit = APCUnit -- Wrapper.Unit#UNIT if Cargo:IsAlive() then if not Cargo:IsNear( APCUnit, 40 ) then APCUnit:RouteStop() @@ -323,6 +324,7 @@ function AI_CARGO_APC._Pickup( APC, self, PickupZone ) if APC:IsAlive() then self:Load( PickupZone) self.Relocating = false + self.Transporting = true end end @@ -334,6 +336,7 @@ function AI_CARGO_APC._Deploy( APC, self, Coordinate, DeployZone ) if APC:IsAlive() then self:Unload( DeployZone ) self.Transporting = false + self.Relocating = false end end diff --git a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua index 55e5a79fd..882ea6d36 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua @@ -19,7 +19,6 @@ AI_CARGO_AIRPLANE = { ClassName = "AI_CARGO_AIRPLANE", Coordinate = nil, -- Core.Point#COORDINATE - Airplane_Cargo = {}, } --- Creates a new AI_CARGO_AIRPLANE object. @@ -29,25 +28,10 @@ AI_CARGO_AIRPLANE = { -- @return #AI_CARGO_AIRPLANE function AI_CARGO_AIRPLANE:New( Airplane, CargoSet ) - local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- #AI_CARGO_AIRPLANE + local self = BASE:Inherit( self, AI_CARGO:New( Airplane, CargoSet ) ) -- #AI_CARGO_AIRPLANE self.CargoSet = CargoSet -- Cargo.CargoGroup#CARGO_GROUP - self:SetStartState( "Unloaded" ) - - self:AddTransition( { "Unloaded", "Loaded" }, "Pickup", "*" ) - self:AddTransition( "Loaded", "Deploy", "*" ) - - self:AddTransition( { "Unloaded", "Boarding" }, "Load", "Boarding" ) - self:AddTransition( "Boarding", "Board", "Boarding" ) - self:AddTransition( "Boarding", "Loaded", "Boarding" ) - self:AddTransition( "Boarding", "PickedUp", "Loaded" ) - - self:AddTransition( "Loaded", "Unload", "Unboarding" ) - self:AddTransition( "Unboarding", "Unboard", "Unboarding" ) - self:AddTransition( "Unboarding" , "Unloaded", "Unboarding" ) - self:AddTransition( "Unboarding" , "Deployed", "Unloaded" ) - self:AddTransition( "*", "Landed", "*" ) self:AddTransition( "*", "Home" , "*" ) @@ -368,110 +352,6 @@ function AI_CARGO_AIRPLANE:onafterDeploy( Airplane, From, Event, To, Coordinate, end ---- On before Load event. Checks if cargo is inside the load radius and if so starts the boarding process. --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Group#GROUP Airplane Transport plane. --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_AIRPLANE:onbeforeLoad( Airplane, From, Event, To, PickupZone ) - - - local Boarding = false - - local LoadInterval = 10 - local LoadDelay = 10 - - if Airplane and Airplane:IsAlive() ~= nil then - - for _, AirplaneUnit in pairs( Airplane:GetUnits() ) do - local AirplaneUnit = AirplaneUnit -- Wrapper.Unit#UNIT - local CargoBayFreeWeight = AirplaneUnit:GetCargoBayFreeWeight() - self:F({CargoBayFreeWeight=CargoBayFreeWeight}) - - for _, Cargo in UTILS.spairs( self.CargoSet:GetSet(), function( t, a, b ) return t[a]:GetWeight() > t[b]:GetWeight() end ) do - self:F({Cargo:GetName()}) - local Cargo=Cargo --Cargo.Cargo#CARGO - if Cargo:IsUnLoaded() and not Cargo:IsDeployed() then - - if Cargo:IsInLoadRadius( AirplaneUnit:GetCoordinate() ) then - - local CargoWeight = Cargo:GetWeight() - - -- Only when there is space within the bay to load the next cargo item! - if CargoBayFreeWeight > CargoWeight then --and CargoBayFreeVolume > CargoVolume then - Cargo:__Board( LoadDelay, AirplaneUnit, 25 ) - LoadDelay = LoadDelay + LoadInterval - self:__Board( LoadDelay, Cargo, AirplaneUnit, PickupZone ) - self.Airplane_Cargo[AirplaneUnit] = Cargo - Boarding = true - CargoBayFreeWeight = CargoBayFreeWeight - CargoWeight - end - end - end - end - end - end - - return Boarding - -end - ---- On after Board event. Cargo is inside the load radius and boarding is performed. --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Group#GROUP Airplane Cargo transport plane. --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Cargo.Cargo#CARGO Cargo Cargo object. --- @param Wrapper.Unit#UNIT AirplaneUnit --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To, Cargo, AirplaneUnit, PickupZone ) - - if Airplane and Airplane:IsAlive() then - - self:F({ IsLoaded = Cargo:IsLoaded() } ) - - if not Cargo:IsLoaded() then - self:__Board( 10, Cargo, AirplaneUnit, PickupZone ) - return - end - end - - self:__Loaded( 10, Cargo, AirplaneUnit, PickupZone ) - -end - - ---- On After Loaded event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @return #boolean Cargo loaded. --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_AIRPLANE:onafterLoaded( AirplaneGroup, From, Event, To, Cargo, AirplaneUnit, PickupZone ) - self:F( { AirplaneGroup, From, Event, To } ) - - local Loaded = true - - if AirplaneGroup and AirplaneGroup:IsAlive() then - for AirplaneUnit, Cargo in pairs( self.Airplane_Cargo ) do - local Cargo = Cargo -- Cargo.Cargo#CARGO - self:F( { IsLoaded = Cargo:IsLoaded(), IsDestroyed = Cargo:IsDestroyed(), Cargo:GetName(), AirplaneGroup:GetName() } ) - if not Cargo:IsLoaded() and not Cargo:IsDestroyed() then - Loaded = false - end - end - end - - if Loaded then - self:PickedUp( PickupZone ) - end - -end --- On after PickedUp event. All cargo is inside the carrier and ready to be transported. -- @param #AI_CARGO_AIRPLANE self @@ -521,61 +401,6 @@ function AI_CARGO_AIRPLANE:onafterUnload( Airplane, From, Event, To, DeployZone end ---- On after Unboard event. Checks if unboarding process is finished. --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Group#GROUP Airplane Cargo transport plane. --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. -function AI_CARGO_AIRPLANE:onafterUnboard( Airplane, From, Event, To, Cargo, AirplaneUnit, DeployZone ) - - self:E( { "Unboard", Cargo } ) - - if Airplane and Airplane:IsAlive() then - if not Cargo:IsUnLoaded() then - self:__Unboard( 10, Cargo, AirplaneUnit, DeployZone ) - return - end - end - - self:Unloaded( Cargo, AirplaneUnit, DeployZone ) - -end - ---- On after Unloaded event. Cargo has been unloaded, i.e. the unboarding process is finished. --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Group#GROUP Airplane Cargo transport plane. --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Cargo.Cargo#CARGO Cargo -function AI_CARGO_AIRPLANE:onafterUnloaded( Airplane, From, Event, To, Cargo, AirplaneUnit, DeployZone ) - - local AllUnloaded = true - - if AirplaneUnit and AirplaneUnit:IsAlive() then - for _, AirplaneUnit in pairs( AirplaneUnit:GetUnits() ) do - local IsEmpty = AirplaneUnit:IsCargoEmpty() - self:I({ IsEmpty = IsEmpty }) - if not IsEmpty then - AllUnloaded = false - break - end - end - - if AllUnloaded == true then - if DeployZone then - self.Airplane_Cargo = {} - end - self.Airplane = AirplaneUnit - end - end - - if AllUnloaded == true then - self:Deployed( DeployZone ) - end - -end --- On after Deployed event. diff --git a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua index 62cdbf43a..b05c75dfe 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua @@ -21,7 +21,6 @@ AI_CARGO_HELICOPTER = { ClassName = "AI_CARGO_HELICOPTER", Coordinate = nil, -- Core.Point#COORDINATE, - Helicopter_Cargo = {}, } AI_CARGO_QUEUE = {} @@ -33,7 +32,7 @@ AI_CARGO_QUEUE = {} -- @return #AI_CARGO_HELICOPTER function AI_CARGO_HELICOPTER:New( Helicopter, CargoSet ) - local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- #AI_CARGO_HELICOPTER + local self = BASE:Inherit( self, AI_CARGO:New( Helicopter, CargoSet ) ) -- #AI_CARGO_HELICOPTER self.CargoSet = CargoSet -- Cargo.CargoGroup#CARGO_GROUP @@ -379,115 +378,6 @@ function AI_CARGO_HELICOPTER:onafterOrbit( Helicopter, From, Event, To, Coordina end ---- On Before event Load. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event --- @param #string To To state. --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_HELICOPTER:onbeforeLoad( Helicopter, From, Event, To, PickupZone ) - - local Boarding = false - - local LoadInterval = 10 - local LoadDelay = 10 - - if Helicopter and Helicopter:IsAlive() then - - self.BoardingCount = 0 - - for _, HelicopterUnit in pairs( Helicopter:GetUnits() ) do - local HelicopterUnit = HelicopterUnit -- Wrapper.Unit#UNIT - local CargoBayFreeWeight = HelicopterUnit:GetCargoBayFreeWeight() - self:F({CargoBayFreeWeight=CargoBayFreeWeight}) - - for _, Cargo in pairs( self.CargoSet:GetSet() ) do - local Cargo = Cargo -- Cargo.Cargo#CARGO - self:F( { IsUnLoaded = Cargo:IsUnLoaded() } ) - if Cargo:IsUnLoaded() and not Cargo:IsDeployed() then - if Cargo:IsInLoadRadius( HelicopterUnit:GetCoordinate() ) then - self:F( { "In radius", HelicopterUnit:GetName() } ) - - local CargoWeight = Cargo:GetWeight() - - -- Only when there is space within the bay to load the next cargo item! - if CargoBayFreeWeight > CargoWeight then --and CargoBayFreeVolume > CargoVolume then - - --Cargo:Ungroup() - Cargo:__Board( LoadDelay, HelicopterUnit, 25 ) - LoadDelay = LoadDelay + LoadInterval - self:__Board( LoadDelay, Cargo, HelicopterUnit, PickupZone ) - self.Helicopter_Cargo[HelicopterUnit] = Cargo - Boarding = true - CargoBayFreeWeight = CargoBayFreeWeight - CargoWeight - end - end - end - end - end - end - - return Boarding - -end - ---- On after Board event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Cargo.Cargo#CARGO Cargo Cargo object. --- @param Wrapper.Unit#UNIT HelicopterUnit --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_HELICOPTER:onafterBoard( Helicopter, From, Event, To, Cargo, HelicopterUnit, PickupZone ) - self:F( { Helicopter, From, Event, To, Cargo, HelicopterUnit } ) - - if Helicopter and Helicopter:IsAlive() then - self:F({ IsLoaded = Cargo:IsLoaded() } ) - if not Cargo:IsLoaded() then - self:__Board( 10, Cargo, HelicopterUnit, PickupZone ) - return - end - end - - self:__Loaded( 10, Cargo, HelicopterUnit, PickupZone ) -- Will only be executed when no more cargo is boarded. - -end - - ---- On After Loaded event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @return #boolean Cargo loaded. --- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided. -function AI_CARGO_HELICOPTER:onafterLoaded( Helicopter, From, Event, To, Cargo, HelicopterUnit, PickupZone ) - self:F( { Helicopter, From, Event, To } ) - - local Loaded = true - - if Helicopter and Helicopter:IsAlive() then - for HelicopterUnit, Cargo in pairs( self.Helicopter_Cargo ) do - local Cargo = Cargo -- Cargo.Cargo#CARGO - self:F( { IsLoaded = Cargo:IsLoaded(), IsDestroyed = Cargo:IsDestroyed(), Cargo:GetName(), Helicopter:GetName() } ) - if not Cargo:IsLoaded() and not Cargo:IsDestroyed() then - Loaded = false - end - end - end - - if Loaded then - self:PickedUp( PickupZone ) - end - -end - - - --- On after PickedUp event, raised when all cargo has been loaded into the CarrierGroup. -- @param #AI_CARGO_HELICOPTER self @@ -507,95 +397,6 @@ function AI_CARGO_HELICOPTER:onafterPickedUp( Helicopter, From, Event, To, Picku end ---- On after Unload event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #boolean Deployed Cargo is deployed. -function AI_CARGO_HELICOPTER:onafterUnload( Helicopter, From, Event, To, DeployZone ) - - local UnboardInterval = 10 - local UnboardDelay = 10 - - if Helicopter and Helicopter:IsAlive() then - for _, HelicopterUnit in pairs( Helicopter:GetUnits() ) do - local HelicopterUnit = HelicopterUnit -- Wrapper.Unit#UNIT - for _, Cargo in pairs( HelicopterUnit:GetCargo() ) do - if Cargo:IsLoaded() then - Cargo:__UnBoard( UnboardDelay ) - UnboardDelay = UnboardDelay + UnboardInterval - Cargo:SetDeployed( true ) - self:__Unboard( UnboardDelay, Cargo, HelicopterUnit, DeployZone ) - end - end - end - end - - -end - ---- On after Unboard event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Cargo.Cargo#CARGO Cargo Cargo object. --- @param #boolean Deployed Cargo is deployed. -function AI_CARGO_HELICOPTER:onafterUnboard( Helicopter, From, Event, To, Cargo, HelicopterUnit, DeployZone ) - - if Helicopter and Helicopter:IsAlive() then - if not Cargo:IsUnLoaded() then - self:__Unboard( 10, Cargo, HelicopterUnit, DeployZone ) - return - end - end - - self:Unloaded( Cargo, HelicopterUnit, DeployZone ) - -end - ---- On after Unloaded event. --- @param #AI_CARGO_HELICOPTER self --- @param Wrapper.Group#GROUP Helicopter --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Cargo.Cargo#CARGO Cargo Cargo object. --- @param #boolean Deployed Cargo is deployed. --- @return #boolean True if all cargo has been unloaded. -function AI_CARGO_HELICOPTER:onafterUnloaded( Helicopter, From, Event, To, Cargo, HelicopterUnit, DeployZone ) - self:F( { Helicopter, From, Event, To, Cargo:GetName(), HelicopterUnit:GetName(), DeployZone = DeployZone } ) - - local AllUnloaded = true - - --Cargo:Regroup() - - if Helicopter and Helicopter:IsAlive() then - for _, HelicopterUnit in pairs( Helicopter:GetUnits() ) do - local IsEmpty = HelicopterUnit:IsCargoEmpty() - self:I({ IsEmpty = IsEmpty }) - if not IsEmpty then - AllUnloaded = false - break - end - end - - if AllUnloaded == true then - if DeployZone then - self.Helicopter_Cargo = {} - end - self.Helicopter = Helicopter - end - end - - if AllUnloaded == true then - self:Deployed( DeployZone ) - end - -end - --- On after Deployed event. -- @param #AI_CARGO_HELICOPTER self diff --git a/Moose Development/Moose/Wrapper/Controllable.lua b/Moose Development/Moose/Wrapper/Controllable.lua index a6f83c5c0..ef91a1cff 100644 --- a/Moose Development/Moose/Wrapper/Controllable.lua +++ b/Moose Development/Moose/Wrapper/Controllable.lua @@ -1937,7 +1937,7 @@ do -- Route methods -- @param #CONTROLLABLE self -- @return #CONTROLLABLE function CONTROLLABLE:RouteStop() - self:F("RouteStop") + self:F(self:GetName() .. "RouteStop") local CommandStop = self:CommandStopRoute( true ) self:SetCommand( CommandStop ) @@ -1948,7 +1948,7 @@ do -- Route methods -- @param #CONTROLLABLE self -- @return #CONTROLLABLE function CONTROLLABLE:RouteResume() - self:F("RouteResume") + self:F( self:GetName() .. " RouteResume") local CommandResume = self:CommandStopRoute( false ) self:SetCommand( CommandResume )