From ab332f22e7e673d6052999004dce6d277e703645 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 7 Apr 2016 17:34:44 +0200 Subject: [PATCH 1/2] Updated the Escort class - Registering each excort at the client internally. - Each escort known at the client can exchange targets. - Each escort can acquire attack assistance from other escorts known at the client. - Made the MENU class more slick. Now menus are removed recursively for CLIENTS. - Added a few more types and fine tuned the documentation. --- Dcs/DCSCommand.lua | 10 + Dcs/DCSTask.lua | 8 +- Moose/Escort.lua | 390 +++++++++++++----- Moose/Group.lua | 149 +++++-- Moose/Menu.lua | 49 +++ Moose/Routines.lua | 7 + Moose/Unit.lua | 22 + .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 45378 -> 46128 bytes 8 files changed, 489 insertions(+), 146 deletions(-) create mode 100644 Dcs/DCSCommand.lua diff --git a/Dcs/DCSCommand.lua b/Dcs/DCSCommand.lua new file mode 100644 index 000000000..5e0040332 --- /dev/null +++ b/Dcs/DCSCommand.lua @@ -0,0 +1,10 @@ +--- @module DCSCommand + + +--- @type Command +-- @field #string id +-- @field #Command.params params + +--- @type Command.params + +env.info( "Command defined" ) \ No newline at end of file diff --git a/Dcs/DCSTask.lua b/Dcs/DCSTask.lua index 9c24ea895..344f52a25 100644 --- a/Dcs/DCSTask.lua +++ b/Dcs/DCSTask.lua @@ -1,10 +1,10 @@ --- @module DCSTask ---- @type DCSTask +--- @type Task -- @field #string id --- @field #DCSTask.param param +-- @field #Task.param param ---- @type DCSTask.param +--- @type Task.param -env.info( "DCSTask defined" ) +env.info( "Task defined" ) diff --git a/Moose/Escort.lua b/Moose/Escort.lua index 58016bb26..7be1f92fa 100644 --- a/Moose/Escort.lua +++ b/Moose/Escort.lua @@ -67,6 +67,7 @@ Include.File( "Database" ) Include.File( "Group" ) Include.File( "Zone" ) + --- ESCORT class -- @type ESCORT -- @extends Base#BASE @@ -77,6 +78,7 @@ Include.File( "Zone" ) -- @field #boolean ReportTargets If true, nearby targets are reported. -- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. -- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission ESCORT = { ClassName = "ESCORT", EscortName = nil, -- The Escort Name @@ -97,7 +99,7 @@ ESCORT = { -- @field #string ParamMessage --- ESCORT class constructor for an AI group --- @param self +-- @param #ESCORT self -- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. -- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. -- @param #string EscortName Name of the escort. @@ -110,7 +112,21 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) self.EscortGroup = EscortGroup -- Group#GROUP self.EscortName = EscortName self.EscortBriefing = EscortBriefing + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + + end + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) @@ -155,8 +171,6 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) -- Attack Targets self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack nearby targets", self.EscortMenu ) - self.EscortMenuAttackTargets = {} - self.Targets = {} -- Rules of Engagement self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) @@ -188,13 +202,11 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) end - -- Cancel current Task - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume Mission", self.EscortMenu ) - self.EscortMenuResumeWayPoints = {} - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - self.EscortMenuResumeWayPoints[WayPointID] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Resume from waypoint " .. WayPointID, self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume the escort mission", self.EscortMenu ) + + -- Exchange targets with other escorts of the CLIENT. This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Target assistance from other escorts", self.EscortMenu ) -- Initialize the EscortGroup @@ -207,9 +219,7 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. "We're escorting your flight. " .. - "You can communicate with us through the radio menu. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n" .. - "We are continuing our way, but you can request to join-up your flight under the Navigation menu\n", + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", 60, EscortClient ) end @@ -351,16 +361,40 @@ function ESCORT._ScanTargets( MenuParam ) local ScanDuration = MenuParam.ParamScanDuration - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - EscortGroup:PushTask( - EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - ) + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + routines.scheduleFunction( EscortGroup.PushTask, + { EscortGroup, + EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + timer.getTime() + 1 + ) + elseif EscortGroup:IsAirPlane() then + routines.scheduleFunction( EscortGroup.PushTask, + { EscortGroup, + EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + timer.getTime() + 1 + ) + end + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.FollowScheduler then + self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + end + end --- @param #MENUPARAM MenuParam @@ -369,18 +403,89 @@ function ESCORT._AttackTarget( MenuParam ) local self = MenuParam.ParamSelf local EscortGroup = self.EscortGroup local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTVertical() + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end self:T( AttackUnit ) - EscortGroup:PushTask( EscortGroup:TaskAttackUnit( AttackUnit ) ) + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTVertical() + routines.scheduleFunction( + EscortGroup.PushTask, + { EscortGroup, + EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskOrbitCircle( 500, 350 ) + } + ) + }, timer.getTime() + 10 + ) + else + routines.scheduleFunction( + EscortGroup.PushTask, + { EscortGroup, + EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, timer.getTime() + 10 + ) + end EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + + if self.FollowScheduler then + self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() + routines.scheduleFunction( + EscortGroupAttack.PushTask, + { EscortGroupAttack, + EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, timer.getTime() + 10 + ) + else + routines.scheduleFunction( + EscortGroupAttack.PushTask, + { EscortGroupAttack, + EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, timer.getTime() + 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + end --- @param #MENUPARAM MenuParam @@ -430,11 +535,15 @@ function ESCORT._ResumeMission( MenuParam ) table.remove( WayPoints, 1 ) end - EscortGroup:SetTask( EscortGroup:TaskRoute( WayPoints ) ) + routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) end +--- Registers the waypoints +-- @param #ESCORT self function ESCORT:RegisterRoute() + self:F() local EscortGroup = self.EscortGroup -- Group#GROUP @@ -442,9 +551,11 @@ function ESCORT:RegisterRoute() self:T( TaskPoints ) for TaskPointID, TaskPoint in pairs( TaskPoints ) do - self:T( TaskPointID ) - TaskPoint.task.params.tasks[#TaskPoint.task.params.tasks+1] = EscortGroup:TaskRegisterWayPoint( TaskPointID ) - self:T( TaskPoint.task.params.tasks[#TaskPoint.task.params.tasks] ) + self:T( { "TaskPoint:", TaskPointID, #TaskPoint.task.params.tasks+1, TaskPoint } ) + if TaskPointID > 1 then + TaskPoint.task.params.tasks[#TaskPoint.task.params.tasks+1] = EscortGroup:TaskRegisterWayPoint( TaskPointID ) + end + self:T( TaskPoint ) end self:T( TaskPoints ) @@ -530,7 +641,7 @@ function ESCORT:_FollowScheduler( FollowDistance ) -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome -- the requested Distance). - local Time = 30 + local Time = 10 local CatchUpSpeed = ( CatchUpDistance - ( CS * 2 ) ) / Time local Speed = CS + CatchUpSpeed @@ -555,110 +666,165 @@ end function ESCORT:_ReportTargetsScheduler() self:F() - self.Targets = {} if self.EscortGroup:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() local EscortTargets = self.EscortGroup:GetDetectedTargets() + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + local EscortTargetMessages = "" for EscortTargetID, EscortTarget in pairs( EscortTargets ) do local EscortObject = EscortTarget.object self:T( EscortObject ) if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - local EscortTargetMessage = "" - local EscortTargetUnit = UNIT:New( EscortObject ) - - local EscortTargetCategoryName = EscortTargetUnit:GetCategoryName() - local EscortTargetCategoryType = EscortTargetUnit:GetTypeName() + local EscortTargetUnitName = EscortTargetUnit:GetName() - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - if EscortTarget.distance then - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPositionVec3() - local EscortPositionVec3 = self.EscortGroup:GetPositionVec3() - local Distance = routines.utils.get3DDist( EscortTargetUnitPositionVec3, EscortPositionVec3 ) / 1000 - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget.visible } ) +-- local EscortTargetIsDetected, +-- EscortTargetIsVisible, +-- EscortTargetLastTime, +-- EscortTargetKnowType, +-- EscortTargetKnowDistance, +-- EscortTargetLastPos, +-- EscortTargetLastVelocity +-- = self.EscortGroup:IsTargetDetected( EscortObject ) +-- +-- self:T( { EscortTargetIsDetected, +-- EscortTargetIsVisible, +-- EscortTargetLastTime, +-- EscortTargetKnowType, +-- EscortTargetKnowDistance, +-- EscortTargetLastPos, +-- EscortTargetLastVelocity } ) + - if Distance <= 8 then + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPositionVec3() + local EscortPositionVec3 = self.EscortGroup:GetPositionVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 - if EscortTarget.type then - EscortTargetMessage = EscortTargetMessage .. " - " .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. " - Unknown target at " - end + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + if Distance <= 15 then - if EscortTarget.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - local TargetIndex = Distance*1000 - self.Targets[TargetIndex] = {} - self.Targets[TargetIndex].AttackMessage = EscortTargetMessage - self.Targets[TargetIndex].AttackUnit = EscortTargetUnit + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + self.EscortMenuTargetAssistance:RemoveSubMenus() + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " end - end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPositionVec3() + local EscortPositionVec3 = self.EscortGroup:GetPositionVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 - if EscortTargetMessage ~= "" then - EscortTargetMessages = EscortTargetMessages .. EscortTargetMessage .. "\n" + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + else + ClientEscortTargetData = nil end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) end - self:T() - - self:T( { "Sorting Targets Table:", self.Targets } ) - table.sort( self.Targets ) - self:T( { "Sorted Targets Table:", self.Targets } ) + self.EscortMenuResumeMission:RemoveSubMenus() - for MenuIndex = 1, #self.EscortMenuAttackTargets do - self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - end - - local MenuIndex = 1 - for TargetID, TargetData in pairs( self.Targets ) do - self:T( { "Adding menu:", TargetID, "for Unit", self.Targets[TargetID].AttackUnit } ) - if MenuIndex <= 10 then - self.EscortMenuAttackTargets[MenuIndex] = - MENU_CLIENT_COMMAND:New( self.EscortClient, - self.Targets[TargetID].AttackMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = self.Targets[TargetID].AttackUnit - } - ) - self:T( { "New Menu:", self.EscortMenuAttackTargets[TargetID] } ) - MenuIndex = MenuIndex + 1 - else - break - end +-- if self.EscortMenuResumeWayPoints then +-- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do +-- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) +-- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() +-- end +-- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPositionVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) end else diff --git a/Moose/Group.lua b/Moose/Group.lua index 4c043ae0e..9deb1242f 100644 --- a/Moose/Group.lua +++ b/Moose/Group.lua @@ -399,7 +399,7 @@ end -- @param #GROUP self -- @return Group#GROUP self function GROUP:SetTask( DCSTask ) - self:F() + self:F( { DCSTask } ) local Controller = self:_GetController() @@ -417,7 +417,7 @@ end -- @param #string condition -- @param #Time duration -- @param #number lastWayPoint --- return #DCSTask +-- return DCSTask#Task function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) self:F( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) @@ -435,9 +435,9 @@ end --- Return a Controlled Task taking a Task and a TaskCondition -- @param #GROUP self --- @param #DCSTask DCSTask +-- @param DCSTask#Task DCSTask -- @param #DCSStopCondition DCSStopCondition --- @return #DCSTask +-- @return DCSTask#Task function GROUP:TaskControlled( DCSTask, DCSStopCondition ) self:F( { DCSTask, DCSStopCondition } ) @@ -447,7 +447,7 @@ function GROUP:TaskControlled( DCSTask, DCSStopCondition ) id = 'ControlledTask', params = { task = DCSTask, - stopCondition = DCSStopCondition, + stopCondition = DCSStopCondition } } @@ -455,6 +455,47 @@ function GROUP:TaskControlled( DCSTask, DCSStopCondition ) return DCSTaskControlled end +--- Return a Combo Task taking an array of Tasks +-- @param #GROUP self +-- @param #list DCSTasks +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand ) + self:F( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + params = { + action = DCSCommand + } + } + + self:T( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + --- Orbit at a specified position at a specified alititude during a specified duration with a specified speed. -- @param #GROUP self -- @param #Vec2 Point The point to hold the position. @@ -566,7 +607,7 @@ end --- Attack the Unit. -- @param #GROUP self -- @param Unit#UNIT The unit. --- @return #DCSTask The DCS task structure. +-- @return DCSTask#Task The DCS task structure. function GROUP:TaskAttackUnit( AttackUnit ) self:F( { self.GroupName, AttackUnit } ) @@ -595,6 +636,33 @@ function GROUP:TaskAttackUnit( AttackUnit ) return DCSTask end +--- Fires at a VEC2 point. +-- @param #GROUP self +-- @param DCSTypes#Vec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F( { self.GroupName, PointVec2, Radius } ) + +-- FireAtPoint = { +-- id = 'FireAtPoint', +-- params = { +-- point = Vec2, +-- radius = Distance, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { point = PointVec2, + radius = Radius, + } + } + + self:T( { DCSTask } ) + return DCSTask +end + --- Move the group to a Vec2 Point, wait for a defined duration and embark a group. @@ -602,7 +670,7 @@ end -- @param #Vec2 Point The point where to wait. -- @param #number Duration The duration in seconds to wait. -- @param #GROUP EmbarkingGroup The group to be embarked. --- @return #DCSTask The DCS task structure +-- @return DCSTask#Task The DCS task structure function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) self:F( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) @@ -626,11 +694,11 @@ end -- @param #GROUP self -- @param #Vec2 Point The point where to wait. -- @param #number Radius The radius of the embarking zone around the Point. --- @return #DCSTask The DCS task structure. +-- @return DCSTask#Task The DCS task structure. function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) self:F( { self.GroupName, Point, Radius } ) - local DCSTask --#DCSTask + local DCSTask --DCSTask#Task DCSTask = { id = 'EmbarkToTransport', params = { x = Point.x, y = Point.y, @@ -645,7 +713,7 @@ end --- Return a Misson task from a mission template. -- @param #GROUP self -- @param #table TaskMission A table containing the mission task. --- @return #DCSTask +-- @return DCSTask#Task function GROUP:TaskMission( TaskMission ) self:F( Points ) @@ -659,7 +727,7 @@ end --- Return a Misson task to follow a given route defined by Points. -- @param #GROUP self -- @param #table Points A table of route points. --- @return #DCSTask +-- @return DCSTask#Task function GROUP:TaskRoute( Points ) self:F( Points ) @@ -722,28 +790,22 @@ function GROUP:Route( GoPoints ) return self end +--- Registers a Task to be executed at a waypoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint where to execute the task. +-- @return #string The task. function GROUP:TaskRegisterWayPoint( WayPoint ) local DCSTask - DCSTask = { id = "WrappedAction", - enabled = true, - auto = false, - number = 1, - params = - { - action = - { - id = "Script", - params = - { - command = "local MissionGroup = GROUP.FindGroup( ... ) " .. - "env.info( MissionGroup:GetName() ) " .. - "MissionGroup:RegisterWayPoint ( " .. WayPoint .. " )", - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - } + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + "local MissionGroup = GROUP:New( ... ) " .. + "env.info( MissionGroup:GetName() ) " .. + "MissionGroup:RegisterWayPoint ( " .. WayPoint .. " )" + ) + ) + self:T( DCSTask ) return DCSTask @@ -805,6 +867,26 @@ function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) return self end +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript + } + } + + self:T( DCSDoScript ) + return DCSDoScript +end + + --- Return the mission template of the group. -- @param #GROUP self -- @return #table The MissionTemplate @@ -891,7 +973,14 @@ end function GROUP:IsTargetDetected( DCSObject ) local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController():isTargetDetected( DCSObject ) + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity diff --git a/Moose/Menu.lua b/Moose/Menu.lua index 3d4320d6a..c6e6ee7df 100644 --- a/Moose/Menu.lua +++ b/Moose/Menu.lua @@ -108,6 +108,9 @@ function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) self.MenuClientGroupID = MenuClient:GetClientGroupID() self.MenuParentPath = MenuParentPath self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} if not _MENUCLIENTS[self.MenuClientGroupID] then _MENUCLIENTS[self.MenuClientGroupID] = {} @@ -124,9 +127,49 @@ function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) self.MenuPath = MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] end + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end return self end +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + --- The MENU_CLIENT_COMMAND class -- @type MENU_CLIENT_COMMAND @@ -158,6 +201,7 @@ function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuF self.MenuClientGroupID = MenuClient:GetClientGroupID() self.MenuParentPath = MenuParentPath self.MenuText = MenuText + self.ParentMenu = ParentMenu if not _MENUCLIENTS[self.MenuClientGroupID] then _MENUCLIENTS[self.MenuClientGroupID] = {} @@ -176,10 +220,14 @@ function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuF self.CommandMenuFunction = CommandMenuFunction self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + return self end function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) if not _MENUCLIENTS[self.MenuClientGroupID] then _MENUCLIENTS[self.MenuClientGroupID] = {} @@ -191,5 +239,6 @@ function MENU_CLIENT_COMMAND:Remove() MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil end missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil return nil end diff --git a/Moose/Routines.lua b/Moose/Routines.lua index f6be076c0..14f840d55 100644 --- a/Moose/Routines.lua +++ b/Moose/Routines.lua @@ -473,6 +473,13 @@ do rep - time between repetitions of this function (OPTIONAL) st - time when repetitions of this function will stop automatically (OPTIONAL) ]] + + --- Schedule a function + -- @param #function f + -- @param #table parameters + -- @param #Time t + -- @param #Time rep seconds + -- @param #Time st routines.scheduleFunction = function(f, vars, t, rep, st) --verify correct types assert(type(f) == 'function', 'variable 1, expected function, got ' .. type(f)) diff --git a/Moose/Unit.lua b/Moose/Unit.lua index 4de97bb7f..a6091a77c 100644 --- a/Moose/Unit.lua +++ b/Moose/Unit.lua @@ -49,6 +49,11 @@ UNIT = { -- @field Orange -- @field Blue + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @return Unit#UNIT function UNIT:New( DCSUnit ) local self = BASE:Inherit( self, BASE:New() ) self:F( DCSUnit:getName() ) @@ -231,4 +236,21 @@ function UNIT:SmokeBlue() trigger.action.smoke( self:GetPositionVec3(), trigger.smokeColor.Blue ) end +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T( IsAirResult ) + return IsAirResult +end diff --git a/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index 25366b60e05f4a6a8a19729c18b840adb3bc2543..d8593f8d4c9579bd2c4beecd6c4e6d927d37f532 100644 GIT binary patch delta 30103 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 H@2UR-3fM|3 delta 29443 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 Q;luxYP!JFrD*s;nAG3e)4FCWD From 8e901b61f4c2792dad8b531505a7835384e0fec1 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 8 Apr 2016 20:03:15 +0200 Subject: [PATCH 2/2] Fixed bugs and optimized ESCORT following logic - Optimized the following logic of planes and helicopters. - Fixed bugs with menus already present in the cache of the client. - Fixed a bug in the SPAWN ReSpawn function. - Optimized the JoinUp logic. --- Moose/Base.lua | 4 ++ Moose/Database.lua | 2 +- Moose/Escort.lua | 58 +++++++++++++----- Moose/Group.lua | 31 ++++++++-- Moose/Menu.lua | 25 ++++---- Moose/Spawn.lua | 24 +++++--- .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua | 27 ++++---- .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 46128 -> 45695 bytes 8 files changed, 117 insertions(+), 54 deletions(-) diff --git a/Moose/Base.lua b/Moose/Base.lua index 216b02e76..1d54ac663 100644 --- a/Moose/Base.lua +++ b/Moose/Base.lua @@ -303,6 +303,10 @@ end -- @param #string Class -- @param #string Method function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end _TraceClassMethod[Class].Method[Method] = true end diff --git a/Moose/Database.lua b/Moose/Database.lua index 479483ec4..b1ac948de 100644 --- a/Moose/Database.lua +++ b/Moose/Database.lua @@ -936,6 +936,6 @@ function LogClose() end end -_Database = DATABASE:New() +_Database = DATABASE:New() -- Database#DATABASE _Database:ScoreOpen() diff --git a/Moose/Escort.lua b/Moose/Escort.lua index 7be1f92fa..60b6c4e6d 100644 --- a/Moose/Escort.lua +++ b/Moose/Escort.lua @@ -29,23 +29,31 @@ -- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. -- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. -- --- **4. Attack nearby targets ...:** This menu item will list all detected targets within an 8km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- **4. Attack targets ...:** This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. -- --- **5. ROE ...:** Defines the Rules of Engagement of the escort group when in flight. +-- **5. Request assistance from ...:** This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- **6. ROE ...:** Defines the Rules of Engagement of the escort group when in flight. -- -- * **"Hold Fire":** The escort group will hold fire. -- * **"Return Fire":** The escort group will return fire. -- * **"Open Fire":** The escort group will open fire on designated targets. -- * **"Weapon Free":** The escort group will engage with any target. -- --- **6. Evasion ...:** Will define the evasion techniques that the escort group will perform during flight or combat. +-- **7. Evasion ...:** Will define the evasion techniques that the escort group will perform during flight or combat. -- -- * **"Fight until death":** The escort group will have no reaction to threats. -- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. -- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. -- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. -- --- **7. Resume Mission ...:** Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- **8. Resume Mission ...:** Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- **9. Abort Current Task:** Cancel the current task and rejoin formation. -- -- 1. ESCORT object construction methods. -- -------------------------------------- @@ -112,6 +120,8 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) self.EscortGroup = EscortGroup -- Group#GROUP self.EscortName = EscortName self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) -- Set EscortGroup known at EscortClient. if not self.EscortClient._EscortGroups then @@ -170,7 +180,12 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) end -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack nearby targets", self.EscortMenu ) + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + -- Rules of Engagement self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) @@ -205,9 +220,6 @@ function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) -- Mission Resume Menu Root self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume the escort mission", self.EscortMenu ) - -- Exchange targets with other escorts of the CLIENT. This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Target assistance from other escorts", self.EscortMenu ) - -- Initialize the EscortGroup EscortGroup:OptionROTVertical() @@ -284,13 +296,27 @@ function ESCORT._JoinUpAndFollow( MenuParam ) local Distance = MenuParam.ParamDistance + self:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + if self.FollowScheduler then routines.removeFunction( self.FollowScheduler ) end + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTVertical() + self.CT1 = 0 self.GT1 = 0 - self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, 1 ) + self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) end @@ -631,7 +657,7 @@ function ESCORT:_FollowScheduler( FollowDistance ) local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 2 + CVI.x, y = CVI.y, z = DVu.z * CS * 2 + CVI.z } + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } self:T2( { "CV2:", CV2 } ) self:T2( { "CVI:", CVI } ) self:T2( { "GDV:", GDV } ) @@ -642,7 +668,7 @@ function ESCORT:_FollowScheduler( FollowDistance ) -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome -- the requested Distance). local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 2 ) ) / Time + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time local Speed = CS + CatchUpSpeed if Speed < 0 then @@ -664,10 +690,9 @@ end --- Report Targets Scheduler. -- @param #ESCORT self function ESCORT:_ReportTargetsScheduler() - self:F() + self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() then + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then local EscortGroupName = self.EscortGroup:GetName() local EscortTargets = self.EscortGroup:GetDetectedTargets() @@ -720,7 +745,10 @@ function ESCORT:_ReportTargetsScheduler() ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end end end end diff --git a/Moose/Group.lua b/Moose/Group.lua index 9deb1242f..a654a751a 100644 --- a/Moose/Group.lua +++ b/Moose/Group.lua @@ -201,10 +201,11 @@ function GROUP:Destroy() self:F( self.GroupName ) for Index, UnitData in pairs( self.DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) + self:CreateEventDead( timer.getTime(), UnitData ) end self.DCSGroup:destroy() + self.DCSGroup = nil end --- Gets the DCS Unit. @@ -752,15 +753,37 @@ function GROUP:TaskRouteToVec3( Point, Speed ) PointFrom.x = GroupPoint.x PointFrom.y = GroupPoint.z PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + local PointTo = {} PointTo.x = Point.x PointTo.y = Point.z - PointTo.alt = Point.y + PointTo.alt = Point.y + PointTo.alt_type = "BARO" PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" PointTo.speed = Speed PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + local Points = { PointFrom, PointTo } @@ -1002,8 +1025,8 @@ function GROUP:OptionROEHoldFirePossible() end --- Holding weapons. --- @param #GROUP self --- @return #GROUP self +-- @param Group#GROUP self +-- @return Group#GROUP self function GROUP:OptionROEHoldFire() self:F( { self.GroupName } ) diff --git a/Moose/Menu.lua b/Moose/Menu.lua index c6e6ee7df..f386e118d 100644 --- a/Moose/Menu.lua +++ b/Moose/Menu.lua @@ -120,13 +120,14 @@ function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - if not MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] then - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] = self.MenuPath - else - self.MenuPath = MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) end + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) if ParentMenu and ParentMenu.Menus then @@ -211,13 +212,14 @@ function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuF self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - if not MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] then - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] = self.MenuPath - else - self.MenuPath = MenuPath[table.concat(MenuParentPath) .. "/" .. MenuText] + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) end - + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + self.CommandMenuFunction = CommandMenuFunction self.CommandMenuArgument = CommandMenuArgument @@ -238,6 +240,7 @@ function MENU_CLIENT_COMMAND:Remove() if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil end + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) self.ParentMenu.Menus[self.MenuPath] = nil return nil diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index c30a4b83f..eff339882 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -418,12 +418,15 @@ function SPAWN:ReSpawn( SpawnIndex ) SpawnIndex = 1 end - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - +-- TODO: This logic makes DCS crash and i don't know why (yet). +-- local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) +-- if SpawnGroup then +-- local SpawnDCSGroup = SpawnGroup:GetDCSGroup() +-- if SpawnDCSGroup then +-- SpawnGroup:Destroy() +-- end +-- end + return self:SpawnWithIndex( SpawnIndex ) end @@ -762,12 +765,15 @@ end function SPAWN:GetGroupFromIndex( SpawnIndex ) self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - if SpawnIndex then + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then local SpawnGroup = self.SpawnGroups[SpawnIndex].Group return SpawnGroup else - local SpawnGroup = self.SpawnGroups[1].Group - return SpawnGroup + return nil end end diff --git a/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua b/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua index 9cee0fa40..fa4516e7a 100644 --- a/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua +++ b/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua @@ -7,33 +7,32 @@ Include.File( "Escort" ) do local function EventAliveHelicopter( Client ) - local SpawnEscortHeli = SPAWN:New( "Escort Helicopter" ) - local SpawnEscortPlane = SPAWN:New( "Escort Plane" ) - local SpawnEscortGround = SPAWN:New( "Escort Ground" ) - local EscortGroupHeli1 = SpawnEscortHeli:Spawn() + local EscortGroupHeli1 = SpawnEscortHeli:ReSpawn(1) local EscortHeli1 = ESCORT:New( Client, EscortGroupHeli1, "Escort Alpha" ) - local EscortGroupPlane = SpawnEscortPlane:Spawn() + local EscortGroupPlane = SpawnEscortPlane:ReSpawn(1) local EscortPlane = ESCORT:New( Client, EscortGroupPlane, "Escort Test Plane" ) - local EscortGroupGround = SpawnEscortGround:Spawn() + local EscortGroupGround = SpawnEscortGround:ReSpawn(1) local EscortGround = ESCORT:New( Client, EscortGroupGround, "Test Ground" ) end local function EventAlivePlane( Client ) - local SpawnEscortPlane = SPAWN:New( "Escort Plane" ) - local EscortGroupPlane = SpawnEscortPlane:Spawn() + local EscortGroupPlane = SpawnEscortPlane:ReSpawn(1) local EscortPlane = ESCORT:New( Client, EscortGroupPlane, "Escort Test Plane" ) - local SpawnEscortGround = SPAWN:New( "Escort Ground" ) - local EscortGroupGround = SpawnEscortGround:Spawn() + local EscortGroupGround = SpawnEscortGround:ReSpawn(1) local EscortGround = ESCORT:New( Client, EscortGroupGround, "Test Ground" ) - local SpawnEscortShip = SPAWN:New( "Escort Ship" ) - local EscortGroupShip = SpawnEscortShip:Spawn() + local EscortGroupShip = SpawnEscortShip:ReSpawn(1) local EscortShip = ESCORT:New( Client, EscortGroupShip, "Test Ship" ) end - local EscortClientHeli = CLIENT:New( "Lead Helicopter", "Fly around and observe the behaviour of the escort helicopter" ):Alive( EventAliveHelicopter ) - local EscortClientPlane = CLIENT:New( "Lead Plane", "Fly around and observe the behaviour of the escort airplane. Select Navigate->Joun-Up and airplane should follow you. Change speed and directions." ) + SpawnEscortHeli = SPAWN:New( "Escort Helicopter" ) + SpawnEscortPlane = SPAWN:New( "Escort Plane" ) + SpawnEscortGround = SPAWN:New( "Escort Ground" ) + SpawnEscortShip = SPAWN:New( "Escort Ship" ) + + EscortClientHeli = CLIENT:New( "Lead Helicopter", "Fly around and observe the behaviour of the escort helicopter" ):Alive( EventAliveHelicopter ) + EscortClientPlane = CLIENT:New( "Lead Plane", "Fly around and observe the behaviour of the escort airplane. Select Navigate->Joun-Up and airplane should follow you. Change speed and directions." ) :Alive( EventAlivePlane ) end diff --git a/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index d8593f8d4c9579bd2c4beecd6c4e6d927d37f532..b644553bda09c93b8234d4fafc2b14be6c928e3d 100644 GIT binary patch delta 16628 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

kW`>Eb!2KOXp+4uVIHp7VX^$(Yb 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 bxNNeAD&2b&0^