diff --git a/Moose Development/Moose/AI/AI_Cargo_APC.lua b/Moose Development/Moose/AI/AI_Cargo_APC.lua index 13f88324e..fbe2dd1f4 100644 --- a/Moose Development/Moose/AI/AI_Cargo_APC.lua +++ b/Moose Development/Moose/AI/AI_Cargo_APC.lua @@ -96,7 +96,7 @@ function AI_CARGO_APC:New( APC, CargoSet, CombatRadius ) self:AddTransition( "Loaded", "Deploy", "*" ) self:AddTransition( "*", "Load", "Boarding" ) - self:AddTransition( "Boarding", "Board", "Boarding" ) + self:AddTransition( { "Boarding", "Loaded" }, "Board", "Boarding" ) self:AddTransition( "Boarding", "Loaded", "Loaded" ) self:AddTransition( "Loaded", "Unload", "Unboarding" ) self:AddTransition( "Unboarding", "Unboard", "Unboarding" ) @@ -194,8 +194,20 @@ function AI_CARGO_APC:New( APC, CargoSet, CombatRadius ) self:__Monitor( 1 ) - self:SetCarrier( APC ) + + for _, APCUnit in pairs( APC:GetUnits() ) do + local Desc = APCUnit:GetDesc() + self:F({Desc=Desc}) +-- local Box = CargoUnit:GetBoundingBox() + local VolumeUnit = ( Desc.box.max.x - Desc.box.min.x ) * ( Desc.box.max.y - Desc.box.min.y ) * ( Desc.box.max.z - Desc.box.min.z ) + self:F({VolumeUnit=VolumeUnit}) + local CargoBayWeightLimit = 1250 + APCUnit:SetCargoBayWeightLimit( CargoBayWeightLimit ) + self:F({CargoBayWeightLimit=CargoBayWeightLimit}) + --Airplane:SetCargoBayVolumeLimit( 15 ) + end + self.Transporting = false self.Relocating = false @@ -411,7 +423,6 @@ function AI_CARGO_APC:onbeforeLoad( APC, From, Event, To ) self:F( { APC, From, Event, To } ) local Boarding = false - self.BoardingCount = 0 if APC and APC:IsAlive() then self.APC_Cargo = {} @@ -427,11 +438,11 @@ function AI_CARGO_APC:onbeforeLoad( APC, From, Event, To ) --Cargo:Ungroup() Cargo:Board( APCUnit, 25 ) self:__Board( 1, Cargo ) - Boarding = true - + -- So now this APCUnit has Cargo that is being loaded. -- This will be used further in the logic to follow and to check cargo status. self.APC_Cargo[APCUnit] = Cargo + Boarding = true break end end @@ -458,7 +469,31 @@ function AI_CARGO_APC:onafterBoard( APC, From, Event, To, Cargo ) if not Cargo:IsLoaded() then self:__Board( 10, Cargo ) else - self:__Loaded( 1 ) + for _, APCUnit in pairs( APC:GetUnits() ) do + local APCUnit = APCUnit -- Wrapper.Unit#UNIT + for _, Cargo in pairs( self.CargoSet:GetSet() ) do + local Cargo = Cargo -- Cargo.Cargo#CARGO + if Cargo:IsUnLoaded() then + if Cargo:IsInLoadRadius( APCUnit:GetCoordinate() ) then + local CargoBayFreeWeight = APCUnit:GetCargoBayFreeWeight() + local CargoWeight = Cargo:GetWeight() + + self:F({CargoBayFreeWeight=CargoBayFreeWeight}) + + -- Only when there is space within the bay to load the next cargo item! + if CargoBayFreeWeight > CargoWeight then --and CargoBayFreeVolume > CargoVolume then + Cargo:Board( APCUnit, 25 ) + self:__Board( 10, Cargo ) + -- So now this APCUnit has Cargo that is being loaded. + -- This will be used further in the logic to follow and to check cargo status. + self.APC_Cargo[APCUnit] = Cargo + return + end + end + end + end + end + self:__Loaded( 5, Cargo ) end end @@ -471,7 +506,7 @@ end -- @param #string Event Event. -- @param #string To To state. -- @return #boolean Cargo loaded. -function AI_CARGO_APC:onbeforeLoaded( APC, From, Event, To ) +function AI_CARGO_APC:onbeforeLoaded( APC, From, Event, To, Cargo ) self:F( { APC, From, Event, To } ) local Loaded = true @@ -484,7 +519,6 @@ function AI_CARGO_APC:onbeforeLoaded( APC, From, Event, To ) Loaded = false end end - end if Loaded == true then @@ -496,6 +530,9 @@ function AI_CARGO_APC:onbeforeLoaded( APC, From, Event, To ) end + + + --- On after Unload event. -- @param #AI_CARGO_APC self -- @param Wrapper.Group#GROUP APC @@ -512,6 +549,7 @@ function AI_CARGO_APC:onafterUnload( APC, From, Event, To, Deployed ) APC:RouteStop() for _, Cargo in pairs( APCUnit:GetCargo() ) do Cargo:UnBoard() + Cargo:SetDeployed( true ) self:__Unboard( 10, Cargo, Deployed ) end end @@ -534,6 +572,17 @@ function AI_CARGO_APC:onafterUnboard( APC, From, Event, To, Cargo, Deployed ) if not Cargo:IsUnLoaded() then self:__Unboard( 10, Cargo, Deployed ) else + for _, APCUnit in pairs( APC:GetUnits() ) do + local APCUnit = APCUnit -- Wrapper.Unit#UNIT + for _, Cargo in pairs( APCUnit:GetCargo() ) do + if Cargo:IsLoaded() then + Cargo:UnBoard() + Cargo:SetDeployed( true ) + self:__Unboard( 10, Cargo, Deployed ) + return + end + end + end self:__Unloaded( 1, Cargo, Deployed ) end end @@ -559,22 +608,16 @@ function AI_CARGO_APC:onbeforeUnloaded( APC, From, Event, To, Cargo, Deployed ) if APC and APC:IsAlive() then for _, APCUnit in pairs( APC:GetUnits() ) do local APCUnit = APCUnit -- Wrapper.Unit#UNIT - local CargoCheck = self.APC_Cargo[APCUnit] - if CargoCheck then - self:F( { CargoCheck:GetName(), IsUnLoaded = CargoCheck:IsUnLoaded() } ) - if CargoCheck:IsUnLoaded() == false then - AllUnloaded = false - break - end + local IsEmpty = APCUnit:IsCargoEmpty() + self:I({ IsEmpty = IsEmpty }) + if not IsEmpty then + AllUnloaded = false + break end end if AllUnloaded == true then if Deployed == true then - for APCUnit, Cargo in pairs( self.APC_Cargo ) do - local Cargo = Cargo -- Cargo.Cargo#CARGO - Cargo:SetDeployed( true ) - end self.APC_Cargo = {} end self:Guard() @@ -587,6 +630,21 @@ function AI_CARGO_APC:onbeforeUnloaded( APC, From, Event, To, Cargo, Deployed ) end +--- On after Unloaded event. +-- @param #AI_CARGO_APC self +-- @param Wrapper.Group#GROUP APC +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +-- @param #string Cargo.Cargo#CARGO Cargo Cargo object. +-- @param #boolean Deployed Cargo is deployed. +-- @return #boolean All cargo unloaded. +function AI_CARGO_APC:onafterUnloaded( APC, From, Event, To, Cargo, Deployed ) + self:F( { APC, From, Event, To, Cargo:GetName(), Deployed = Deployed } ) + + self.Transporting = false + +end --- On after Follow event. -- @param #AI_CARGO_APC self @@ -632,7 +690,6 @@ function AI_CARGO_APC._Deploy( APC, self ) if APC:IsAlive() then self:Unload( true ) - self.Transporting = false self.Relocating = false end end diff --git a/Moose Development/Moose/AI/AI_Cargo_Dispatcher.lua b/Moose Development/Moose/AI/AI_Cargo_Dispatcher.lua index 933556713..9bbfe26a8 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Dispatcher.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Dispatcher.lua @@ -416,6 +416,7 @@ function AI_CARGO_DISPATCHER:onafterMonitor() self:F( { Cargo = Cargo:GetName(), UnLoaded = Cargo:IsUnLoaded(), Deployed = Cargo:IsDeployed(), PickupCargo = self.PickupCargo[Carrier] ~= nil } ) if Cargo:IsUnLoaded() == true and Cargo:IsDeployed() == false then local CargoCoordinate = Cargo:GetCoordinate() + self:F({CargoCoordinate = CargoCoordinate }) local CoordinateFree = true for CarrierPickup, Coordinate in pairs( self.PickupCargo ) do if CarrierPickup:IsAlive() == true then @@ -427,6 +428,7 @@ function AI_CARGO_DISPATCHER:onafterMonitor() self.PickupCargo[CarrierPickup] = nil end end + self:F({CoordinateFree = CoordinateFree}) if CoordinateFree == true then self.PickupCargo[Carrier] = CargoCoordinate PickupCargo = Cargo @@ -435,6 +437,8 @@ function AI_CARGO_DISPATCHER:onafterMonitor() end end + self:F( { PickupCargo = PickupCargo} ) + if PickupCargo then self.CarrierHome[Carrier] = nil local PickupCoordinate = PickupCargo:GetCoordinate():GetRandomCoordinateInRadius( self.PickupOuterRadius, self.PickupInnerRadius ) @@ -567,6 +571,7 @@ function AI_CARGO_DISPATCHER:OnAfterLoaded( From, Event, To, Carrier, Cargo ) end end + self:F({Carrier=Carrier}) self.PickupCargo[Carrier] = nil end diff --git a/Moose Development/Moose/AI/AI_Cargo_Dispatcher_APC.lua b/Moose Development/Moose/AI/AI_Cargo_Dispatcher_APC.lua index 413ca7c26..1612ce2c7 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Dispatcher_APC.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Dispatcher_APC.lua @@ -101,9 +101,9 @@ AI_CARGO_DISPATCHER_APC = { -- SetDeployZone = SET_ZONE:New():FilterPrefixes( "Deploy" ):FilterStart() -- AICargoDispatcher = AI_CARGO_DISPATCHER_APC:New( SetAPC, SetCargo, SetDeployZone, 500 ) -- -function AI_CARGO_DISPATCHER_APC:NewWithZones( SetAPC, SetCargo, SetDeployZone, CombatRadius ) +function AI_CARGO_DISPATCHER_APC:New( SetAPC, SetCargo, SetDeployZone, CombatRadius ) - local self = BASE:Inherit( self, AI_CARGO_DISPATCHER:New( SetAPC, SetCargo, SetDeployZone ) ) -- #AI_CARGO_DISPATCHER_APC + local self = BASE:Inherit( self, AI_CARGO_DISPATCHER:NewWithZones( SetAPC, SetCargo, SetDeployZone ) ) -- #AI_CARGO_DISPATCHER_APC self.CombatRadius = CombatRadius or 500 diff --git a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua index faa85affc..df6865545 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua @@ -395,7 +395,7 @@ function AI_CARGO_HELICOPTER:onbeforeLoad( Helicopter, From, Event, To) for _, Cargo in pairs( self.CargoSet:GetSet() ) do local Cargo = Cargo -- Cargo.Cargo#CARGO self:F( { IsUnLoaded = Cargo:IsUnLoaded() } ) - if Cargo:IsUnLoaded() then + if Cargo:IsUnLoaded() and not Cargo:IsDeployed() then if Cargo:IsInLoadRadius( HelicopterUnit:GetCoordinate() ) then self:F( { "In radius", HelicopterUnit:GetName() } ) --Cargo:Ungroup() @@ -440,7 +440,6 @@ function AI_CARGO_HELICOPTER:onafterBoard( Helicopter, From, Event, To, Cargo ) -- Only when there is space within the bay to load the next cargo item! if CargoBayFreeWeight > CargoWeight then --and CargoBayFreeVolume > CargoVolume then - Cargo:Board( HelicopterUnit, 25 ) self:__Board( 10, Cargo ) return @@ -455,7 +454,7 @@ function AI_CARGO_HELICOPTER:onafterBoard( Helicopter, From, Event, To, Cargo ) end ---- On before Loaded event. Check if cargo is loaded. +--- On after Loaded event. Check if cargo is loaded. -- @param #AI_CARGO_HELICOPTER self -- @param Wrapper.Group#GROUP Helicopter -- @param #string From From state. diff --git a/Moose Development/Moose/Cargo/Cargo.lua b/Moose Development/Moose/Cargo/Cargo.lua index 50cade298..3311a1bff 100644 --- a/Moose Development/Moose/Cargo/Cargo.lua +++ b/Moose Development/Moose/Cargo/Cargo.lua @@ -779,7 +779,8 @@ do -- CARGO local Distance = 0 if self:IsUnLoaded() then - Distance = Coordinate:Get2DDistance( self.CargoObject:GetCoordinate() ) + local CargoCoordinate = self.CargoObject:GetCoordinate() + Distance = Coordinate:Get2DDistance( CargoCoordinate ) self:T( Distance ) if Distance <= self.LoadRadius then return true diff --git a/Moose Development/Moose/Cargo/CargoGroup.lua b/Moose Development/Moose/Cargo/CargoGroup.lua index 9a0294855..63f9203d1 100644 --- a/Moose Development/Moose/Cargo/CargoGroup.lua +++ b/Moose Development/Moose/Cargo/CargoGroup.lua @@ -500,8 +500,6 @@ do -- CARGO_GROUP -- @return Core.Point#COORDINATE The current Coordinate of the first Cargo of the CargoGroup. -- @return #nil There is no valid Cargo in the CargoGroup. function CARGO_GROUP:GetCoordinate() - self:F() - local Cargo = self:GetFirstAlive() -- Cargo.Cargo#CARGO if Cargo then @@ -635,12 +633,19 @@ do -- CARGO_GROUP if Cargo then local Distance = 0 + local CargoCoordinate if Cargo:IsLoaded() then - Distance = Coordinate:Get2DDistance( Cargo.CargoCarrier:GetCoordinate() ) + CargoCoordinate = Cargo.CargoCarrier:GetCoordinate() else - Distance = Coordinate:Get2DDistance( Cargo.CargoObject:GetCoordinate() ) + CargoCoordinate = Cargo.CargoObject:GetCoordinate() end +-- if CargoCoordinate then + Distance = Coordinate:Get2DDistance( CargoCoordinate ) +-- else +-- return false +-- end + self:F( { Distance = Distance, LoadRadius = self.LoadRadius } ) if Distance <= self.LoadRadius then return true diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 017c5f70f..287338c2b 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -879,7 +879,6 @@ do -- Cargo function POSITIONABLE:GetCargoBayFreeWeight() local CargoWeight = 0 for CargoName, Cargo in pairs( self.__.Cargo ) do - self:F( { Cargo = Cargo } ) CargoWeight = CargoWeight + Cargo:GetWeight() end return self.__.CargoBayWeightLimit - CargoWeight