diff --git a/Moose Development/Moose/AI/AI_Cargo_APC.lua b/Moose Development/Moose/AI/AI_Cargo_APC.lua index afcb5fff1..71434f10d 100644 --- a/Moose Development/Moose/AI/AI_Cargo_APC.lua +++ b/Moose Development/Moose/AI/AI_Cargo_APC.lua @@ -419,11 +419,11 @@ function AI_CARGO_APC:onbeforeLoad( APC, From, Event, To ) if APC and APC:IsAlive() then self.APC_Cargo = {} - self.APC_Cargo_Weight = {} for _, APCUnit in pairs( APC:GetUnits() ) do local APCUnit = APCUnit -- Wrapper.Unit#UNIT - self.APC_Cargo_Weight[APCUnit] = APCUnit:GetCargoBayFreeWeight() + local CargoBayFreeWeight = APCUnit:GetCargoBayFreeWeight() + self:F({CargoBayFreeWeight=CargoBayFreeWeight}) --for _, Cargo in pairs( self.CargoSet:GetSet() ) do for _, Cargo in UTILS.spairs( self.CargoSet:GetSet(), function( t, a, b ) return t[a]:GetWeight() > t[b]:GetWeight() end ) do @@ -433,10 +433,7 @@ function AI_CARGO_APC:onbeforeLoad( APC, From, Event, To ) if Cargo:IsInLoadRadius( APCUnit:GetCoordinate() ) then self:F( { "In radius", APCUnit:GetName() } ) - local CargoBayFreeWeight = self.APC_Cargo_Weight[APCUnit] 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 @@ -448,7 +445,6 @@ function AI_CARGO_APC:onbeforeLoad( APC, From, Event, To ) -- 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 - self.APC_Cargo_Weight[APCUnit] = self.APC_Cargo_Weight[APCUnit] - CargoWeight Boarding = true break end @@ -478,14 +474,13 @@ function AI_CARGO_APC:onafterBoard( APC, From, Event, To, Cargo, APCUnit ) if not Cargo:IsLoaded() then self:__Board( 10, Cargo, APCUnit ) else + local CargoBayFreeWeight = APCUnit: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 local Cargo = Cargo -- Cargo.Cargo#CARGO if Cargo:IsUnLoaded() then if Cargo:IsInLoadRadius( APCUnit:GetCoordinate() ) then - local CargoBayFreeWeight = self.APC_Cargo_Weight[APCUnit] 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 @@ -494,7 +489,6 @@ function AI_CARGO_APC:onafterBoard( APC, From, Event, To, Cargo, APCUnit ) -- 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 - self.APC_Cargo_Weight[APCUnit] = self.APC_Cargo_Weight[APCUnit] - CargoWeight return end end diff --git a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua index 219cdd8bf..8ce9bcb42 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua @@ -355,35 +355,44 @@ function AI_CARGO_AIRPLANE:onafterDeploy( Airplane, From, Event, To, Airbase, Sp end ---- On after Load event. Checks if cargo is inside the load radius and if so starts the boarding process. +--- 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 Wrapper.Point#COORDINATE Coordinate Place where the cargo is guided to if it is inside the load radius. -function AI_CARGO_AIRPLANE:onafterLoad( Airplane, From, Event, To, Coordinate ) +function AI_CARGO_AIRPLANE:onbeforeLoad( Airplane, From, Event, To, Coordinate ) + + local Boarding = false + if Airplane and Airplane:IsAlive() ~= nil then - for _,_Cargo in pairs( self.CargoSet:GetSet() ) do - self:F({_Cargo:GetName()}) - local Cargo=_Cargo --Cargo.Cargo#CARGO - local InRadius = Cargo:IsInLoadRadius( Coordinate ) - if InRadius then - - -- Is there a cargo still unloaded? - if Cargo:IsUnLoaded() == true then - - self:__Board( 5, Cargo ) - Cargo:Board( Airplane, 25 ) - break + for _, AirplaneUnit in pairs( Airplane:GetUnits() ) do + local AirplaneUnit = AirplaneUnit -- Wrapper.Unit#UNIT + for _,_Cargo in pairs( self.CargoSet:GetSet() ) do + self:F({_Cargo:GetName()}) + local Cargo=_Cargo --Cargo.Cargo#CARGO + local InRadius = Cargo:IsInLoadRadius( Coordinate ) + if InRadius then + + -- Is there a cargo still unloaded? + if Cargo:IsUnLoaded() == true then + + Cargo:Board( AirplaneUnit, 25 ) + self:__Board( 5, Cargo, AirplaneUnit ) + Boarding = true + break + end end + end - end end + return Boarding + end --- On after Board event. Cargo is inside the load radius and boarding is performed. @@ -392,17 +401,22 @@ end -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. -function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To, Cargo ) +-- @param Cargo.Cargo#CARGO Cargo Cargo object. +-- @param Wrapper.Unit#UNIT AirplaneUnit +function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To, Cargo, AirplaneUnit ) if Airplane and Airplane:IsAlive() then self:F({ IsLoaded = Cargo:IsLoaded() } ) if not Cargo:IsLoaded() then - self:__Board( 10, Cargo ) + self:__Board( 10, Cargo, AirplaneUnit ) else + local CargoBayFreeWeight = AirplaneUnit:GetCargoBayFreeWeight() + self:F({CargoBayFreeWeight=CargoBayFreeWeight}) + -- Check if another cargo can be loaded into the airplane. - for _,_Cargo in pairs( self.CargoSet:GetSet() ) do + 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 @@ -414,7 +428,7 @@ function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To, Cargo ) local InRadius = Cargo:IsInLoadRadius( Airplane:GetCoordinate() ) if InRadius then - local CargoBayFreeWeight = Airplane:GetCargoBayFreeWeight() + local CargoBayFreeWeight = AirplaneUnit:GetCargoBayFreeWeight() --local CargoBayFreeVolume = Airplane:GetCargoBayFreeVolume() local CargoWeight = Cargo:GetWeight() @@ -465,18 +479,20 @@ end function AI_CARGO_AIRPLANE:onafterUnload( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then - local Cargos = Airplane:GetCargo() - for CargoID, Cargo in pairs( Cargos ) do - - local Angle = 180 - local CargoCarrierHeading = Airplane:GetHeading() -- Get Heading of object in degrees. - local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) - self:T( { CargoCarrierHeading, CargoDeployHeading } ) - local CargoDeployCoordinate = Airplane:GetPointVec2():Translate( 150, CargoDeployHeading ) - - Cargo:UnBoard( CargoDeployCoordinate ) - Cargo:SetDeployed( true ) - self:__Unboard( 10, Cargo ) + for _, AirplaneUnit in pairs( Airplane:GetUnits() ) do + local Cargos = AirplaneUnit:GetCargo() + for CargoID, Cargo in pairs( Cargos ) do + + local Angle = 180 + local CargoCarrierHeading = Airplane:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployCoordinate = Airplane:GetPointVec2():Translate( 150, CargoDeployHeading ) + + Cargo:UnBoard( CargoDeployCoordinate ) + Cargo:SetDeployed( true ) + self:__Unboard( 10, Cargo ) + end end end @@ -496,22 +512,24 @@ function AI_CARGO_AIRPLANE:onafterUnboard( Airplane, From, Event, To, Cargo ) if not Cargo:IsUnLoaded() then self:__Unboard( 10, Cargo ) else - local Cargos = Airplane:GetCargo() - for CargoID, Cargo in pairs( Cargos ) do - if Cargo:IsLoaded() then - local Angle = 180 - local CargoCarrierHeading = Airplane:GetHeading() -- Get Heading of object in degrees. - local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) - self:T( { CargoCarrierHeading, CargoDeployHeading } ) - local CargoDeployCoordinate = Airplane:GetPointVec2():Translate( 150, CargoDeployHeading ) - Cargo:UnBoard( CargoDeployCoordinate ) - Cargo:SetDeployed( true ) - - self:__Unboard( 10, Cargo ) - return - end - end - self:__Unloaded( 1, Cargo ) + for _, AirplaneUnit in pairs( Airplane:GetUnits() ) do + local Cargos = AirplaneUnit:GetCargo() + for CargoID, Cargo in pairs( Cargos ) do + if Cargo:IsLoaded() then + local Angle = 180 + local CargoCarrierHeading = Airplane:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployCoordinate = Airplane:GetPointVec2():Translate( 150, CargoDeployHeading ) + Cargo:UnBoard( CargoDeployCoordinate ) + Cargo:SetDeployed( true ) + + self:__Unboard( 10, Cargo ) + return + end + end + self:__Unloaded( 1, Cargo ) + end end end end diff --git a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua index e115a09dc..e40f357a4 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Helicopter.lua @@ -395,6 +395,9 @@ function AI_CARGO_HELICOPTER:onbeforeLoad( Helicopter, From, Event, To) if Helicopter and Helicopter:IsAlive() then 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() } ) @@ -402,17 +405,14 @@ function AI_CARGO_HELICOPTER:onbeforeLoad( Helicopter, From, Event, To) if Cargo:IsInLoadRadius( HelicopterUnit:GetCoordinate() ) then self:F( { "In radius", HelicopterUnit:GetName() } ) - local CargoBayFreeWeight = HelicopterUnit: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:Ungroup() Cargo:Board( HelicopterUnit, 25 ) - self:__Board( 1, Cargo ) + self:__Board( 1, Cargo, HelicopterUnit ) self.Helicopter_Cargo[HelicopterUnit] = Cargo Boarding = true break @@ -435,32 +435,29 @@ end -- @param #string Event Event. -- @param #string To To state. -- @param Cargo.Cargo#CARGO Cargo Cargo object. -function AI_CARGO_HELICOPTER:onafterBoard( Helicopter, From, Event, To, Cargo ) - self:F( { Helicopter, From, Event, To, Cargo } ) +-- @param Wrapper.Unit#UNIT HelicopterUnit +function AI_CARGO_HELICOPTER:onafterBoard( Helicopter, From, Event, To, Cargo, HelicopterUnit ) + 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 ) + self:__Board( 10, Cargo, HelicopterUnit ) else - for _, HelicopterUnit in pairs( Helicopter:GetUnits() ) do - local HelicopterUnit = HelicopterUnit -- Wrapper.Unit#UNIT - for _, Cargo in pairs( self.CargoSet:GetSet() ) do - local Cargo = Cargo -- Cargo.Cargo#CARGO - if Cargo:IsUnLoaded() then - if Cargo:IsInLoadRadius( HelicopterUnit:GetCoordinate() ) then - local CargoBayFreeWeight = HelicopterUnit:GetCargoBayFreeWeight() - local CargoWeight = Cargo:GetWeight() + local CargoBayFreeWeight = HelicopterUnit:GetCargoBayFreeWeight() + self:F({CargoBayFreeWeight=CargoBayFreeWeight}) + for _, Cargo in pairs( self.CargoSet:GetSet() ) do + local Cargo = Cargo -- Cargo.Cargo#CARGO + if Cargo:IsUnLoaded() then + if Cargo:IsInLoadRadius( HelicopterUnit:GetCoordinate() ) then + 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( HelicopterUnit, 25 ) - self:__Board( 10, Cargo ) - self.Helicopter_Cargo[HelicopterUnit] = Cargo - return - end + -- 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, HelicopterUnit ) + self.Helicopter_Cargo[HelicopterUnit] = Cargo + return end end end diff --git a/Moose Development/Moose/Cargo/Cargo.lua b/Moose Development/Moose/Cargo/Cargo.lua index 82015511e..f1f869fd4 100644 --- a/Moose Development/Moose/Cargo/Cargo.lua +++ b/Moose Development/Moose/Cargo/Cargo.lua @@ -1032,7 +1032,11 @@ do -- CARGO_REPRESENTABLE self:I( { Desc = Desc } ) local Weight = math.random( 80, 120 ) if Desc then - Weight = Desc.massEmpty + if Desc.typeName == "2B11 mortar" then + Weight = 210 + else + Weight = Desc.massEmpty + end end self:SetWeight( Weight ) diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 582af6f11..86eeb9d2c 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -1008,6 +1008,17 @@ do -- Cargo ["MLRS FDDM"] = 4, ["MTLB"] = 25, ["TPZ"] = 10, + ["Ural-4320 APA-5D"] = 10, + ["GAZ-66"] = 8, + ["GAZ-3307"] = 12, + ["GAZ-3308"] = 14, + ["Tigr_233036"] = 6, + ["KAMAZ Truck"] = 12, + ["KrAZ6322"] = 12, + ["M 818"] = 12, + ["Ural-375"] = 12, + ["Ural-4320-31"] = 14, + ["Ural-4320T"] = 14, } local CargoBayWeightLimit = ( Weights[Desc.typeName] or 0 ) * 95