2 Commits

Author SHA1 Message Date
Ciaran Fisher
55170e1ae3 Merge pull request #37 from dimpah/JTAC_LS
1.71 JTAC Laser/Smoke mod
2018-04-15 15:53:31 +01:00
dimpah
b45d6a9ce3 1.71 JTAC Laser/Smoke mod
*Adds a new menu item under F10 menu named "JTAC command" when a JTAC is created. From there you can order them to change lasing codes and smoke color.
*Fixed a bug that script prevent you spawn new crates after a period of time (configured by "crateWaitTime" variable)
2018-02-05 13:56:30 +02:00

168
CTLD.lua
View File

@@ -117,6 +117,9 @@ ctld.AASystemLimitBLUE = 20 -- Blue side limit
--END AA SYSTEM CONFIG -- --END AA SYSTEM CONFIG --
-- ***************** JTAC CONFIGURATION ***************** -- ***************** JTAC CONFIGURATION *****************
ctld.laser_codes = { 1113, 1688, 1322} -- Put here the available laser codes. The first value is the default for RED and the second for BLUE
ctld.deployedJTACs = {} --Store deployed JTAC units here
ctld.JTACCommandMenuPath = {}
ctld.JTAC_LIMIT_RED = 10 -- max number of JTAC Crates for the RED Side ctld.JTAC_LIMIT_RED = 10 -- max number of JTAC Crates for the RED Side
ctld.JTAC_LIMIT_BLUE = 10 -- max number of JTAC Crates for the BLUE Side ctld.JTAC_LIMIT_BLUE = 10 -- max number of JTAC Crates for the BLUE Side
@@ -130,6 +133,7 @@ ctld.JTAC_smokeOn_BLUE = true -- enables marking of target with smoke for BLUE f
ctld.JTAC_smokeColour_RED = 4 -- RED side smoke colour -- Green = 0 , Red = 1, White = 2, Orange = 3, Blue = 4 ctld.JTAC_smokeColour_RED = 4 -- RED side smoke colour -- Green = 0 , Red = 1, White = 2, Orange = 3, Blue = 4
ctld.JTAC_smokeColour_BLUE = 1 -- BLUE side smoke colour -- Green = 0 , Red = 1, White = 2, Orange = 3, Blue = 4 ctld.JTAC_smokeColour_BLUE = 1 -- BLUE side smoke colour -- Green = 0 , Red = 1, White = 2, Orange = 3, Blue = 4
ctld.JTAC_smokeColous = {"Green", "Red", "White", "Orange", "Blue", "No smoke"}
ctld.JTAC_jtacStatusF10 = true -- enables F10 JTAC Status menu ctld.JTAC_jtacStatusF10 = true -- enables F10 JTAC Status menu
@@ -2967,11 +2971,10 @@ function ctld.unpackCrates(_arguments)
if ctld.isJTACUnitType(_crate.details.unit) and ctld.JTAC_dropEnabled then if ctld.isJTACUnitType(_crate.details.unit) and ctld.JTAC_dropEnabled then
local _code = table.remove(ctld.jtacGeneratedLaserCodes, 1) local _side = _heli:getCoalition()
--put to the end local _code = ctld.jtacGetLaserCodeBySide(_side)
table.insert(ctld.jtacGeneratedLaserCodes, _code)
ctld.JTACAutoLase(_spawnedGroups:getName(), _code) --(_jtacGroupName, _laserCode, _smoke, _lock, _colour) ctld.CreateJTAC(_spawnedGroups:getName(), _code)
end end
end end
@@ -4917,7 +4920,120 @@ ctld.jtacCurrentTargets = {}
ctld.jtacRadioAdded = {} --keeps track of who's had the radio command added ctld.jtacRadioAdded = {} --keeps track of who's had the radio command added
ctld.jtacGeneratedLaserCodes = {} -- keeps track of generated codes, cycles when they run out ctld.jtacGeneratedLaserCodes = {} -- keeps track of generated codes, cycles when they run out
ctld.jtacLaserPointCodes = {} ctld.jtacLaserPointCodes = {}
ctld.jtacColor = {}
function ctld.CreateJTAC(group, code)
local _side = ctld.getGroup(group)[1]:getCoalition()
ctld.jtacLaserPointCodes[group] = code
if _side == 1 then
ctld.jtacColor[group] = ctld.JTAC_smokeColour_RED
else
ctld.jtacColor[group] = ctld.JTAC_smokeColour_BLUE
end
ctld.JTACAutoLase(group, code)
if ctld.deployedJTACs[_side] == nil then
ctld.deployedJTACs[_side] = {}
end
table.insert(ctld.deployedJTACs[_side], group)
ctld.refreshJTACMenu(_side)
end
function ctld.changeLaserCode(_args)
local _SelectedLazingCode = tonumber(_args[2])
if tonumber(ctld.jtacLaserPointCodes[_args[1]]) ~= _SelectedLazingCode then
--TODO: check unit's life
ctld.JTACAutoLaseStop(_args[1])
local _smoke
if _args[3] == 1 then
_smoke = ctld.JTAC_smokeOn_RED
else
_smoke = ctld.JTAC_smokeOn_BLUE
end
timer.scheduleFunction(ctld.timerJTACAutoLase, { _args[1], _SelectedLazingCode, _smoke, ctld.JTAC_lock, ctld.jtacColor[_args[1]]}, timer.getTime() + 5) --TODO: check interval
ctld.notifyCoalition(_args[1]..": Changing laser code to ".. _SelectedLazingCode, 10, _args[3])
ctld.jtacLaserPointCodes[_args[1]] = _SelectedLazingCode
else
ctld.notifyCoalition(_args[1]..": I'm already lazing with code ".. _SelectedLazingCode, 10, _args[3])
end
end
function ctld.changeJTACColor(_args)
if ctld.GetColorName(ctld.jtacColor[_args[1]]) ~= _args[2] then
ctld.JTACAutoLaseStop(_args[1])
local _smoke
if _args[3] == 1 then
_smoke = ctld.JTAC_smokeOn_RED
else
_smoke = ctld.JTAC_smokeOn_BLUE
end
local _Color = -1 -- no smoke?
if _args[2] == "Green" then
_Color = 0
elseif _args[2] == "Red" then
_Color = 1
elseif _args[2] == "White" then
_Color = 2
elseif _args[2] == "Orange" then
_Color = 3
elseif _args[2] == "Blue" then
_Color = 4
end
timer.scheduleFunction(ctld.timerJTACAutoLase, { _args[1], ctld.jtacLaserPointCodes[_args[1]], _smoke, ctld.JTAC_lock, _Color }, timer.getTime() + 5) --TODO: check interval
ctld.notifyCoalition(_args[1]..": Changing color to ".._args[2], 10, _args[3])
ctld.jtacColor[_args[1]] = _Color
else
ctld.notifyCoalition(_args[1]..": Smoke color is already ".._args[2]..".", 10, _args[3])
end
end
function ctld.refreshJTACMenu(_side)
if ctld.JTACCommandMenuPath[tostring(_side)] ~= nil then
missionCommands.removeItemForCoalition(_side, ctld.JTACCommandMenuPath[tostring(_side)])
end
local _JTACMenu
if next(ctld.deployedJTACs[_side]) ~= nil then
_JTACMenu = missionCommands.addSubMenuForCoalition(_side, "JTAC Command", nil)
else
return
end
ctld.JTACCommandMenuPath[tostring(_side)] = _JTACMenu
local itemNo = 0
--Add one menu item foreach deployed JTAC unit?
local _JTACMenuItem = {}
local _JTACMenuItemLaser = {}
local _JTACMenuItemColor = {}
for _, _JTACGroup in pairs(ctld.deployedJTACs[_side]) do
_JTACMenuItem[itemNo] = missionCommands.addSubMenuForCoalition(_side, _JTACGroup, _JTACMenu)
--Add laser code submenus
_JTACMenuItemLaser[itemNo] = missionCommands.addSubMenuForCoalition(_side, "Change laser code", _JTACMenuItem[itemNo])
for _, _laseCode in pairs(ctld.laser_codes) do
missionCommands.addCommandForCoalition(_side, "to ".._laseCode, _JTACMenuItemLaser[itemNo], ctld.changeLaserCode, { _JTACGroup, _laseCode, _side})
end
--Add color change submenus
_JTACMenuItemColor[itemNo] = missionCommands.addSubMenuForCoalition(_side, "Change smoke color", _JTACMenuItem[itemNo])
for _, _smokeColor in pairs(ctld.JTAC_smokeColous) do
missionCommands.addCommandForCoalition(_side, "to ".._smokeColor, _JTACMenuItemColor[itemNo], ctld.changeJTACColor, { _JTACGroup, _smokeColor, _side})
end
itemNo = itemNo + 1
end
end
function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour) function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
@@ -4933,8 +5049,6 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
end end
ctld.jtacLaserPointCodes[_jtacGroupName] = _laserCode
local _jtacGroup = ctld.getGroup(_jtacGroupName) local _jtacGroup = ctld.getGroup(_jtacGroupName)
local _jtacUnit local _jtacUnit
@@ -4966,8 +5080,18 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
if ctld.jtacUnits[_jtacGroupName] ~= nil then if ctld.jtacUnits[_jtacGroupName] ~= nil then
ctld.notifyCoalition("JTAC Group " .. _jtacGroupName .. " KIA!", 10, ctld.jtacUnits[_jtacGroupName].side) local _side = ctld.jtacUnits[_jtacGroupName].side
end ctld.notifyCoalition("JTAC Group " .. _jtacGroupName .. " KIA!", 10, _side)
ctld.deployedJTACs[_side] = {}
for _jtacGroupName, _jtacDetails in pairs(ctld.jtacUnits) do
_jtacUnit = Unit.getByName(_jtacDetails.name)
if _jtacUnit ~= nil and _jtacUnit:getLife() > 0 and _jtacUnit:getCoalition() == _side then
table.insert(ctld.deployedJTACs[_side], _jtacGroupName)
end
end
ctld.refreshJTACMenu(ctld.jtacUnits[_jtacGroupName].side)
end
--remove from list --remove from list
ctld.jtacUnits[_jtacGroupName] = nil ctld.jtacUnits[_jtacGroupName] = nil
@@ -5050,7 +5174,7 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
-- store current target for easy lookup -- store current target for easy lookup
ctld.jtacCurrentTargets[_jtacGroupName] = { name = _enemyUnit:getName(), unitType = _enemyUnit:getTypeName(), unitId = _enemyUnit:getID() } ctld.jtacCurrentTargets[_jtacGroupName] = { name = _enemyUnit:getName(), unitType = _enemyUnit:getTypeName(), unitId = _enemyUnit:getID() }
ctld.notifyCoalition(_jtacGroupName .. " lasing new target " .. _enemyUnit:getTypeName() .. '. CODE: ' .. _laserCode .. ctld.getPositionString(_enemyUnit), 10, _jtacUnit:getCoalition()) ctld.notifyCoalition(_jtacGroupName .. " lasing new target " .. _enemyUnit:getTypeName() .. '. CODE: ' .. _laserCode .. ctld.getPositionString(_enemyUnit) .. ". Smoke: " .. ctld.GetColorName(_colour), 10, _jtacUnit:getCoalition())
-- create smoke -- create smoke
if _smoke == true then if _smoke == true then
@@ -5477,6 +5601,8 @@ function ctld.getJTACStatus(_args)
if _jtacUnit ~= nil and _jtacUnit:getLife() > 0 and _jtacUnit:isActive() == true and _jtacUnit:getCoalition() == _side then if _jtacUnit ~= nil and _jtacUnit:getLife() > 0 and _jtacUnit:isActive() == true and _jtacUnit:getCoalition() == _side then
local _enemyUnit = ctld.getCurrentUnit(_jtacUnit, _jtacGroupName) local _enemyUnit = ctld.getCurrentUnit(_jtacUnit, _jtacGroupName)
local _jtacColor = ctld.jtacColor[_jtacGroupName]
local _laserCode = ctld.jtacLaserPointCodes[_jtacGroupName] local _laserCode = ctld.jtacLaserPointCodes[_jtacGroupName]
@@ -5485,7 +5611,7 @@ function ctld.getJTACStatus(_args)
end end
if _enemyUnit ~= nil and _enemyUnit:getLife() > 0 and _enemyUnit:isActive() == true then if _enemyUnit ~= nil and _enemyUnit:getLife() > 0 and _enemyUnit:isActive() == true then
_message = _message .. "" .. _jtacGroupName .. " targeting " .. _enemyUnit:getTypeName() .. " CODE: " .. _laserCode .. ctld.getPositionString(_enemyUnit) .. "\n" _message = _message .. "" .. _jtacGroupName .. " targeting " .. _enemyUnit:getTypeName() .. " CODE: " .. _laserCode .. ctld.getPositionString(_enemyUnit) ..". Visual indication: " .. ctld.GetColorName(_jtacColor).. " smoke." .. "\n"
local _list = ctld.listNearbyEnemies(_jtacUnit) local _list = ctld.listNearbyEnemies(_jtacUnit)
@@ -5512,7 +5638,21 @@ function ctld.getJTACStatus(_args)
ctld.notifyCoalition(_message, 10, _side) ctld.notifyCoalition(_message, 10, _side)
end end
function ctld.GetColorName(_Color)
local _ColorName = "No"
if _Color == 0 then
_ColorName = "Green"
elseif _Color == 1 then
_ColorName = "Red"
elseif _Color == 2 then
_ColorName = "White"
elseif _Color == 3 then
_ColorName = "Orange"
elseif _Color == 4 then
_ColorName = "Blue"
end
return _ColorName
end
function ctld.isInfantry(_unit) function ctld.isInfantry(_unit)
@@ -5576,6 +5716,10 @@ function ctld.generateLaserCode()
end end
end end
function ctld.jtacGetLaserCodeBySide(_side)
return ctld.laser_codes[_side]
end
function ctld.containsDigit(_number, _numberToFind) function ctld.containsDigit(_number, _numberToFind)
local _thisNumber = _number local _thisNumber = _number
@@ -6085,4 +6229,4 @@ env.info("CTLD READY")
-- for key, value in pairs(getmetatable(_spawnedCrate)) do -- for key, value in pairs(getmetatable(_spawnedCrate)) do
-- env.info(tostring(key)) -- env.info(tostring(key))
-- env.info(tostring(value)) -- env.info(tostring(value))
-- end -- end