diff --git a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua index 0d8411544..679900301 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua @@ -24,7 +24,7 @@ AI_CARGO_AIRPLANE = { --- Creates a new AI_CARGO_AIRPLANE object. -- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane -- @param Core.Set#SET_CARGO CargoSet -- @param #number CombatRadius -- @return #AI_CARGO_AIRPLANE @@ -115,13 +115,13 @@ end --- Set the Carrier. -- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane -- @return #AI_CARGO_AIRPLANE function AI_CARGO_AIRPLANE:SetCarrier( Airplane ) local AICargo = self - self.Airplane = Airplane -- Wrapper.Unit#UNIT + self.Airplane = Airplane -- Wrapper.Group#GROUP self.Airplane:SetState( self.Airplane, "AI_CARGO_AIRPLANE", self ) self.RoutePickup = false @@ -172,7 +172,7 @@ end -- @param #AI_CARGO_AIRPLANE self -- @param Wrapper.Airbase#AIRBASE Airbase -- @param #number Radius --- @return Wrapper.Unit#UNIT NewCarrier +-- @return Wrapper.Group#GROUP NewCarrier function AI_CARGO_AIRPLANE:FindCarrier( Coordinate, Radius ) local CoordinateZone = ZONE_RADIUS:New( "Zone" , Coordinate:GetVec2(), Radius ) @@ -193,7 +193,7 @@ function AI_CARGO_AIRPLANE:FindCarrier( Coordinate, Radius ) end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane -- @param From -- @param Event -- @param To @@ -228,9 +228,14 @@ end -- @param #number Speed function AI_CARGO_AIRPLANE:onafterPickup( Airplane, From, Event, To, Airbase, Speed ) + if self.Airbase then + Airplane:RespawnAtAirbase( self.Airbase ) + end + if Airplane and Airplane:IsAlive() then self.RoutePickup = true + self.Airbase = Airbase Airplane:RouteRTB( Airbase, Speed) end @@ -239,26 +244,31 @@ end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane -- @param From -- @param Event -- @param To - -- @param Wrapper.Airbase#AIRBASE Airbase +-- @param Wrapper.Airbase#AIRBASE Airbase -- @param #number Speed -function AI_CARGO_AIRPLANE:onafterDeploy( Airplane, From, Event, To, Coordinate, Speed ) +function AI_CARGO_AIRPLANE:onafterDeploy( Airplane, From, Event, To, Airbase, Speed ) + if self.Airbase then + Airplane:RespawnAtAirbase( self.Airbase ) + end + if Airplane and Airplane:IsAlive() then self.RouteDeploy = true + self.Airbase = Airbase - Airplane:RouteRTB( Airbase, Speed) + Airplane:RouteRTB( Airbase, Speed ) end end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterLoad( Airplane, From, Event, To, Coordinate ) if Airplane and Airplane:IsAlive() then @@ -276,7 +286,7 @@ function AI_CARGO_AIRPLANE:onafterLoad( Airplane, From, Event, To, Coordinate ) end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then @@ -291,7 +301,7 @@ function AI_CARGO_AIRPLANE:onafterBoard( Airplane, From, Event, To ) end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterLoaded( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then @@ -301,7 +311,7 @@ end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterUnload( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then @@ -312,7 +322,7 @@ function AI_CARGO_AIRPLANE:onafterUnload( Airplane, From, Event, To ) end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterUnboard( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then @@ -326,7 +336,7 @@ function AI_CARGO_AIRPLANE:onafterUnboard( Airplane, From, Event, To ) end --- @param #AI_CARGO_AIRPLANE self --- @param Wrapper.Unit#UNIT Airplane +-- @param Wrapper.Group#GROUP Airplane function AI_CARGO_AIRPLANE:onafterUnloaded( Airplane, From, Event, To ) if Airplane and Airplane:IsAlive() then diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index b160fdfda..6eb78eccc 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -688,7 +688,7 @@ function DATABASE:_RegisterAirbases() local DCSAirbaseName = DCSAirbase:getName() - self:E( { "Register Airbase:", DCSAirbaseName } ) + self:E( { "Register Airbase:", DCSAirbaseName, DCSAirbase:getID() } ) self:AddAirbase( DCSAirbaseName ) end end diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index be59a7723..af83d6553 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -1141,7 +1141,7 @@ function GROUP:Respawn( Template, Reset ) else for UnitID, TemplateUnitData in pairs( Template.units ) do self:F( "Reset" ) - local GroupUnitVec3 = { x = TemplateUnitData.x, y = TemplateUnitData.alt, z = TemplateUnitData.z } + local GroupUnitVec3 = { x = TemplateUnitData.x, y = TemplateUnitData.alt, z = TemplateUnitData.y } if Zone then if self.InitRespawnRandomizePositionZone then GroupUnitVec3 = Zone:GetRandomVec3() @@ -1174,7 +1174,101 @@ function GROUP:Respawn( Template, Reset ) end +--- @param Wrapper.Group#GROUP self +function GROUP:RespawnAtAirbase( AirbaseRespawn, Takeoff, TakeoffAltitude ) -- R2.4 + self:F( { AirbaseRespawn, Takeoff, TakeoffAltitude } ) + local PointVec3 = AirbaseRespawn:GetPointVec3() + + Takeoff = Takeoff or SPAWN.Takeoff.Hot + + local SpawnTemplate = self:GetTemplate() + + if SpawnTemplate then + + local SpawnPoint = SpawnTemplate.route.points[1] + + -- These are only for ships. + SpawnPoint.linkUnit = nil + SpawnPoint.helipadId = nil + SpawnPoint.airdromeId = nil + + local AirbaseID = AirbaseRespawn:GetID() + local AirbaseCategory = AirbaseRespawn:GetDesc().category + self:F( { AirbaseCategory = AirbaseCategory, Ship = Airbase.Category.SHIP, Helipad = Airbase.Category.HELIPAD, Airdrome = Airbase.Category.AIRDROME } ) + + if AirbaseCategory == Airbase.Category.SHIP then + SpawnPoint.linkUnit = AirbaseID + SpawnPoint.helipadId = AirbaseID + elseif AirbaseCategory == Airbase.Category.HELIPAD then + SpawnPoint.linkUnit = AirbaseID + SpawnPoint.helipadId = AirbaseID + elseif AirbaseCategory == Airbase.Category.AIRDROME then + SpawnPoint.airdromeId = AirbaseID + end + + SpawnPoint.alt = 0 + + SpawnPoint.type = GROUPTEMPLATE.Takeoff[Takeoff][1] -- type + SpawnPoint.action = GROUPTEMPLATE.Takeoff[Takeoff][2] -- action + + + -- Translate the position of the Group Template to the Vec3. + for UnitID = 1, #SpawnTemplate.units do + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + + -- These cause a lot of confusion. + local UnitTemplate = SpawnTemplate.units[UnitID] + + UnitTemplate.parking = 15 + UnitTemplate.parking_id = "30" + UnitTemplate.alt = 0 + + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnPoint.x + local BY = SpawnPoint.y + local TX = PointVec3.x + ( SX - BX ) + local TY = PointVec3.z + ( SY - BY ) + + UnitTemplate.x = TX + UnitTemplate.y = TY + + if Takeoff == GROUP.Takeoff.Air then + UnitTemplate.alt = PointVec3.y + ( TakeoffAltitude or 200 ) + --else + -- UnitTemplate.alt = PointVec3.y + 10 + end + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + end + + SpawnPoint.x = PointVec3.x + SpawnPoint.y = PointVec3.z + + if Takeoff == GROUP.Takeoff.Air then + SpawnPoint.alt = PointVec3.y + ( TakeoffAltitude or 200 ) + --else + -- SpawnPoint.alt = PointVec3.y + 10 + end + + SpawnTemplate.x = PointVec3.x + SpawnTemplate.y = PointVec3.z + + local GroupSpawned = self:Respawn( SpawnTemplate ) + + -- When spawned in the air, we need to generate a Takeoff Event + + if Takeoff == GROUP.Takeoff.Air then + for UnitID, UnitSpawned in pairs( GroupSpawned:GetUnits() ) do + SCHEDULER:New( nil, BASE.CreateEventTakeoff, { GroupSpawned, timer.getTime(), UnitSpawned:GetDCSObject() } , 1 ) + end + end + + return GroupSpawned + end + + return nil +end --- Return the mission template of the group.