6 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
Ciaran Fisher
844144f695 Added minimum distance from friendly logistics option 2018-04-15 15:51:44 +01:00
Ciaran Fisher
f12c67c5e0 Bug Fix
Bug fix for crate timing out
2018-02-18 17:16:40 +00:00
8 changed files with 6127 additions and 6052 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
*.iml
.idea/encodings.xml
*.xml

104
CTLD.lua
View File

@@ -16,14 +16,8 @@
- jmontleon - https://github.com/jmontleon - jmontleon - https://github.com/jmontleon
- emilianomolina - https://github.com/emilianomolina - emilianomolina - https://github.com/emilianomolina
Version: 1.71 - 18/01/2018 Version: 1.73 - 15/04/2018
- Improved JTAC Performance - priority & targeting - Allow minimum distance from friendly logistics to be set
- 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
]] ]]
ctld = {} -- DONT REMOVE! ctld = {} -- DONT REMOVE!
@@ -51,6 +45,10 @@ ctld.maximumDistanceLogistic = 200 -- max distance from vehicle to logistics to
ctld.maximumSearchDistance = 4000 -- max distance for troops to search for enemy ctld.maximumSearchDistance = 4000 -- max distance for troops to search for enemy
ctld.maximumMoveDistance = 2000 -- max distance for troops to move from drop point if no enemy is nearby ctld.maximumMoveDistance = 2000 -- max distance for troops to move from drop point if no enemy is nearby
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 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 -- 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 ctld.enableFastRopeInsertion = true -- allows you to drop troops by fast rope
@@ -134,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_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 ***************** -- ***************** Pickup, dropoff and waypoint zones *****************
-- Available colors (anything else like "none" disables smoke): "green", "red", "white", "orange", "blue", "none", -- Available colors (anything else like "none" disables smoke): "green", "red", "white", "orange", "blue", "none",
@@ -1583,7 +1583,7 @@ function ctld.spawnCrate(_arguments)
local _position = _heli:getPosition() local _position = _heli:getPosition()
-- check crate spam -- check crate spam
if _heli:getPlayerName() ~= nil and ctld.crateWait[_heli:getPlayerName()] and ctld.crateWait[_heli:getPlayerName()] < timer.getTime() then if _heli:getPlayerName() ~= nil and ctld.crateWait[_heli:getPlayerName()] and ctld.crateWait[_heli:getPlayerName()] > timer.getTime() then
ctld.displayMessageToGroup(_heli,"Sorry you must wait "..(ctld.crateWait[_heli:getPlayerName()] - timer.getTime()).. " seconds before you can get another crate", 20) ctld.displayMessageToGroup(_heli,"Sorry you must wait "..(ctld.crateWait[_heli:getPlayerName()] - timer.getTime()).. " seconds before you can get another crate", 20)
return return
@@ -1659,6 +1659,32 @@ function ctld.troopsOnboard(_heli, _troops)
end end
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 -- if its dropped by AI then there is no player name so return the type of unit
function ctld.getPlayerNameOrType(_heli) function ctld.getPlayerNameOrType(_heli)
@@ -1755,6 +1781,9 @@ function ctld.deployTroops(_heli, _troops)
ctld.processCallback({unit = _heli, unloaded = _droppedTroops, action = "dropped_troops"}) ctld.processCallback({unit = _heli, unloaded = _droppedTroops, action = "dropped_troops"})
-- create timer
ctld.despawnTimer(_droppedTroops:getName(),ctld.despawnTroopsTimer)
else else
--extract zone! --extract zone!
@@ -1796,12 +1825,18 @@ function ctld.deployTroops(_heli, _troops)
ctld.processCallback({unit = _heli, unloaded = _droppedVehicles, action = "dropped_vehicles"}) 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) trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " dropped vehicles from " .. _heli:getTypeName() .. " into combat", 10)
end end
end end
end end
end end
function ctld.insertIntoTroopsArray(_troopType,_count,_troopArray) function ctld.insertIntoTroopsArray(_troopType,_count,_troopArray)
for _i = 1, _count do for _i = 1, _count do
@@ -2887,6 +2922,16 @@ function ctld.unpackCrates(_arguments)
local _crates = ctld.getCratesAndDistance(_heli) local _crates = ctld.getCratesAndDistance(_heli)
local _crate = ctld.getClosestCrate(_heli, _crates) local _crate = ctld.getClosestCrate(_heli, _crates)
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)
return
end
if _crate ~= nil and _crate.dist < 750 if _crate ~= nil and _crate.dist < 750
and (_crate.details.unit == "FOB" or _crate.details.unit == "FOB-SMALL") then and (_crate.details.unit == "FOB" or _crate.details.unit == "FOB-SMALL") then
@@ -2896,13 +2941,6 @@ function ctld.unpackCrates(_arguments)
elseif _crate ~= nil and _crate.dist < 200 then elseif _crate ~= nil and _crate.dist < 200 then
if ctld.inLogisticsZone(_heli) == true then
ctld.displayMessageToGroup(_heli, "You can't unpack that here! Take it to where it's needed!", 20)
return
end
if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] then if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] then
ctld.displayMessageToGroup(_heli,"Sorry you must move this crate before you unpack it!", 20) ctld.displayMessageToGroup(_heli,"Sorry you must move this crate before you unpack it!", 20)
return return
@@ -2965,6 +3003,9 @@ function ctld.unpackCrates(_arguments)
--put to the end --put to the end
table.insert(ctld.jtacGeneratedLaserCodes, _code) table.insert(ctld.jtacGeneratedLaserCodes, _code)
-- create timer
ctld.despawnTimer(_spawnedGroups:getName(),ctld.JTAC_despawnTimer)
ctld.JTACAutoLase(_spawnedGroups:getName(), _code) --(_jtacGroupName, _laserCode, _smoke, _lock, _colour) ctld.JTACAutoLase(_spawnedGroups:getName(), _code) --(_jtacGroupName, _laserCode, _smoke, _lock, _colour)
end end
end end
@@ -4384,6 +4425,37 @@ function ctld.inLogisticsZone(_heli)
return false return false
end end
-- are far enough from a friendly logistics zone
function ctld.farEnoughFromLogisticZone(_heli)
if ctld.inAir(_heli) then
return false
end
local _heliPoint = _heli:getPoint()
local _farEnough = true
for _, _name in pairs(ctld.logisticUnits) do
local _logistic = StaticObject.getByName(_name)
if _logistic ~= nil and _logistic:getCoalition() == _heli:getCoalition() then
--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
end
return _farEnough
end
function ctld.refreshSmoke() function ctld.refreshSmoke()
if ctld.disableAllSmoke == true then if ctld.disableAllSmoke == true then

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.