From 71b2cc1ee55fb5d1c001dbd28bcf7eaf6ba846e2 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Mon, 3 Jul 2023 17:06:31 +0200 Subject: [PATCH 1/2] #AMMOTRUCK * Added TTL --- .../Moose/Functional/AmmoTruck.lua | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/Moose Development/Moose/Functional/AmmoTruck.lua b/Moose Development/Moose/Functional/AmmoTruck.lua index e33ae8a52..83b177bef 100644 --- a/Moose Development/Moose/Functional/AmmoTruck.lua +++ b/Moose Development/Moose/Functional/AmmoTruck.lua @@ -17,7 +17,7 @@ -- @module Functional.AmmoTruck -- @image Artillery.JPG -- --- Date: Nov 2022 +-- Last update: July 2023 ------------------------------------------------------------------------- --- **AMMOTRUCK** class, extends Core.FSM#FSM @@ -40,6 +40,7 @@ -- @field #number unloadtime Unload time in seconds -- @field #number waitingtime Max waiting time in seconds -- @field #boolean routeonroad Route truck on road if true (default) +-- @field #number reloads Number of reloads a single truck can do before he must return home -- @extends Core.FSM#FSM --- *Amateurs talk about tactics, but professionals study logistics.* - General Robert H Barrow, USMC @@ -73,9 +74,10 @@ -- ammotruck.remunidist = 20000 -- 20km - send trucks max this far from home -- ammotruck.unloadtime = 600 -- 10 minutes - min time to unload ammunition -- ammotruck.waitingtime = 1800 -- 30 mintes - wait max this long until remunition is done --- ammotruck.monitor = -60 - 1 minute - AMMOTRUCK checks on things every 1 minute --- ammotruck.routeonroad = true - Trucks will **try** to drive on roads --- ammotruck.usearmygroup = false - if true, will make use of ARMYGROUP in the background (if used in DEV branch) +-- ammotruck.monitor = -60 -- 1 minute - AMMOTRUCK checks run every one minute +-- ammotruck.routeonroad = true -- Trucks will **try** to drive on roads +-- ammotruck.usearmygroup = false -- If true, will make use of ARMYGROUP in the background (if used in DEV branch) +-- ammotruck.reloads = 5 -- Maxn re-arms a truck can do before he needs to go home and restock. Set to -1 for unlimited -- -- ## 3 FSM Events to shape mission -- @@ -113,7 +115,7 @@ AMMOTRUCK = { ClassName = "AMMOTRUCK", lid = "", - version = "0.0.10", + version = "0.0.12", alias = "", debug = false, trucklist = {}, @@ -128,7 +130,8 @@ AMMOTRUCK = { monitor = -60, unloadtime = 600, waitingtime = 1800, - routeonroad = true + routeonroad = true, + reloads = 5, } --- @@ -156,6 +159,7 @@ AMMOTRUCK.State = { --@field #string targetname --@field Wrapper.Group#GROUP targetgroup --@field Core.Point#COORDINATE targetcoordinate +--@field #number reloads --- -- @param #AMMOTRUCK self @@ -369,6 +373,7 @@ function AMMOTRUCK:CheckReturningTrucks(dataset) truck.statusquo = AMMOTRUCK.State.IDLE truck.timestamp = timer.getAbsTime() truck.coordinate = coord + truck.reloads = self.reloads or 5 self:__TruckHome(1,truck) end end @@ -540,6 +545,7 @@ function AMMOTRUCK:CheckTrucksAlive() newtruck.statusquo = AMMOTRUCK.State.IDLE newtruck.timestamp = timer.getAbsTime() newtruck.coordinate = truck:GetCoordinate() + newtruck.reloads = self.reloads or 5 self.trucklist[name] = newtruck end end @@ -626,8 +632,10 @@ function AMMOTRUCK:onafterMonitor(From, Event, To) unloadingtrucks[#unloadingtrucks+1] = data elseif data.statusquo == AMMOTRUCK.State.RETURNING then returningtrucks[#returningtrucks+1] = data + if data.reloads > 0 or data.reloads == -1 then idletrucks[#idletrucks+1] = data found = true + end end else self.truckset[data.name] = nil @@ -637,7 +645,7 @@ function AMMOTRUCK:onafterMonitor(From, Event, To) local n=0 if found and remunition then -- match - local match = false + --local match = false for _,_truckdata in pairs(idletrucks) do local truckdata = _truckdata -- #AMMOTRUCK.data local truckcoord = truckdata.group:GetCoordinate() -- Core.Point#COORDINATE @@ -750,6 +758,12 @@ end end local scheduler = SCHEDULER:New(nil,destroyammo,{ammo},self.waitingtime) + + -- one reload less + if truck.reloads ~= -1 then + truck.reloads = truck.reloads - 1 + end + return self end --- From 10872918bb7d0319a3d6ac3551498835b30ca44c Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Mon, 3 Jul 2023 17:29:06 +0200 Subject: [PATCH 2/2] #AUFTRAG * Added GROUNDESCORT from the DCS Task with same name --- Moose Development/Moose/Ops/Auftrag.lua | 60 ++++++++++++++++++++- Moose Development/Moose/Utilities/Enums.lua | 2 + 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 00fb6ddbd..7d4deac86 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -1,3 +1,4 @@ +---@diagnostic disable: undefined-global --- **Ops** - Auftrag (mission) for Ops. -- -- ## Main Features: @@ -259,6 +260,10 @@ -- -- Not implemented yet. -- +-- ## Ground Escort +-- +-- An escort mission can be created with the @{#AUFTRAG.NewGROUNDESCORT}() function. +-- -- ## Intercept -- -- An intercept mission can be created with the @{#AUFTRAG.NewINTERCEPT}() function. @@ -406,6 +411,7 @@ _AUFTRAGSNR=0 -- @field #string FAC Forward AirController mission. -- @field #string FACA Forward AirController airborne mission. -- @field #string FERRY Ferry mission. +-- @field #string GROUNDESCORT Ground escort mission. -- @field #string INTERCEPT Intercept mission. -- @field #string ORBIT Orbit mission. -- @field #string GCICAP Similar to CAP but no auto engage targets. @@ -450,6 +456,7 @@ AUFTRAG.Type={ FAC="FAC", FACA="FAC-A", FERRY="Ferry Flight", + GROUNDESCORT="Ground Escort", INTERCEPT="Intercept", ORBIT="Orbit", GCICAP="Ground Controlled CAP", @@ -477,7 +484,7 @@ AUFTRAG.Type={ RELOCATECOHORT="Relocate Cohort", AIRDEFENSE="Air Defence", EWR="Early Warning Radar", - RECOVERYTANKER="Recovery Tanker", + --RECOVERYTANKER="Recovery Tanker", REARMING="Rearming", CAPTUREZONE="Capture Zone", NOTHING="Nothing", @@ -1740,6 +1747,43 @@ function AUFTRAG:NewBOMBCARPET(Target, Altitude, CarpetLength) return mission end +--- **[AIR/HELO]** Create a GROUNDESCORT (or FOLLOW) mission. Helo will escort a **ground** group and automatically engage certain target types. +-- @param #AUFTRAG self +-- @param Wrapper.Group#GROUP EscortGroup The ground group to escort. +-- @param #number OrbitDistance Orbit to/from the lead unit this many NM. Defaults to 1.5 NM. +-- @param #table TargetTypes Types of targets to engage automatically. Default is {"Ground vehicles"}, i.e. all enemy ground units. Use an empty set {} for a simple "FOLLOW" mission. +-- @return #AUFTRAG self +function AUFTRAG:NewGROUNDESCORT(EscortGroup, OrbitDistance, TargetTypes) + + local mission=AUFTRAG:New(AUFTRAG.Type.GROUNDESCORT) + + -- If only a string is passed we set a variable and check later if the group exists. + if type(EscortGroup)=="string" then + mission.escortGroupName=EscortGroup + mission:_TargetFromObject() + else + mission:_TargetFromObject(EscortGroup) + end + + -- DCS task parameters: + mission.orbitDistance=OrbitDistance and UTILS.NMToMeters(OrbitDistance) or UTILS.NMToMeters(1.5) + --mission.engageMaxDistance=EngageMaxDistance and UTILS.NMToMeters(EngageMaxDistance) or UTILS.NMToMeters(5) + mission.engageTargetTypes=TargetTypes or {"Ground vehicles"} + + -- Mission options: + mission.missionTask=ENUMS.MissionTask.GROUNDESCORT + mission.missionFraction=0.1 + mission.missionAltitude=100 + mission.optionROE=ENUMS.ROE.OpenFire -- TODO: what's the best ROE here? Make dependent on ESCORT or FOLLOW! + mission.optionROT=ENUMS.ROT.EvadeFire + + mission.categories={AUFTRAG.Category.HELICOPTER} + + mission.DCStask=mission:GetDCSMissionTask() + + return mission +end + --- **[AIR]** Create an ESCORT (or FOLLOW) mission. Flight will escort another group and automatically engage certain target types. -- @param #AUFTRAG self @@ -5843,10 +5887,20 @@ function AUFTRAG:GetDCSMissionTask() -- ESCORT Mission -- -------------------- - local DCStask=CONTROLLABLE.TaskEscort(nil, self.engageTarget:GetObject(), self.escortVec3, LastWaypointIndex, self.engageMaxDistance, self.engageTargetTypes) + local DCStask=CONTROLLABLE.TaskEscort(nil, self.engageTarget:GetObject(), self.escortVec3, nil, self.engageMaxDistance, self.engageTargetTypes) table.insert(DCStasks, DCStask) + + elseif self.type==AUFTRAG.Type.GROUNDESCORT then + -------------------- + -- GROUNDESCORT Mission -- + -------------------- + + local DCSTask=CONTROLLABLE.TaskGroundEscort(nil,self.engageTarget:GetObject(),nil,self.orbitDistance,self.engageTargetTypes) + + table.insert(DCStasks, DCSTask) + elseif self.type==AUFTRAG.Type.FACA then ------------------ @@ -6528,6 +6582,8 @@ function AUFTRAG:GetMissionTaskforMissionType(MissionType) mtask=ENUMS.MissionTask.AFAC elseif MissionType==AUFTRAG.Type.FERRY then mtask=ENUMS.MissionTask.NOTHING + elseif MissionType==AUFTRAG.Type.GROUNDESCORT then + mtask=ENUMS.MissionTask.GROUNDESCORT elseif MissionType==AUFTRAG.Type.INTERCEPT then mtask=ENUMS.MissionTask.INTERCEPT elseif MissionType==AUFTRAG.Type.RECON then diff --git a/Moose Development/Moose/Utilities/Enums.lua b/Moose Development/Moose/Utilities/Enums.lua index 6c47c5216..b00552dcf 100644 --- a/Moose Development/Moose/Utilities/Enums.lua +++ b/Moose Development/Moose/Utilities/Enums.lua @@ -236,6 +236,7 @@ ENUMS.WeaponType.Any={ -- @field #string ESCORT Escort another group. -- @field #string FIGHTERSWEEP Fighter sweep. -- @field #string GROUNDATTACK Ground attack. +-- @field #string GROUNDESCORT Ground escort another group. -- @field #string INTERCEPT Intercept. -- @field #string PINPOINTSTRIKE Pinpoint strike. -- @field #string RECONNAISSANCE Reconnaissance mission. @@ -251,6 +252,7 @@ ENUMS.MissionTask={ CAP="CAP", CAS="CAS", ESCORT="Escort", + GROUNDESCORT="Ground escort", FIGHTERSWEEP="Fighter Sweep", GROUNDATTACK="Ground Attack", INTERCEPT="Intercept",