From 7d217e6db1f9939f1379fea0af03a824d1d7ff63 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Mon, 27 Jan 2025 23:32:16 +0100 Subject: [PATCH 1/9] Show/remove/refresh marks on targets in LOS for a unit --- CTLD.lua | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/CTLD.lua b/CTLD.lua index d84f171..989416a 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -7266,6 +7266,76 @@ function ctld.getPositionString(_unit) return " @ " .. _latLngStr .. " - MGRS " .. _mgrsString end +--********************************************************************** +-- RECOGNITION SUPPORT FUNCTIONS +-- Shows/remove/refresh marks in F10 map on targets in LOS of a unit passed in params +--------------------------------------------------------------------- +-- examples --------------------------------------------------------- +--ctld.showTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) +--ctld.removeTargetsInLosOnF10Map(Unit.getByName("uh2-1")) +-- +--ctld.showTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) +--ctld.refreshTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) +---------------------------------------------------------------------- +if ctld == nil then + ctld = {} +end +if ctld.lastMarkId == nil then + ctld.lastMarkId = 0 +end +-------------------------------------------------------------------- +function ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) -- _unitObject targeting + -- _searchRadius and _markRadius in meters + if _unitObject then + local enemyCoa = 1 + local enemyColor = "red" + local color = {1, 0, 0, 0.2} -- red + + if _unitObject:getCoalition() == 1 then + enemyCoa = 2 + enemyColor = "blue" + color = {51/255, 51/255, 1, 0.2} -- blue + end + + local t = mist.getUnitsLOS({_unitObject:getName()}, 180, mist.makeUnitTable({'['..enemyColor..'][vehicle]'}),180, _searchRadius) + + local MarkIds = {} + if t then + for i=1, #t do -- for each unit having los on enemies + for j=1, #t[i].vis do + local targetPoint = t[i].vis[j]:getPoint() -- point of each target on LOS + ctld.lastMarkId = ctld.lastMarkId + 1 + trigger.action.circleToAll(_unitObject:getCoalition(), ctld.lastMarkId, targetPoint, _markRadius , color, color, 1, false, nil) + MarkIds[#MarkIds+1] = ctld.lastMarkId + end + end + end + mist.DBs.humansByName[_unitObject:getName()].losMarkIds = MarkIds -- store list of marksIds generated and show on F10 map + return true + else + return false + end +end +--------------------------------------------------------- +function ctld.removeTargetsInLosOnF10Map(_unitObject) + local unitName = _unitObject:getName() + if mist.DBs.humansByName[unitName].losMarkIds then + for i=1, #mist.DBs.humansByName[_unitObject:getName()].losMarkIds do -- for each unit having los on enemies + trigger.action.removeMark(mist.DBs.humansByName[unitName].losMarkIds[i]) + end + mist.DBs.humansByName[unitName].losMarkIds = nil + end +end +--------------------------------------------------------- +function ctld.refreshTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) + ctld.removeTargetsInLosOnF10Map(_unitObject) + ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) +end +--- test ------------------------------------------------------ +--"uh1-1" --"uh2-1" +--local unitName = "uh2-1" +--ctld.showTargetsInLosOnF10Map(Unit.getByName(unitName),2000,200) +--********************************************************************** -- ***************** SETUP SCRIPT **************** function ctld.initialize() From e4bc932d280587e2e099e81bd0de0d686fa17b91 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 00:01:14 +0100 Subject: [PATCH 2/9] Show & refresh fct returns targetsInLOS table --- CTLD.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index 989416a..fdacf59 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -7287,6 +7287,8 @@ end function ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) -- _unitObject targeting -- _searchRadius and _markRadius in meters if _unitObject then + local TargetsInLOS = {} + local enemyCoa = 1 local enemyColor = "red" local color = {1, 0, 0, 0.2} -- red @@ -7307,13 +7309,14 @@ function ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) ctld.lastMarkId = ctld.lastMarkId + 1 trigger.action.circleToAll(_unitObject:getCoalition(), ctld.lastMarkId, targetPoint, _markRadius , color, color, 1, false, nil) MarkIds[#MarkIds+1] = ctld.lastMarkId + TargetsInLOS[#TargetsInLOS+1] = {targetObject=t[i].vis[j]:getName(), targetTypeName=t[i].vis[j]:getTypeName(), targetPoint=targetPoint} end end end mist.DBs.humansByName[_unitObject:getName()].losMarkIds = MarkIds -- store list of marksIds generated and show on F10 map - return true + return TargetsInLOS else - return false + return nil end end --------------------------------------------------------- @@ -7329,7 +7332,7 @@ end --------------------------------------------------------- function ctld.refreshTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) ctld.removeTargetsInLosOnF10Map(_unitObject) - ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) + return ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) -- returns TargetsInLOS table end --- test ------------------------------------------------------ --"uh1-1" --"uh2-1" From 4146408fe8dcc024985524f0a10f81c923192d9f Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:34:11 +0100 Subject: [PATCH 3/9] Add menu F10 cdes for F10 map Marks of targets in LOS --- CTLD.lua | 163 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 137 insertions(+), 26 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index fdacf59..48eb0d9 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -5703,6 +5703,11 @@ function ctld.addOtherF10MenuOptions() ctld.addJTACRadioCommand(2) -- get all BLUE players ctld.addJTACRadioCommand(1) -- get all RED players end + + if ctld.reconF10Menu then + ctld.addReconRadioCommand(2) -- get all BLUE players + ctld.addReconRadioCommand(1) -- get all RED players + end end) if (not status) then @@ -7267,15 +7272,14 @@ function ctld.getPositionString(_unit) end --********************************************************************** --- RECOGNITION SUPPORT FUNCTIONS +-- RECOGNITION SUPPORT FUNCTIONS -- Shows/remove/refresh marks in F10 map on targets in LOS of a unit passed in params --------------------------------------------------------------------- -- examples --------------------------------------------------------- ---ctld.showTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) ---ctld.removeTargetsInLosOnF10Map(Unit.getByName("uh2-1")) --- ---ctld.showTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) ---ctld.refreshTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) +--ctld.reconRefreshTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) +--ctld.reconRemoveTargetsInLosOnF10Map(Unit.getByName("uh2-1")) + +--ctld.reconShowTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) ---------------------------------------------------------------------- if ctld == nil then ctld = {} @@ -7283,61 +7287,168 @@ end if ctld.lastMarkId == nil then ctld.lastMarkId = 0 end + +-- ***************** RECON CONFIGURATION ***************** +ctld.reconF10Menu = true -- enables F10 RECON menu +ctld.reconMenuName = ctld.i18n_translate("RECON") --name of the CTLD JTAC radio menu +ctld.reconRadioAdded = {} --stores the groups that have had the radio menu added +ctld.reconLosSearchRadius = 2000 -- search radius in meters +ctld.reconLosMarkRadius = 100 -- mark radius dimension in meters +ctld.reconAutoRefreshLosTargetMarks = true -- if true recon LOS marks are automaticaly refreshed on F10 map +ctld.reconLastScheduleIdAutoRefresh = 0 + +---- F10 RECON Menus ------------------------------------------------------------------ +function ctld.addReconRadioCommand(_side) -- _side = 1 or 2 (red or blue) + if ctld.reconF10Menu then + if _side == 1 or _side == 2 then + local _players = coalition.getPlayers(_side) + if _players ~= nil then + for _, _playerUnit in pairs(_players) do + local _groupId = ctld.getGroupId(_playerUnit) + if _groupId then + if ctld.reconRadioAdded[tostring(_groupId)] == nil then + ctld.logDebug("ctld.addReconRadioCommand - adding RECON radio menu for unit [%s]", ctld.p(_playerUnit:getName())) + local RECONpath = missionCommands.addSubMenuForGroup(_groupId, ctld.reconMenuName) + missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("Show targets in LOS (refresh)"), RECONpath, + ctld.reconRefreshTargetsInLosOnF10Map, { _groupId = _groupId, + _playerUnit = _playerUnit, + _searchRadius = ctld.reconLosSearchRadius, + _markRadius = ctld.reconLosMarkRadius, + _boolRemove = true}) + missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Hide targets in LOS"), RECONpath, ctld.reconRemoveTargetsInLosOnF10Map, _playerUnit) + if ctld.reconAutoRefreshLosTargetMarks then + local c1 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), RECONpath, + ctld.reconStopAutorefreshTargetsInLosOnF10Map, _groupId, _playerUnit) +trigger.action.outText(tostring(_groupId).." - " .. mist.utils.tableShow(c1), 20) + else + local c2 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), RECONpath, + ctld.reconStartAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit, + ctld.reconLosSearchRadius, + ctld.reconLosMarkRadius, + true + ) +trigger.action.outText(tostring(_groupId).." - " .. mist.utils.tableShow(c2), 20) + end + ctld.reconRadioAdded[tostring(_groupId)] = timer.getTime() --fetch the time to check for a regular refresh + else + + end + end + end + end + end + end +end -------------------------------------------------------------------- -function ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) -- _unitObject targeting - -- _searchRadius and _markRadius in meters - if _unitObject then +function ctld.reconStopAutorefreshTargetsInLosOnF10Map(_groupId, _playerUnit) + ctld.reconAutoRefreshLosTargetMarks = false + + if ctld.reconLastScheduleIdAutoRefresh ~= 0 then + timer.removeFunction(ctld.reconLastScheduleIdAutoRefresh) -- reset last schedule + end + + ctld.reconRemoveTargetsInLosOnF10Map(_playerUnit) + missionCommands.removeItemForGroup(_groupId, {ctld.reconMenuName, ctld.i18n_translate("STOP autoRefresh targets in LOS")}) + missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), {ctld.reconMenuName}, + ctld.reconStartAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit, + _searchRadius, + _markRadius, + _boolRemove) +end +-------------------------------------------------------------------- +function ctld.reconStartAutorefreshTargetsInLosOnF10Map(_groupId, _playerUnit, _searchRadius, _markRadius, _boolRemove) + ctld.reconAutoRefreshLosTargetMarks = true + ctld.reconRefreshTargetsInLosOnF10Map({ _groupId = _groupId, + _playerUnit = _playerUnit, + _searchRadius = ctld.reconLosSearchRadius, + _markRadius = ctld.reconLosMarkRadius, + _boolRemove = true}, + timer.getTime()) + missionCommands.removeItemForGroup( _groupId, {ctld.reconMenuName, ctld.i18n_translate("START autoRefresh targets in LOS")}) + missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), {ctld.reconMenuName}, + ctld.reconStopAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit) +end +-------------------------------------------------------------------- +function ctld.reconShowTargetsInLosOnF10Map(_playerUnit, _searchRadius, _markRadius) -- _groupId targeting + -- _searchRadius and _markRadius in meters + if _playerUnit then local TargetsInLOS = {} local enemyCoa = 1 local enemyColor = "red" local color = {1, 0, 0, 0.2} -- red - if _unitObject:getCoalition() == 1 then + if _playerUnit:getCoalition() == 1 then enemyCoa = 2 enemyColor = "blue" color = {51/255, 51/255, 1, 0.2} -- blue end - local t = mist.getUnitsLOS({_unitObject:getName()}, 180, mist.makeUnitTable({'['..enemyColor..'][vehicle]'}),180, _searchRadius) + local t = mist.getUnitsLOS({_playerUnit:getName()}, 180, mist.makeUnitTable({'['..enemyColor..'][vehicle]'}),180, _searchRadius) local MarkIds = {} if t then - for i=1, #t do -- for each unit having los on enemies - for j=1, #t[i].vis do - local targetPoint = t[i].vis[j]:getPoint() -- point of each target on LOS + for i=1, #t do -- for each unit having los on enemies + for j=1, #t[i].vis do -- for each enemy unit in los + local targetPoint = t[i].vis[j]:getPoint() -- point of each target on LOS ctld.lastMarkId = ctld.lastMarkId + 1 - trigger.action.circleToAll(_unitObject:getCoalition(), ctld.lastMarkId, targetPoint, _markRadius , color, color, 1, false, nil) + trigger.action.circleToAll(_playerUnit:getCoalition(), ctld.lastMarkId, targetPoint, _markRadius , color, color, 1, false, nil) MarkIds[#MarkIds+1] = ctld.lastMarkId - TargetsInLOS[#TargetsInLOS+1] = {targetObject=t[i].vis[j]:getName(), targetTypeName=t[i].vis[j]:getTypeName(), targetPoint=targetPoint} + TargetsInLOS[#TargetsInLOS+1] = {targetObject = t[i].vis[j]:getName(), + targetTypeName = t[i].vis[j]:getTypeName(), + targetPoint = targetPoint} end end end - mist.DBs.humansByName[_unitObject:getName()].losMarkIds = MarkIds -- store list of marksIds generated and show on F10 map + mist.DBs.humansByName[_playerUnit:getName()].losMarkIds = MarkIds -- store list of marksIds generated and showed on F10 map return TargetsInLOS else return nil end end --------------------------------------------------------- -function ctld.removeTargetsInLosOnF10Map(_unitObject) - local unitName = _unitObject:getName() +function ctld.reconRemoveTargetsInLosOnF10Map(_playerUnit) + local unitName = _playerUnit:getName() if mist.DBs.humansByName[unitName].losMarkIds then - for i=1, #mist.DBs.humansByName[_unitObject:getName()].losMarkIds do -- for each unit having los on enemies + for i=1, #mist.DBs.humansByName[unitName].losMarkIds do -- for each unit having los on enemies trigger.action.removeMark(mist.DBs.humansByName[unitName].losMarkIds[i]) end mist.DBs.humansByName[unitName].losMarkIds = nil end end --------------------------------------------------------- -function ctld.refreshTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) - ctld.removeTargetsInLosOnF10Map(_unitObject) - return ctld.showTargetsInLosOnF10Map(_unitObject, _searchRadius, _markRadius) -- returns TargetsInLOS table +function ctld.reconRefreshTargetsInLosOnF10Map(_params, _t) -- _params._playerUnit targeting + -- _params._searchRadius and _params._markRadius in meters + -- _params._boolRemove = true to remove previous marksIds + if _t == nil then _t = timer.getTime() end + + if ctld.reconAutoRefreshLosTargetMarks then -- to follow mobile enemy targets + ctld.reconLastScheduleIdAutoRefresh = timer.scheduleFunction(ctld.reconRefreshTargetsInLosOnF10Map, {_groupId = _params._groupId, + _playerUnit = _params._playerUnit, + _searchRadius = _params._searchRadius, + _markRadius = _params._markRadius, + _boolRemove = _params._boolRemove + }, + timer.getTime() + 10) + end + + if _params._boolRemove == true then + ctld.reconRemoveTargetsInLosOnF10Map(_params._playerUnit) + end + + return ctld.reconShowTargetsInLosOnF10Map(_params._playerUnit, _params._searchRadius, _params._markRadius) -- returns TargetsInLOS table end --- test ------------------------------------------------------ ---"uh1-1" --"uh2-1" ---local unitName = "uh2-1" ---ctld.showTargetsInLosOnF10Map(Unit.getByName(unitName),2000,200) +--local unitName = "uh2-1" --"uh1-1" --"uh2-1" +--ctld.reconShowTargetsInLosOnF10Map(Unit.getByName(unitName),2000,200) + + --********************************************************************** -- ***************** SETUP SCRIPT **************** From 907ec69265e110ae80366803bd3acf3742b8c532 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:37:14 +0100 Subject: [PATCH 4/9] fixes --- CTLD.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index 48eb0d9..d0eda4e 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -7319,7 +7319,6 @@ function ctld.addReconRadioCommand(_side) -- _side = 1 or 2 (red or blue) if ctld.reconAutoRefreshLosTargetMarks then local c1 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), RECONpath, ctld.reconStopAutorefreshTargetsInLosOnF10Map, _groupId, _playerUnit) -trigger.action.outText(tostring(_groupId).." - " .. mist.utils.tableShow(c1), 20) else local c2 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), RECONpath, ctld.reconStartAutorefreshTargetsInLosOnF10Map, @@ -7329,7 +7328,6 @@ trigger.action.outText(tostring(_groupId).." - " .. mist.utils.tableShow(c1), 20 ctld.reconLosMarkRadius, true ) -trigger.action.outText(tostring(_groupId).." - " .. mist.utils.tableShow(c2), 20) end ctld.reconRadioAdded[tostring(_groupId)] = timer.getTime() --fetch the time to check for a regular refresh else From 9c2048cf92e8752c1853f7dd011e9b0b2a45d797 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:41:19 +0100 Subject: [PATCH 5/9] fixes --- CTLD.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index d0eda4e..02f3430 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -7281,9 +7281,7 @@ end --ctld.reconShowTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) ---------------------------------------------------------------------- -if ctld == nil then - ctld = {} -end +--if ctld == nil then ctld = {} end if ctld.lastMarkId == nil then ctld.lastMarkId = 0 end From e92fbff6339ec22cb0995ff89e32cba7b2c76bf2 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:55:55 +0100 Subject: [PATCH 6/9] Update "en" dictionary --- CTLD.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CTLD.lua b/CTLD.lua index 02f3430..cdd7a55 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -311,6 +311,12 @@ ctld.i18n["en"]["DISABLE "] = nil ctld.i18n["en"]["ENABLE "] = nil ctld.i18n["en"]["REQUEST "] = nil ctld.i18n["en"]["Reset TGT Selection"] = nil +-- F10 RECON menus +ctld.i18n["en"]["RECON"] = nil +ctld.i18n["en"]["Show targets in LOS (refresh)"] = nil +ctld.i18n["en"]["Hide targets in LOS"] = nil +ctld.i18n["en"]["START autoRefresh targets in LOS"] = nil +ctld.i18n["en"]["STOP autoRefresh targets in LOS"] = nil --- Translates a string (text) with parameters (parameters) to the language defined in ctld.i18n_lang ---@param text string The text to translate, with the parameters as %1, %2, etc. (all strings!!!!) From bf3f4776fc5f2c5c0b6a17304576725f020da151 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:05:06 +0100 Subject: [PATCH 7/9] Update F10 RECON menus in "fr" & "es" dictionaries --- CTLD-i18n.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CTLD-i18n.lua b/CTLD-i18n.lua index 1994a05..7bc15a0 100644 --- a/CTLD-i18n.lua +++ b/CTLD-i18n.lua @@ -260,6 +260,12 @@ ctld.i18n["fr"]["DISABLE "] = "DESACTIVE " ctld.i18n["fr"]["ENABLE "] = "ACTIVE " ctld.i18n["fr"]["REQUEST "] = "DEMANDE" ctld.i18n["fr"]["Reset TGT Selection"] = "Réinitialiser sélection TGT" +-- F10 RECON menus +ctld.i18n["fr"]["RECON"] = "RECONNAISSANCE" +ctld.i18n["fr"]["Show targets in LOS (refresh)"] = "Marquer cibles visibles sur carte F10" +ctld.i18n["fr"]["Hide targets in LOS"] = "Effacer marques sur carte F10" +ctld.i18n["fr"]["START autoRefresh targets in LOS"] = "Lancer suivi automatique des cibles" +ctld.i18n["fr"]["STOP autoRefresh targets in LOS"] = "Stopper suivi automatique des cibles" --====== SPANISH : ESPAÑOL==================================================================================== ctld.i18n["es"] = {} @@ -521,6 +527,12 @@ ctld.i18n["es"]["DISABLE "] = "DESHABILITAR " ctld.i18n["es"]["ENABLE "] = "HABILITAR " ctld.i18n["es"]["REQUEST "] = "SOLICITUD " ctld.i18n["es"]["Reset TGT Selection"] = "Restablecer selección TGT" +-- F10 RECON menus +ctld.i18n["es"]["RECON"] = "RECONOCIMIENTO" +ctld.i18n["es"]["Show targets in LOS (refresh)"] = "Marcar objetivos visibles en el mapa F10" +ctld.i18n["es"]["Hide targets in LOS"] = "Borrar marcas del mapa F10" +ctld.i18n["es"]["START autoRefresh targets in LOS"] = "Iniciar el seguimiento automático de objetivos" +ctld.i18n["es"]["STOP autoRefresh targets in LOS"] = "Detener el seguimiento automático de objetivos" --======================================================================================================================== --======== Korean - 한국어 ===================================================================================== From 24d1dcdc33e8e9073bb9f524067aeb678409e440 Mon Sep 17 00:00:00 2001 From: FullGas1 <51051389+FullGas1@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:57:17 +0100 Subject: [PATCH 8/9] Readme update for recognition functions --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 657846f..6efc68e 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ This script is a rewrite of some of the functionality of the original Complete C * [Mi\-8 ARC\-9 VHF Radio Setup](#mi-8-arc-9-vhf-radio-setup) * [UH\-1 ADF VHF Radio Setup](#uh-1-adf-vhf-radio-setup) * [Advanced Scripting](#advanced-scripting) +* [recognition assistance](#recognition-assistance) ## Features The script supports: @@ -103,6 +104,7 @@ The script supports: * Count soldiers extracted to a zone (the soldiers disappear) * Waypoint triggers to force dropped groups to head to a location * Advanced Scripting Callback system +* Target recognition assistance functions to mark targets on the F10 map A complete test mission is included. @@ -1102,6 +1104,13 @@ White pointer pointing to beacon on the compass: ![alt text](http://i1056.photobucket.com/albums/t379/cfisher881/dcs.exe_DX9_20150608_075211_zpsdaus4wxt.png~original "Radio Compass") +# recognition-assistance +The recognition functions in the F10 menu allow you to mark/delete/refresh marks on targets within sight of the aircraft being piloted by the player. + +Enabling/disabling automatic refreshing of marks on targets within view allows you to track them as they move. + +Below is a complete list of all the "actions" plus the data that is sent through. For more information its best to check the CTLD Code to see more details of the arguments. + # Advanced Scripting CTLD has an optional callback API that can be used to trigger actions in code @@ -1116,8 +1125,6 @@ ctld.addCallback(function(_args) end) ``` -Below is a complete list of all the "actions" plus the data that is sent through. For more information its best to check the CTLD Code to see more details of the arguments. - * `{unit = "Unit that did the action", unloaded = "DCS Troops Group", action = "dropped_troops"}` * `{unit = "Unit that did the action", unloaded = "DCS Vehicles Group", action = "dropped_vehicles"}` * `{unit = "Unit that did the action", unloaded = "List of picked up vehicles", action = "load_vehicles"}` From 7055c565acc6fa2869e6c894371bea9abe0e7684 Mon Sep 17 00:00:00 2001 From: David Pierron Date: Fri, 31 Jan 2025 15:01:22 +0100 Subject: [PATCH 9/9] review --- CTLD-i18n.lua | 6 +-- CTLD.lua | 142 ++++++++++++++++++++++++++------------------------ README.md | 2 + 3 files changed, 80 insertions(+), 70 deletions(-) diff --git a/CTLD-i18n.lua b/CTLD-i18n.lua index 7bc15a0..34bac5d 100644 --- a/CTLD-i18n.lua +++ b/CTLD-i18n.lua @@ -254,7 +254,7 @@ ctld.i18n["fr"]["Drop Orange Smoke"] = "Déposer Fumi Orange" ctld.i18n["fr"]["Drop Green Smoke"] = "Déposer Fumi Vert" ctld.i18n["fr"]["Drop Beacon"] = "Déposer Fumi Vert" ctld.i18n["fr"]["Radio Beacons"] = "Déposer Balise" -ctld.i18n["fr"]["Remove Closet Beacon"] = "Supprimer Balise +proche" +ctld.i18n["fr"]["Remove Closest Beacon"] = "Supprimer Balise +proche" ctld.i18n["fr"]["JTAC Status"] = "Statut JTAC" ctld.i18n["fr"]["DISABLE "] = "DESACTIVE " ctld.i18n["fr"]["ENABLE "] = "ACTIVE " @@ -521,7 +521,7 @@ ctld.i18n["es"]["Drop Orange Smoke"] = "Soltar humo naranja" ctld.i18n["es"]["Drop Green Smoke"] = "Soltar humo verde" ctld.i18n["es"]["Drop Beacon"] = "Soltar baliza" ctld.i18n["es"]["Radio Beacons"] = "Balizas de radio" -ctld.i18n["es"]["Remove Closet Beacon"] = "Quitar baliza cercana" +ctld.i18n["es"]["Remove Closest Beacon"] = "Quitar baliza cercana" ctld.i18n["es"]["JTAC Status"] = "Estado de JTAC" ctld.i18n["es"]["DISABLE "] = "DESHABILITAR " ctld.i18n["es"]["ENABLE "] = "HABILITAR " @@ -771,7 +771,7 @@ ctld.i18n["ko"]["Drop Orange Smoke"] = "주황색 연막 투하" ctld.i18n["ko"]["Drop Green Smoke"] = "녹색 연막 투하" ctld.i18n["ko"]["Drop Beacon"] = "비콘 투하" ctld.i18n["ko"]["Radio Beacons"] = "라디오 비콘" -ctld.i18n["ko"]["Remove Closet Beacon"] = "가까운 비콘 제거" +ctld.i18n["ko"]["Remove Closest Beacon"] = "가까운 비콘 제거" ctld.i18n["ko"]["JTAC Status"] = "JTAC 상태" ctld.i18n["ko"]["DISABLE "] = "비활성화 " ctld.i18n["ko"]["ENABLE "] = "활성화 " diff --git a/CTLD.lua b/CTLD.lua index cdd7a55..39d5148 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -305,7 +305,7 @@ ctld.i18n["en"]["Drop Orange Smoke"] = nil ctld.i18n["en"]["Drop Green Smoke"] = nil ctld.i18n["en"]["Drop Beacon"] = nil ctld.i18n["en"]["Radio Beacons"] = nil -ctld.i18n["en"]["Remove Closet Beacon"] = nil +ctld.i18n["en"]["Remove Closest Beacon"] = nil ctld.i18n["en"]["JTAC Status"] = nil ctld.i18n["en"]["DISABLE "] = nil ctld.i18n["en"]["ENABLE "] = nil @@ -5647,7 +5647,7 @@ function ctld.addTransportF10MenuOptions(_unitName) missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Load Nearby Crate"), _crateCommands, ctld.loadNearbyCrate, _unitName ) end end - + if ctld.loadCrateFromMenu or ctld.hoverPickup then missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Drop Crate"), _crateCommands, ctld.dropSlingCrate, { _unitName }) end @@ -5672,7 +5672,7 @@ function ctld.addTransportF10MenuOptions(_unitName) local _radioCommands = missionCommands.addSubMenuForGroup(_groupId, ctld.i18n_translate("Radio Beacons"), _rootPath) missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("List Beacons"), _radioCommands, ctld.listRadioBeacons, { _unitName }) missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Drop Beacon"), _radioCommands, ctld.dropRadioBeacon, { _unitName }) - missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Remove Closet Beacon"), _radioCommands, ctld.removeRadioBeacon, { _unitName }) + missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Remove Closest Beacon"), _radioCommands, ctld.removeRadioBeacon, { _unitName }) elseif ctld.deployedRadioBeacons ~= {} then local _radioCommands = missionCommands.addSubMenuForGroup(_groupId, ctld.i18n_translate("Radio Beacons"), _rootPath) missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("List Beacons"), _radioCommands, ctld.listRadioBeacons, { _unitName }) @@ -7284,12 +7284,11 @@ end -- examples --------------------------------------------------------- --ctld.reconRefreshTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) --ctld.reconRemoveTargetsInLosOnF10Map(Unit.getByName("uh2-1")) - --ctld.reconShowTargetsInLosOnF10Map(Unit.getByName("uh2-1"), 2000, 200) ---------------------------------------------------------------------- --if ctld == nil then ctld = {} end if ctld.lastMarkId == nil then - ctld.lastMarkId = 0 + ctld.lastMarkId = 0 end -- ***************** RECON CONFIGURATION ***************** @@ -7298,12 +7297,12 @@ ctld.reconMenuName = ctld.i18n_translate("RECON") --name of the CTLD JTAC ctld.reconRadioAdded = {} --stores the groups that have had the radio menu added ctld.reconLosSearchRadius = 2000 -- search radius in meters ctld.reconLosMarkRadius = 100 -- mark radius dimension in meters -ctld.reconAutoRefreshLosTargetMarks = true -- if true recon LOS marks are automaticaly refreshed on F10 map +ctld.reconAutoRefreshLosTargetMarks = true -- if true recon LOS marks are automaticaly refreshed on F10 map ctld.reconLastScheduleIdAutoRefresh = 0 ---- F10 RECON Menus ------------------------------------------------------------------ function ctld.addReconRadioCommand(_side) -- _side = 1 or 2 (red or blue) - if ctld.reconF10Menu then + if ctld.reconF10Menu then if _side == 1 or _side == 2 then local _players = coalition.getPlayers(_side) if _players ~= nil then @@ -7313,29 +7312,37 @@ function ctld.addReconRadioCommand(_side) -- _side = 1 or 2 (red or blue) if ctld.reconRadioAdded[tostring(_groupId)] == nil then ctld.logDebug("ctld.addReconRadioCommand - adding RECON radio menu for unit [%s]", ctld.p(_playerUnit:getName())) local RECONpath = missionCommands.addSubMenuForGroup(_groupId, ctld.reconMenuName) - missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("Show targets in LOS (refresh)"), RECONpath, - ctld.reconRefreshTargetsInLosOnF10Map, { _groupId = _groupId, - _playerUnit = _playerUnit, - _searchRadius = ctld.reconLosSearchRadius, - _markRadius = ctld.reconLosMarkRadius, - _boolRemove = true}) + missionCommands.addCommandForGroup(_groupId, + ctld.i18n_translate("Show targets in LOS (refresh)"), RECONpath, + ctld.reconRefreshTargetsInLosOnF10Map, { + _groupId = _groupId, + _playerUnit = _playerUnit, + _searchRadius = ctld.reconLosSearchRadius, + _markRadius = ctld.reconLosMarkRadius, + _boolRemove = true + }) missionCommands.addCommandForGroup(_groupId, ctld.i18n_translate("Hide targets in LOS"), RECONpath, ctld.reconRemoveTargetsInLosOnF10Map, _playerUnit) if ctld.reconAutoRefreshLosTargetMarks then - local c1 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), RECONpath, - ctld.reconStopAutorefreshTargetsInLosOnF10Map, _groupId, _playerUnit) + missionCommands.addCommandForGroup(_groupId, + ctld.i18n_translate("STOP autoRefresh targets in LOS"), RECONpath, + ctld.reconStopAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit, + ctld.reconLosSearchRadius, + ctld.reconLosMarkRadius, + true) else - local c2 = missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), RECONpath, - ctld.reconStartAutorefreshTargetsInLosOnF10Map, - _groupId, - _playerUnit, - ctld.reconLosSearchRadius, - ctld.reconLosMarkRadius, - true - ) + missionCommands.addCommandForGroup(_groupId, + ctld.i18n_translate("START autoRefresh targets in LOS"), RECONpath, + ctld.reconStartAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit, + ctld.reconLosSearchRadius, + ctld.reconLosMarkRadius, + true + ) end ctld.reconRadioAdded[tostring(_groupId)] = timer.getTime() --fetch the time to check for a regular refresh - else - end end end @@ -7344,50 +7351,51 @@ function ctld.addReconRadioCommand(_side) -- _side = 1 or 2 (red or blue) end end -------------------------------------------------------------------- -function ctld.reconStopAutorefreshTargetsInLosOnF10Map(_groupId, _playerUnit) +function ctld.reconStopAutorefreshTargetsInLosOnF10Map(_groupId, _playerUnit, _searchRadius, _markRadius, _boolRemove) ctld.reconAutoRefreshLosTargetMarks = false - + if ctld.reconLastScheduleIdAutoRefresh ~= 0 then - timer.removeFunction(ctld.reconLastScheduleIdAutoRefresh) -- reset last schedule + timer.removeFunction(ctld.reconLastScheduleIdAutoRefresh) -- reset last schedule end - + ctld.reconRemoveTargetsInLosOnF10Map(_playerUnit) missionCommands.removeItemForGroup(_groupId, {ctld.reconMenuName, ctld.i18n_translate("STOP autoRefresh targets in LOS")}) - missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), {ctld.reconMenuName}, - ctld.reconStartAutorefreshTargetsInLosOnF10Map, - _groupId, + missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("START autoRefresh targets in LOS"), {ctld.reconMenuName}, + ctld.reconStartAutorefreshTargetsInLosOnF10Map, + _groupId, _playerUnit, - _searchRadius, + _searchRadius, _markRadius, _boolRemove) end -------------------------------------------------------------------- function ctld.reconStartAutorefreshTargetsInLosOnF10Map(_groupId, _playerUnit, _searchRadius, _markRadius, _boolRemove) - ctld.reconAutoRefreshLosTargetMarks = true - ctld.reconRefreshTargetsInLosOnF10Map({ _groupId = _groupId, + ctld.reconAutoRefreshLosTargetMarks = true + ctld.reconRefreshTargetsInLosOnF10Map({ _groupId = _groupId, _playerUnit = _playerUnit, - _searchRadius = ctld.reconLosSearchRadius, - _markRadius = ctld.reconLosMarkRadius, - _boolRemove = true}, - timer.getTime()) - missionCommands.removeItemForGroup( _groupId, {ctld.reconMenuName, ctld.i18n_translate("START autoRefresh targets in LOS")}) - missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), {ctld.reconMenuName}, - ctld.reconStopAutorefreshTargetsInLosOnF10Map, - _groupId, - _playerUnit) + _searchRadius = _searchRadius or ctld.reconLosSearchRadius, + _markRadius = _markRadius or ctld.reconLosMarkRadius, + _boolRemove = _boolRemove or true}, + timer.getTime()) + missionCommands.removeItemForGroup( _groupId, {ctld.reconMenuName, ctld.i18n_translate("START autoRefresh targets in LOS")}) + missionCommands.addCommandForGroup( _groupId, ctld.i18n_translate("STOP autoRefresh targets in LOS"), {ctld.reconMenuName}, + ctld.reconStopAutorefreshTargetsInLosOnF10Map, + _groupId, + _playerUnit, + _searchRadius, + _markRadius, + _boolRemove) end -------------------------------------------------------------------- -function ctld.reconShowTargetsInLosOnF10Map(_playerUnit, _searchRadius, _markRadius) -- _groupId targeting - -- _searchRadius and _markRadius in meters +function ctld.reconShowTargetsInLosOnF10Map(_playerUnit, _searchRadius, _markRadius) -- _groupId targeting + -- _searchRadius and _markRadius in meters if _playerUnit then local TargetsInLOS = {} - - local enemyCoa = 1 + local enemyColor = "red" local color = {1, 0, 0, 0.2} -- red if _playerUnit:getCoalition() == 1 then - enemyCoa = 2 enemyColor = "blue" color = {51/255, 51/255, 1, 0.2} -- blue end @@ -7396,20 +7404,20 @@ function ctld.reconShowTargetsInLosOnF10Map(_playerUnit, _searchRadius, _markRad local MarkIds = {} if t then - for i=1, #t do -- for each unit having los on enemies + for i=1, #t do -- for each unit having los on enemies for j=1, #t[i].vis do -- for each enemy unit in los - local targetPoint = t[i].vis[j]:getPoint() -- point of each target on LOS + local targetPoint = t[i].vis[j]:getPoint() -- point of each target on LOS ctld.lastMarkId = ctld.lastMarkId + 1 trigger.action.circleToAll(_playerUnit:getCoalition(), ctld.lastMarkId, targetPoint, _markRadius , color, color, 1, false, nil) - MarkIds[#MarkIds+1] = ctld.lastMarkId - TargetsInLOS[#TargetsInLOS+1] = {targetObject = t[i].vis[j]:getName(), - targetTypeName = t[i].vis[j]:getTypeName(), - targetPoint = targetPoint} + MarkIds[#MarkIds+1] = ctld.lastMarkId + TargetsInLOS[#TargetsInLOS+1] = { targetObject = t[i].vis[j]:getName(), + targetTypeName = t[i].vis[j]:getTypeName(), + targetPoint = targetPoint} end end end mist.DBs.humansByName[_playerUnit:getName()].losMarkIds = MarkIds -- store list of marksIds generated and showed on F10 map - return TargetsInLOS + return TargetsInLOS else return nil end @@ -7417,33 +7425,33 @@ end --------------------------------------------------------- function ctld.reconRemoveTargetsInLosOnF10Map(_playerUnit) local unitName = _playerUnit:getName() - if mist.DBs.humansByName[unitName].losMarkIds then - for i=1, #mist.DBs.humansByName[unitName].losMarkIds do -- for each unit having los on enemies + if mist.DBs.humansByName[unitName].losMarkIds then + for i=1, #mist.DBs.humansByName[unitName].losMarkIds do -- for each unit having los on enemies trigger.action.removeMark(mist.DBs.humansByName[unitName].losMarkIds[i]) end mist.DBs.humansByName[unitName].losMarkIds = nil end end --------------------------------------------------------- -function ctld.reconRefreshTargetsInLosOnF10Map(_params, _t) -- _params._playerUnit targeting - -- _params._searchRadius and _params._markRadius in meters +function ctld.reconRefreshTargetsInLosOnF10Map(_params, _t) -- _params._playerUnit targeting + -- _params._searchRadius and _params._markRadius in meters -- _params._boolRemove = true to remove previous marksIds if _t == nil then _t = timer.getTime() end - - if ctld.reconAutoRefreshLosTargetMarks then -- to follow mobile enemy targets + + if ctld.reconAutoRefreshLosTargetMarks then -- to follow mobile enemy targets ctld.reconLastScheduleIdAutoRefresh = timer.scheduleFunction(ctld.reconRefreshTargetsInLosOnF10Map, {_groupId = _params._groupId, - _playerUnit = _params._playerUnit, + _playerUnit = _params._playerUnit, _searchRadius = _params._searchRadius, - _markRadius = _params._markRadius, - _boolRemove = _params._boolRemove - }, + _markRadius = _params._markRadius, + _boolRemove = _params._boolRemove + }, timer.getTime() + 10) end if _params._boolRemove == true then ctld.reconRemoveTargetsInLosOnF10Map(_params._playerUnit) end - + return ctld.reconShowTargetsInLosOnF10Map(_params._playerUnit, _params._searchRadius, _params._markRadius) -- returns TargetsInLOS table end --- test ------------------------------------------------------ diff --git a/README.md b/README.md index 6efc68e..b34ffd6 100644 --- a/README.md +++ b/README.md @@ -1125,6 +1125,8 @@ ctld.addCallback(function(_args) end) ``` +Below is a complete list of all the "actions" plus the data that is sent through. For more information its best to check the CTLD Code to see more details of the arguments. + * `{unit = "Unit that did the action", unloaded = "DCS Troops Group", action = "dropped_troops"}` * `{unit = "Unit that did the action", unloaded = "DCS Vehicles Group", action = "dropped_vehicles"}` * `{unit = "Unit that did the action", unloaded = "List of picked up vehicles", action = "load_vehicles"}`