mirror of
https://github.com/ciribob/DCS-CTLD.git
synced 2025-08-15 06:17:22 +00:00
Merge pull request #93 from VEAF/change-radio-beacon-transmissions
Changed the beacons radio transmissions to follow DCS evolutions - no need to restart transmissions every 30 seconds
This commit is contained in:
commit
8f9eba4801
121
CTLD.lua
121
CTLD.lua
@ -26,7 +26,7 @@ ctld = {} -- DONT REMOVE!
|
||||
ctld.Id = "CTLD - "
|
||||
|
||||
--- Version.
|
||||
ctld.Version = "20230414.01"
|
||||
ctld.Version = "20230825.01"
|
||||
|
||||
-- debug level, specific to this module
|
||||
ctld.Debug = true
|
||||
@ -2764,10 +2764,12 @@ function ctld.loadNearbyCrate(_name)
|
||||
|
||||
end
|
||||
|
||||
--recreates beacons to make sure they work!
|
||||
--check each minute if the beacons' batteries have failed, and stop them accordingly
|
||||
--there's no more need to actually refresh the beacons, since we set "loop" to true.
|
||||
function ctld.refreshRadioBeacons()
|
||||
ctld.logDebug("ctld.refreshRadioBeacons()")
|
||||
|
||||
timer.scheduleFunction(ctld.refreshRadioBeacons, nil, timer.getTime() + 30)
|
||||
timer.scheduleFunction(ctld.refreshRadioBeacons, nil, timer.getTime() + 60)
|
||||
|
||||
|
||||
for _index, _beaconDetails in ipairs(ctld.deployedRadioBeacons) do
|
||||
@ -3390,10 +3392,11 @@ end
|
||||
-- one for VHF and one for UHF
|
||||
-- The units are set to to NOT engage
|
||||
function ctld.createRadioBeacon(_point, _coalition, _country, _name, _batteryTime, _isFOB)
|
||||
ctld.logDebug(string.format("ctld.createRadioBeacon(_name=%s)", ctld.p(_name)))
|
||||
|
||||
local _uhfGroup = ctld.spawnRadioBeaconUnit(_point, _country, "UHF")
|
||||
local _vhfGroup = ctld.spawnRadioBeaconUnit(_point, _country, "VHF")
|
||||
local _fmGroup = ctld.spawnRadioBeaconUnit(_point, _country, "FM")
|
||||
local _uhfGroup = ctld.spawnRadioBeaconUnit(_point, _country, _name .. "-UHF")
|
||||
local _vhfGroup = ctld.spawnRadioBeaconUnit(_point, _country, _name .. "-VHF")
|
||||
local _fmGroup = ctld.spawnRadioBeaconUnit(_point, _country, _name .. "-FM")
|
||||
|
||||
local _freq = ctld.generateADFFrequencies()
|
||||
|
||||
@ -3443,6 +3446,8 @@ function ctld.createRadioBeacon(_point, _coalition, _country, _name, _batteryTim
|
||||
battery = _battery,
|
||||
coalition = _coalition,
|
||||
}
|
||||
|
||||
ctld.logDebug(string.format("calling ctld.updateRadioBeacon for beacon %s", ctld.p(_name)))
|
||||
ctld.updateRadioBeacon(_beaconDetails)
|
||||
|
||||
table.insert(ctld.deployedRadioBeacons, _beaconDetails)
|
||||
@ -3484,7 +3489,8 @@ end
|
||||
|
||||
|
||||
|
||||
function ctld.spawnRadioBeaconUnit(_point, _country, _type)
|
||||
function ctld.spawnRadioBeaconUnit(_point, _country, _name)
|
||||
ctld.logDebug(string.format("ctld.spawnRadioBeaconUnit(_name=%s)", ctld.p(_name)))
|
||||
|
||||
local _groupId = ctld.getNextGroupId()
|
||||
|
||||
@ -3498,7 +3504,7 @@ function ctld.spawnRadioBeaconUnit(_point, _country, _type)
|
||||
[1] = {
|
||||
["y"] = _point.z,
|
||||
["type"] = "TACAN_beacon",
|
||||
["name"] = _type .. " Radio Beacon Unit #" .. _unitId,
|
||||
["name"] = _name .. " - Unit #" .. _unitId,
|
||||
-- ["unitId"] = _unitId,
|
||||
["heading"] = 0,
|
||||
["playerCanDrive"] = true,
|
||||
@ -3508,7 +3514,7 @@ function ctld.spawnRadioBeaconUnit(_point, _country, _type)
|
||||
},
|
||||
-- ["y"] = _positions[1].z,
|
||||
-- ["x"] = _positions[1].x,
|
||||
["name"] = _type .. " Radio Beacon Group #" .. _groupId,
|
||||
["name"] = _name .. " - Group #" .. _groupId,
|
||||
["task"] = {},
|
||||
--added two fields below for MIST
|
||||
["category"] = Group.Category.GROUND,
|
||||
@ -3520,6 +3526,8 @@ function ctld.spawnRadioBeaconUnit(_point, _country, _type)
|
||||
end
|
||||
|
||||
function ctld.updateRadioBeacon(_beaconDetails)
|
||||
ctld.logDebug("ctld.updateRadioBeacon()")
|
||||
ctld.logTrace(string.format("_beaconDetails=%s", ctld.p(_beaconDetails)))
|
||||
|
||||
local _vhfGroup = Group.getByName(_beaconDetails.vhfGroup)
|
||||
|
||||
@ -3530,14 +3538,17 @@ function ctld.updateRadioBeacon(_beaconDetails)
|
||||
local _radioLoop = {}
|
||||
|
||||
if _vhfGroup ~= nil and _vhfGroup:getUnits() ~= nil and #_vhfGroup:getUnits() == 1 then
|
||||
ctld.logTrace(string.format("_vhfGroup=%s", ctld.p(_vhfGroup)))
|
||||
table.insert(_radioLoop, { group = _vhfGroup, freq = _beaconDetails.vhf, silent = false, mode = 0 })
|
||||
end
|
||||
|
||||
if _uhfGroup ~= nil and _uhfGroup:getUnits() ~= nil and #_uhfGroup:getUnits() == 1 then
|
||||
ctld.logTrace(string.format("_uhfGroup=%s", ctld.p(_uhfGroup)))
|
||||
table.insert(_radioLoop, { group = _uhfGroup, freq = _beaconDetails.uhf, silent = true, mode = 0 })
|
||||
end
|
||||
|
||||
if _fmGroup ~= nil and _fmGroup:getUnits() ~= nil and #_fmGroup:getUnits() == 1 then
|
||||
ctld.logTrace(string.format("_fmGroup=%s", ctld.p(_fmGroup)))
|
||||
table.insert(_radioLoop, { group = _fmGroup, freq = _beaconDetails.fm, silent = false, mode = 1 })
|
||||
end
|
||||
|
||||
@ -3545,14 +3556,20 @@ function ctld.updateRadioBeacon(_beaconDetails)
|
||||
|
||||
if (_batLife <= 0 and _beaconDetails.battery ~= -1) or #_radioLoop ~= 3 then
|
||||
-- ran out of batteries
|
||||
|
||||
ctld.logDebug("ran out of batteries")
|
||||
if _vhfGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_vhfGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_vhfGroup:getName())
|
||||
_vhfGroup:destroy()
|
||||
end
|
||||
if _uhfGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_uhfGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_uhfGroup:getName())
|
||||
_uhfGroup:destroy()
|
||||
end
|
||||
if _fmGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_fmGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_fmGroup:getName())
|
||||
_fmGroup:destroy()
|
||||
end
|
||||
|
||||
@ -3577,17 +3594,17 @@ function ctld.updateRadioBeacon(_beaconDetails)
|
||||
|
||||
_groupController:setOption(AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD)
|
||||
|
||||
trigger.action.radioTransmission(_sound, _radio.group:getUnit(1):getPoint(), _radio.mode, false, _radio.freq, 1000)
|
||||
--This function doesnt actually stop transmitting when then sound is false. My hope is it will stop if a new beacon is created on the same
|
||||
-- frequency... OR they fix the bug where it wont stop.
|
||||
-- end
|
||||
ctld.logTrace(string.format("stopping and restarting transmission of %s", ctld.p(_radio.group:getName())))
|
||||
|
||||
-- stop the transmission at each call to the ctld.updateRadioBeacon method (default each minute)
|
||||
trigger.action.stopRadioTransmission(_radio.group:getName())
|
||||
|
||||
--
|
||||
-- restart it as the battery is still up
|
||||
-- the transmission is set to loop and has the name of the transmitting DCS group (that includes the type - i.e. FM, UHF, VHF)
|
||||
trigger.action.radioTransmission(_sound, _radio.group:getUnit(1):getPoint(), _radio.mode, true, _radio.freq, 1000, _radio.group:getName())
|
||||
end
|
||||
|
||||
return true
|
||||
|
||||
-- trigger.action.radioTransmission(ctld.radioSound, _point, 1, true, _frequency, 1000)
|
||||
end
|
||||
|
||||
function ctld.listRadioBeacons(_args)
|
||||
@ -3676,12 +3693,18 @@ function ctld.removeRadioBeacon(_args)
|
||||
local _fmGroup = Group.getByName(_closetBeacon.fmGroup)
|
||||
|
||||
if _vhfGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_vhfGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_vhfGroup:getName())
|
||||
_vhfGroup:destroy()
|
||||
end
|
||||
if _uhfGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_uhfGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_uhfGroup:getName())
|
||||
_uhfGroup:destroy()
|
||||
end
|
||||
if _fmGroup ~= nil then
|
||||
ctld.logTrace(string.format("stopping transmission of %s", ctld.p(_fmGroup:getName())))
|
||||
trigger.action.stopRadioTransmission(_fmGroup:getName())
|
||||
_fmGroup:destroy()
|
||||
end
|
||||
|
||||
@ -5144,51 +5167,51 @@ function ctld.addJTACRadioCommand(_side)
|
||||
|
||||
--make a copy of the JTAC group submenu's path to insert the target's list on as many pages as required. The JTAC's group submenu path only leads to the first page
|
||||
local jtacTargetPagePath = mist.utils.deepCopy(ctld.jtacGroupSubMenuPath[_jtacGroupName])
|
||||
--add a reset targeting option to revert to automatic JTAC unit targeting
|
||||
missionCommands.addCommandForGroup(_groupId, "Reset TGT Selection", jtacTargetPagePath, ctld.setJTACTarget, {jtacGroupName = _jtacGroupName, targetName = nil})
|
||||
|
||||
--counter to know when to add the next page submenu to fit all of the targets in the JTAC's group submenu
|
||||
--add a reset targeting option to revert to automatic JTAC unit targeting
|
||||
missionCommands.addCommandForGroup(_groupId, "Reset TGT Selection", jtacTargetPagePath, ctld.setJTACTarget, {jtacGroupName = _jtacGroupName, targetName = nil})
|
||||
|
||||
--counter to know when to add the next page submenu to fit all of the targets in the JTAC's group submenu
|
||||
local itemCounter = 0
|
||||
|
||||
--indicator table to know which unitType was already added to the radio submenu
|
||||
local typeNameList = {}
|
||||
for _,target in pairs(ctld.jtacTargetsList[_jtacGroupName]) do
|
||||
local targetName = target.unit:getName()
|
||||
--check if the jtac has a current target before filtering it out if possible
|
||||
if (ctld.jtacCurrentTargets[_jtacGroupName] and targetName ~= ctld.jtacCurrentTargets[_jtacGroupName].name) then
|
||||
local targetType_name = target.unit:getTypeName()
|
||||
--indicator table to know which unitType was already added to the radio submenu
|
||||
local typeNameList = {}
|
||||
for _,target in pairs(ctld.jtacTargetsList[_jtacGroupName]) do
|
||||
local targetName = target.unit:getName()
|
||||
--check if the jtac has a current target before filtering it out if possible
|
||||
if (ctld.jtacCurrentTargets[_jtacGroupName] and targetName ~= ctld.jtacCurrentTargets[_jtacGroupName].name) then
|
||||
local targetType_name = target.unit:getTypeName()
|
||||
|
||||
if targetType_name then
|
||||
if typeNameList[targetType_name] then
|
||||
typeNameList[targetType_name].amount = typeNameList[targetType_name].amount + 1
|
||||
else
|
||||
typeNameList[targetType_name] = {}
|
||||
typeNameList[targetType_name].targetName = targetName --store the first targetName
|
||||
typeNameList[targetType_name].amount = 1
|
||||
if targetType_name then
|
||||
if typeNameList[targetType_name] then
|
||||
typeNameList[targetType_name].amount = typeNameList[targetType_name].amount + 1
|
||||
else
|
||||
typeNameList[targetType_name] = {}
|
||||
typeNameList[targetType_name].targetName = targetName --store the first targetName
|
||||
typeNameList[targetType_name].amount = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for typeName,info in pairs(typeNameList) do
|
||||
local amount = info.amount
|
||||
local targetName = info.targetName
|
||||
itemCounter = itemCounter + 1
|
||||
for typeName,info in pairs(typeNameList) do
|
||||
local amount = info.amount
|
||||
local targetName = info.targetName
|
||||
itemCounter = itemCounter + 1
|
||||
|
||||
--F2 through F10 makes 9 entries possible per page, with one being the NextMenu submenu. Pages other than the first would have 10 entires but worse case scenario is considered
|
||||
if itemCounter%9 == 0 then
|
||||
jtacTargetPagePath = missionCommands.addSubMenuForGroup(_groupId, NextPageText, jtacTargetPagePath)
|
||||
--F2 through F10 makes 9 entries possible per page, with one being the NextMenu submenu. Pages other than the first would have 10 entires but worse case scenario is considered
|
||||
if itemCounter%9 == 0 then
|
||||
jtacTargetPagePath = missionCommands.addSubMenuForGroup(_groupId, NextPageText, jtacTargetPagePath)
|
||||
end
|
||||
|
||||
missionCommands.addCommandForGroup(_groupId, string.format(typeName .. "(" .. amount .. ")"), jtacTargetPagePath, ctld.setJTACTarget, {jtacGroupName = _jtacGroupName, targetName = targetName})
|
||||
end
|
||||
|
||||
missionCommands.addCommandForGroup(_groupId, string.format(typeName .. "(" .. amount .. ")"), jtacTargetPagePath, ctld.setJTACTarget, {jtacGroupName = _jtacGroupName, targetName = targetName})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if ctld.newJtac[_side] then
|
||||
ctld.newJtac[_side] = false
|
||||
end
|
||||
@ -5326,7 +5349,7 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour, _
|
||||
|
||||
--Targets list and Selected target initialization
|
||||
if not ctld.jtacTargetsList[_jtacGroupName] then
|
||||
ctld.jtacTargetsList[_jtacGroupName] = {}
|
||||
ctld.jtacTargetsList[_jtacGroupName] = {}
|
||||
if _jtacCoalition then ctld.newJtac[_jtacCoalition] = true end
|
||||
end
|
||||
|
||||
@ -6108,7 +6131,7 @@ function ctld.setJTACTarget(_args)
|
||||
elseif not targetName and ctld.jtacSelectedTarget[_jtacGroupName] ~= 1 then
|
||||
ctld.jtacSelectedTarget[_jtacGroupName] = 1
|
||||
ctld.jtacCurrentTargets[_jtacGroupName] = nil
|
||||
|
||||
|
||||
local message = _jtacGroupName .. ", target selection reset."
|
||||
ctld.notifyCoalition(message, 10, ctld.jtacUnits[_jtacGroupName].side, ctld.jtacRadioData[_jtacGroupName])
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user