diff --git a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua index 679900301..a55bf0d10 100644 --- a/Moose Development/Moose/AI/AI_Cargo_Airplane.lua +++ b/Moose Development/Moose/AI/AI_Cargo_Airplane.lua @@ -228,16 +228,10 @@ 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:Route( Airplane, Airbase, Speed ) self.RoutePickup = true self.Airbase = Airbase - - Airplane:RouteRTB( Airbase, Speed) end end @@ -252,16 +246,10 @@ end -- @param #number 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:Route( Airplane, Airbase, Speed ) self.RouteDeploy = true self.Airbase = Airbase - - Airplane:RouteRTB( Airbase, Speed ) end end @@ -346,3 +334,115 @@ function AI_CARGO_AIRPLANE:onafterUnloaded( Airplane, From, Event, To ) end +--- @param #AI_CARGO_AIRPLANE self +-- @param Wrapper.Group#GROUP Airplane +-- @param Wrapper.Airbase#AIRBASE Airbase +-- @param #number Speed +function AI_CARGO_AIRPLANE:Route( Airplane, Airbase, Speed ) + + if Airplane and Airplane:IsAlive() then + + local PointVec3 = Airplane:GetPointVec3() + + local Takeoff = SPAWN.Takeoff.Hot + + local Template = Airplane:GetTemplate() + + if Template then + + local Points = {} + + if self.Airbase then + + local FromWaypoint = Template.route.points[1] + + -- These are only for ships. + FromWaypoint.linkUnit = nil + FromWaypoint.helipadId = nil + FromWaypoint.airdromeId = nil + + local AirbaseID = self.Airbase:GetID() + local AirbaseCategory = self.Airbase:GetDesc().category + + FromWaypoint.airdromeId = AirbaseID + + FromWaypoint.alt = 0 + + FromWaypoint.type = GROUPTEMPLATE.Takeoff[Takeoff][1] -- type + FromWaypoint.action = GROUPTEMPLATE.Takeoff[Takeoff][2] -- action + + + -- Translate the position of the Group Template to the Vec3. + for UnitID = 1, #Template.units do + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. Template.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. Template.units[UnitID].y ) + + -- These cause a lot of confusion. + local UnitTemplate = Template.units[UnitID] + + UnitTemplate.parking = 15 + UnitTemplate.parking_id = "1" + UnitTemplate.alt = 0 + + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = FromWaypoint.x + local BY = FromWaypoint.y + local TX = PointVec3.x + ( SX - BX ) + local TY = PointVec3.z + ( SY - BY ) + + UnitTemplate.x = TX + UnitTemplate.y = TY + + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + end + + FromWaypoint.x = PointVec3.x + FromWaypoint.y = PointVec3.z + + Points[#Points+1] = FromWaypoint + else + + local GroupPoint = Airplane:GetVec2() + local GroupVelocity = Airplane:GetUnit(1):GetDesc().speedMax + + local FromWaypoint = {} + FromWaypoint.x = GroupPoint.x + FromWaypoint.y = GroupPoint.y + FromWaypoint.type = "Turning Point" + FromWaypoint.action = "Turning Point" + FromWaypoint.speed = GroupVelocity + + Points[#Points+1] = FromWaypoint + end + + local AirbasePointVec2 = Airbase:GetPointVec2() + local ToWaypoint = AirbasePointVec2:WaypointAir( + POINT_VEC3.RoutePointAltType.BARO, + "Land", + "Landing", + Speed or Airplane:GetUnit(1):GetDesc().speedMax + ) + + ToWaypoint["airdromeId"] = Airbase:GetID() + ToWaypoint["speed_locked"] = true, + + self:F( ToWaypoint ) + + Points[#Points+1] = ToWaypoint + + Template.x = PointVec3.x + Template.y = PointVec3.z + + self:T3( Points ) + Template.route.points = Points + + --self:Respawn( Template ) + + local GroupSpawned = Airplane:Respawn( Template ) + + return GroupSpawned + end + + end + +end diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index f642d79b1..555786ab4 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -645,6 +645,22 @@ function BASE:CreateEventCrash( EventTime, Initiator ) world.onEvent( Event ) end +--- Creation of a Dead Event. +-- @param #BASE self +-- @param Dcs.DCSTypes#Time EventTime The time stamp of the event. +-- @param Dcs.DCSWrapper.Object#Object Initiator The initiating object of the event. +function BASE:CreateEventDead( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_DEAD, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + --- Creation of a Takeoff Event. -- @param #BASE self -- @param Dcs.DCSTypes#Time EventTime The time stamp of the event. diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index af83d6553..c595a5dbb 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -236,19 +236,36 @@ function GROUP:IsAlive() end --- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. +-- Note that this destroy method also can raise a destroy event at run-time. +-- So all event listeners will catch the destroy event of this group for each unit in the group. +-- To raise these events, provide the `GenerateEvent` parameter. -- @param #GROUP self --- @param #boolean GenerateEvent +-- @param #boolean GenerateEvent true if you want to generate a crash or dead event for each unit. +-- @usage +-- -- Air unit example: destroy the Helicopter and generate a S_EVENT_CRASH for each unit in the Helicopter group. +-- Helicopter = GROUP:FindByName( "Helicopter" ) +-- Helicopter:Destroy( true ) +-- @usage +-- -- Ground unit example: destroy the Tanks and generate a S_EVENT_DEAD for each unit in the Tanks group. +-- Tanks = GROUP:FindByName( "Tanks" ) +-- Tanks:Destroy( true ) +-- @usage +-- -- Ship unit example: destroy the Ship silently. +-- Ship = GROUP:FindByName( "Ship" ) +-- Ship:Destroy( true ) function GROUP:Destroy( GenerateEvent ) self:F2( self.GroupName ) local DCSGroup = self:GetDCSObject() if DCSGroup then - if not GenerateEvent then + if GenerateEvent and GenerateEvent == true then for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) + if self:IsAir() then + self:CreateEventCrash( timer.getTime(), UnitData ) + else + self:CreateEventDead( timer.getTime(), UnitData ) + end end end USERFLAG:New( self:GetName() ):Set( 100 ) @@ -1394,7 +1411,7 @@ do -- Route methods -- @param #number Speed (optional) The Speed, if no Speed is given, the maximum Speed of the first unit is selected. -- @return #GROUP function GROUP:RouteRTB( RTBAirbase, Speed ) - self:F2( { RTBAirbase, Speed } ) + self:F( { RTBAirbase:GetName(), Speed } ) local DCSGroup = self:GetDCSObject() @@ -1435,9 +1452,7 @@ do -- Route methods Template.route.points = Points self:Respawn( Template ) - self:Route( Points ) - - self:Respawn(Template) + --self:Route( Points ) else self:ClearTasks() end