Compare commits

..

4 Commits

Author SHA1 Message Date
Ciaran Fisher 644b4dc2fe Added optional despawn timers to JTAC and to Troops 2019-01-12 10:52:25 +00:00
Ciaran Fisher 58731f3d84 Bug Fix 2018-04-16 22:16:27 +01:00
Ciaran Fisher 71b54491fc Release 1.73 2018-04-15 18:28:38 +01:00
Ciaran Fisher 7ca6af38fc Version bump 2018-04-15 18:23:24 +01:00
7 changed files with 6124 additions and 6232 deletions
+58 -166
View File
@@ -16,15 +16,8 @@
- jmontleon - https://github.com/jmontleon
- emilianomolina - https://github.com/emilianomolina
Version: 1.72 - 18/02/2018
- Bug fix for crate spam
- Improved JTAC Performance - priority & targeting
- Added JTAC report for in view
- Added ability to set maximum group size that can be carried
- Added new sling load crates
- Fixed bug where crates and / or groups would disappear
- Fixed bug where count in zone wouldn't work for mission crates
- Delayed config of F10 menu and other scheduled functions so they can be overwritten by mission if a user wants
Version: 1.73 - 15/04/2018
- Allow minimum distance from friendly logistics to be set
]]
ctld = {} -- DONT REMOVE!
@@ -54,6 +47,8 @@ ctld.maximumMoveDistance = 2000 -- max distance for troops to move from drop poi
ctld.minimumDeployDistance = 1000 -- minimum distance from a friendly pickup zone where you can deploy a crate
ctld.despawnTroopsTimer = -1 -- if this value is a positive number, any deployed troops will despawn after that amount of seconds have elapsed
ctld.numberOfTroops = 10 -- default number of troops to load on a transport heli or C-130
-- also works as maximum size of group that'll fit into a helicopter unless overridden
ctld.enableFastRopeInsertion = true -- allows you to drop troops by fast rope
@@ -117,9 +112,6 @@ ctld.AASystemLimitBLUE = 20 -- Blue side limit
--END AA SYSTEM CONFIG --
-- ***************** 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_BLUE = 10 -- max number of JTAC Crates for the BLUE Side
@@ -133,7 +125,6 @@ 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_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
@@ -141,6 +132,8 @@ ctld.JTAC_location = true -- shows location of target in JTAC message
ctld.JTAC_lock = "all" -- "vehicle" OR "troop" OR "all" forces JTAC to only lock vehicles or troops or all ground units
ctld.JTAC_despawnTimer = -1 -- if this value is a positive number, any deployed JTACS will despawn after that amount of seconds have elapsed
-- ***************** Pickup, dropoff and waypoint zones *****************
-- Available colors (anything else like "none" disables smoke): "green", "red", "white", "orange", "blue", "none",
@@ -1666,6 +1659,32 @@ function ctld.troopsOnboard(_heli, _troops)
end
end
-- tracks the troops dropped or JTACS
-- stores group name and expiry time -- reset on redrop
ctld.droppedTroopsTracker = {}
function ctld.despawnTimer(groupName,despawnTimer)
if despawnTimer > 0 then
-- resets timer if time reused
ctld.droppedTroopsTracker[groupName] = (timer.getTime() +despawnTimer) - 1
timer.scheduleFunction(function()
-- checks timer hasnt been reset
if ctld.droppedTroopsTracker[groupName] < timer.getTime() then
local group = Group.getByName(groupName)
if group then
group:destroy()
end
end
end, nil, timer.getTime() + ctld.despawnTroopsTimer)
end
end
-- if its dropped by AI then there is no player name so return the type of unit
function ctld.getPlayerNameOrType(_heli)
@@ -1762,6 +1781,9 @@ function ctld.deployTroops(_heli, _troops)
ctld.processCallback({unit = _heli, unloaded = _droppedTroops, action = "dropped_troops"})
-- create timer
ctld.despawnTimer(_droppedTroops:getName(),ctld.despawnTroopsTimer)
else
--extract zone!
@@ -1803,12 +1825,18 @@ function ctld.deployTroops(_heli, _troops)
ctld.processCallback({unit = _heli, unloaded = _droppedVehicles, action = "dropped_vehicles"})
-- create timer
ctld.despawnTimer(_droppedVehicles:getName(),ctld.despawnTroopsTimer)
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " dropped vehicles from " .. _heli:getTypeName() .. " into combat", 10)
end
end
end
end
function ctld.insertIntoTroopsArray(_troopType,_count,_troopArray)
for _i = 1, _count do
@@ -2895,7 +2923,7 @@ function ctld.unpackCrates(_arguments)
local _crate = ctld.getClosestCrate(_heli, _crates)
if ctld.inLogisticsZone(_heli) == true or ctld.farEnoughFromLogisticZone(_heli) == true then
if ctld.inLogisticsZone(_heli) == true or ctld.farEnoughFromLogisticZone(_heli) == false then
ctld.displayMessageToGroup(_heli, "You can't unpack that here! Take it to where it's needed!", 20)
@@ -2971,10 +2999,14 @@ function ctld.unpackCrates(_arguments)
if ctld.isJTACUnitType(_crate.details.unit) and ctld.JTAC_dropEnabled then
local _side = _heli:getCoalition()
local _code = ctld.jtacGetLaserCodeBySide(_side)
local _code = table.remove(ctld.jtacGeneratedLaserCodes, 1)
--put to the end
table.insert(ctld.jtacGeneratedLaserCodes, _code)
ctld.CreateJTAC(_spawnedGroups:getName(), _code)
-- create timer
ctld.despawnTimer(_spawnedGroups:getName(),ctld.JTAC_despawnTimer)
ctld.JTACAutoLase(_spawnedGroups:getName(), _code) --(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
end
end
@@ -4413,8 +4445,9 @@ function ctld.farEnoughFromLogisticZone(_heli)
--get distance
local _dist = ctld.getDistance(_heliPoint, _logistic:getPoint())
-- env.info("DIST ".._dist)
if _dist <= ctld.minimumDeployDistance then
-- env.info("TOO CLOSE ".._dist)
_farEnough = false
end
end
@@ -4920,120 +4953,7 @@ ctld.jtacCurrentTargets = {}
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.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)
@@ -5049,6 +4969,8 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
end
ctld.jtacLaserPointCodes[_jtacGroupName] = _laserCode
local _jtacGroup = ctld.getGroup(_jtacGroupName)
local _jtacUnit
@@ -5080,18 +5002,8 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
if ctld.jtacUnits[_jtacGroupName] ~= nil then
local _side = ctld.jtacUnits[_jtacGroupName].side
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
ctld.notifyCoalition("JTAC Group " .. _jtacGroupName .. " KIA!", 10, ctld.jtacUnits[_jtacGroupName].side)
end
--remove from list
ctld.jtacUnits[_jtacGroupName] = nil
@@ -5174,7 +5086,7 @@ function ctld.JTACAutoLase(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
-- store current target for easy lookup
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) .. ". Smoke: " .. ctld.GetColorName(_colour), 10, _jtacUnit:getCoalition())
ctld.notifyCoalition(_jtacGroupName .. " lasing new target " .. _enemyUnit:getTypeName() .. '. CODE: ' .. _laserCode .. ctld.getPositionString(_enemyUnit), 10, _jtacUnit:getCoalition())
-- create smoke
if _smoke == true then
@@ -5602,8 +5514,6 @@ function ctld.getJTACStatus(_args)
local _enemyUnit = ctld.getCurrentUnit(_jtacUnit, _jtacGroupName)
local _jtacColor = ctld.jtacColor[_jtacGroupName]
local _laserCode = ctld.jtacLaserPointCodes[_jtacGroupName]
if _laserCode == nil then
@@ -5611,7 +5521,7 @@ function ctld.getJTACStatus(_args)
end
if _enemyUnit ~= nil and _enemyUnit:getLife() > 0 and _enemyUnit:isActive() == true then
_message = _message .. "" .. _jtacGroupName .. " targeting " .. _enemyUnit:getTypeName() .. " CODE: " .. _laserCode .. ctld.getPositionString(_enemyUnit) ..". Visual indication: " .. ctld.GetColorName(_jtacColor).. " smoke." .. "\n"
_message = _message .. "" .. _jtacGroupName .. " targeting " .. _enemyUnit:getTypeName() .. " CODE: " .. _laserCode .. ctld.getPositionString(_enemyUnit) .. "\n"
local _list = ctld.listNearbyEnemies(_jtacUnit)
@@ -5638,21 +5548,7 @@ function ctld.getJTACStatus(_args)
ctld.notifyCoalition(_message, 10, _side)
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)
@@ -5716,10 +5612,6 @@ function ctld.generateLaserCode()
end
end
function ctld.jtacGetLaserCodeBySide(_side)
return ctld.laser_codes[_side]
end
function ctld.containsDigit(_number, _numberToFind)
local _thisNumber = _number
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.