Compare commits

...

6 Commits

Author SHA1 Message Date
Ciaran Fisher 5452bc7539 Merge pull request #35 from ciribob/master
Merge pull request #33 from ciribob/crateMove
2018-01-18 21:47:03 +00:00
Ciaran Fisher 2a4c9ed91a Merge pull request #33 from ciribob/crateMove
Added force crate to be moved
2018-01-18 20:42:16 +00:00
Ciaran Fisher a78dd40688 Added force crate to be moved
Added Wait time for requesting crates

Added per unit type optional group limits

Added per unit type allowable actions
2017-07-24 21:06:53 +01:00
Ciaran Fisher 44ff4d61da Version 2017-06-25 21:06:51 +01:00
Ciaran Fisher 196efb7bcb Added ability to set maximum group size
You can now set the maximum group size that'll fit in a helicopter.
Larger groups cant be picked up
2017-06-25 21:03:33 +01:00
Ciaran Fisher 38128b65c0 Release 1.64
Fixed bug where count in zone wouldn't work for Mission editor added
crates
Delayed config by a second so you can easily override options without
editing the file
2016-12-11 09:09:20 +00:00
6 changed files with 186 additions and 31 deletions
+184 -29
View File
@@ -16,9 +16,12 @@
- jmontleon - https://github.com/jmontleon - jmontleon - https://github.com/jmontleon
- emilianomolina - https://github.com/emilianomolina - emilianomolina - https://github.com/emilianomolina
Version: 1.63 - 07/12/2016 Version: 1.70 - 25/06/2017
- Added ability to set maximum group size that can be carried
- Added new sling load crates - Added new sling load crates
- Fixed bug where crates and / or groups would disappear - 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!
@@ -47,6 +50,7 @@ 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.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
ctld.enableFastRopeInsertion = true -- allows you to drop troops by fast rope ctld.enableFastRopeInsertion = true -- allows you to drop troops by fast rope
ctld.fastRopeMaximumHeight = 18.28 -- in meters which is 60 ft max fast rope (not rappell) safe height ctld.fastRopeMaximumHeight = 18.28 -- in meters which is 60 ft max fast rope (not rappell) safe height
@@ -72,6 +76,10 @@ ctld.troopPickupAtFOB = true -- if true, troops can also be picked up at a creat
ctld.buildTimeFOB = 120 --time in seconds for the FOB to be built ctld.buildTimeFOB = 120 --time in seconds for the FOB to be built
ctld.crateWaitTime = 120 -- time in seconds to wait before you can spawn another crate
ctld.forceCrateToBeMoved = true -- a crate must be picked up at least once and moved before it can be unpacked. Helps to reduce crate spam
ctld.radioSound = "beacon.ogg" -- the name of the sound file to use for the FOB radio beacons. If this isnt added to the mission BEACONS WONT WORK! ctld.radioSound = "beacon.ogg" -- the name of the sound file to use for the FOB radio beacons. If this isnt added to the mission BEACONS WONT WORK!
ctld.radioSoundFC3 = "beaconsilent.ogg" -- name of the second silent radio file, used so FC3 aircraft dont hear ALL the beacon noises... :) ctld.radioSoundFC3 = "beaconsilent.ogg" -- name of the second silent radio file, used so FC3 aircraft dont hear ALL the beacon noises... :)
@@ -387,6 +395,49 @@ ctld.vehicleTransportEnabled = {
"C-130", "C-130",
} }
-- ************** Maximum Units SETUP for UNITS ******************
-- Put the name of the Unit you want to limit group sizes too
-- i.e
-- ["UH-1H"] = 10,
--
-- Will limit UH1 to only transport groups with a size 10 or less
-- Make sure the unit name is exactly right or it wont work
ctld.unitLoadLimits = {
-- Remove the -- below to turn on options
-- ["SA342Mistral"] = 4,
-- ["SA342L"] = 4,
-- ["SA342M"] = 4,
}
-- ************** Allowable actions for UNIT TYPES ******************
-- Put the name of the Unit you want to limit actions for
-- NOTE - the unit must've been listed in the transportPilotNames list above
-- This can be used in conjunction with the options above for group sizes
-- By default you can load both crates and troops unless overriden below
-- i.e
-- ["UH-1H"] = {crates=true, troops=false},
--
-- Will limit UH1 to only transport CRATES but NOT TROOPS
--
-- ["SA342Mistral"] = {crates=fales, troops=true},
-- Will allow Mistral Gazelle to only transport crates, not troops
ctld.unitActions = {
-- Remove the -- below to turn on options
-- ["SA342Mistral"] = {crates=true, troops=true},
-- ["SA342L"] = {crates=false, troops=true},
-- ["SA342M"] = {crates=false, troops=true},
}
-- ************** INFANTRY GROUPS FOR PICKUP ****************** -- ************** INFANTRY GROUPS FOR PICKUP ******************
-- Unit Types -- Unit Types
-- inf is normal infantry -- inf is normal infantry
@@ -1273,6 +1324,9 @@ ctld.AASystemTemplate = {
} }
ctld.crateWait = {}
ctld.crateMove = {}
---------------- INTERNAL FUNCTIONS ---------------- ---------------- INTERNAL FUNCTIONS ----------------
function ctld.getTransportUnit(_unitName) function ctld.getTransportUnit(_unitName)
@@ -1526,8 +1580,17 @@ function ctld.spawnCrate(_arguments)
local _position = _heli:getPosition() local _position = _heli:getPosition()
-- check crate spam
if _heli:getPlayerName() ~= nil and ctld.crateWait[_heli:getPlayerName()] and ctld.crateWait[_heli:getPlayerName()] < timer.getTime() then
-- trigger.action.outText("Spawn Crate".._args[1].." ".._args[2],10) ctld.displayMessageToGroup(_heli,"Sorry you must wait "..(ctld.crateWait[_heli:getPlayerName()] - timer.getTime()).. " seconds before you can get another crate", 20)
return
end
if _heli:getPlayerName() ~= nil then
ctld.crateWait[_heli:getPlayerName()] = timer.getTime() + ctld.crateWaitTime
end
-- trigger.action.outText("Spawn Crate".._args[1].." ".._args[2],10)
local _heli = ctld.getTransportUnit(_args[1]) local _heli = ctld.getTransportUnit(_args[1])
@@ -1541,6 +1604,9 @@ function ctld.spawnCrate(_arguments)
local _spawnedCrate = ctld.spawnCrateStatic(_heli:getCountry(), _unitId, _point, _name, _crateType.weight,_side) local _spawnedCrate = ctld.spawnCrateStatic(_heli:getCountry(), _unitId, _point, _name, _crateType.weight,_side)
-- add to move table
ctld.crateMove[_name] = _name
ctld.displayMessageToGroup(_heli, string.format("A %s crate weighing %s kg has been brought out and is at your 12 o'clock ", _crateType.desc, _crateType.weight), 20) ctld.displayMessageToGroup(_heli, string.format("A %s crate weighing %s kg has been brought out and is at your 12 o'clock ", _crateType.desc, _crateType.weight), 20)
else else
@@ -2177,8 +2243,21 @@ function ctld.extractTroops(_args)
_extractTroops = ctld.findNearestGroup(_heli, ctld.droppedTroopsBLUE) _extractTroops = ctld.findNearestGroup(_heli, ctld.droppedTroopsBLUE)
end end
if _extractTroops ~= nil then if _extractTroops ~= nil then
local _limit = ctld.getTransportLimit(_heli:getTypeName())
local _size = #_extractTroops.group:getUnits()
if _limit < #_extractTroops.group:getUnits() then
ctld.displayMessageToGroup(_heli, "Sorry - The group of ".._size.." is too large to fit. \n\nLimit is ".._limit.." for ".._heli:getTypeName(), 20)
return
end
_onboard.troops = _extractTroops.details _onboard.troops = _extractTroops.details
trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " extracted troops in " .. _heli:getTypeName() .. " from combat", 10) trigger.action.outTextForCoalition(_heli:getCoalition(), ctld.getPlayerNameOrType(_heli) .. " extracted troops in " .. _heli:getTypeName() .. " from combat", 10)
@@ -2355,6 +2434,9 @@ function ctld.checkHoverStatus()
ctld.hoverStatus[_transUnit:getName()] = nil ctld.hoverStatus[_transUnit:getName()] = nil
ctld.displayMessageToGroup(_transUnit, "Loaded " .. _crate.details.desc .. " crate!", 10,true) ctld.displayMessageToGroup(_transUnit, "Loaded " .. _crate.details.desc .. " crate!", 10,true)
--crates been moved once!
ctld.crateMove[_crate.crateUnit:getName()] = nil
if _transUnit:getCoalition() == 1 then if _transUnit:getCoalition() == 1 then
ctld.spawnedCratesRED[_crate.crateUnit:getName()] = nil ctld.spawnedCratesRED[_crate.crateUnit:getName()] = nil
else else
@@ -2415,6 +2497,8 @@ function ctld.loadNearbyCrate(_name)
ctld.spawnedCratesBLUE[_crate.crateUnit:getName()] = nil ctld.spawnedCratesBLUE[_crate.crateUnit:getName()] = nil
end end
ctld.crateMove[_crate.crateUnit:getName()] = nil
_crate.crateUnit:destroy() _crate.crateUnit:destroy()
local _copiedCrate = mist.utils.deepCopy(_crate.details) local _copiedCrate = mist.utils.deepCopy(_crate.details)
@@ -2817,6 +2901,12 @@ function ctld.unpackCrates(_arguments)
return return
end end
if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] then
ctld.displayMessageToGroup(_heli,"Sorry you must move this crate before you unpack it!", 20)
return
end
local _aaTemplate = ctld.getAATemplate(_crate.details.unit) local _aaTemplate = ctld.getAATemplate(_crate.details.unit)
if _aaTemplate then if _aaTemplate then
@@ -4509,6 +4599,26 @@ function ctld.checkAIStatus()
end end
function ctld.getTransportLimit(_unitType)
if ctld.unitLoadLimits[_unitType] then
return ctld.unitLoadLimits[_unitType]
end
return ctld.numberOfTroops
end
function ctld.getUnitActions(_unitType)
if ctld.unitActions[_unitType] then
return ctld.unitActions[_unitType]
end
return {crates=true,troops=true}
end
-- Adds menuitem to all heli units that are active -- Adds menuitem to all heli units that are active
function ctld.addF10MenuOptions() function ctld.addF10MenuOptions()
@@ -4532,35 +4642,46 @@ function ctld.addF10MenuOptions()
local _rootPath = missionCommands.addSubMenuForGroup(_groupId, "CTLD") local _rootPath = missionCommands.addSubMenuForGroup(_groupId, "CTLD")
local _troopCommandsPath = missionCommands.addSubMenuForGroup(_groupId, "Troop Transport", _rootPath) local _unitActions = ctld.getUnitActions(_unit:getTypeName())
missionCommands.addCommandForGroup(_groupId, "Unload / Extract Troops", _troopCommandsPath, ctld.unloadExtractTroops, { _unitName })
missionCommands.addCommandForGroup(_groupId, "Check Cargo", _troopCommandsPath, ctld.checkTroopStatus, { _unitName }) if _unitActions.troops then
-- local _loadPath = missionCommands.addSubMenuForGroup(_groupId, "Load From Zone", _troopCommandsPath) local _troopCommandsPath = missionCommands.addSubMenuForGroup(_groupId, "Troop Transport", _rootPath)
for _,_loadGroup in pairs(ctld.loadableGroups) do
if not _loadGroup.side or _loadGroup.side == _unit:getCoalition() then missionCommands.addCommandForGroup(_groupId, "Unload / Extract Troops", _troopCommandsPath, ctld.unloadExtractTroops, { _unitName })
missionCommands.addCommandForGroup(_groupId, "Load ".._loadGroup.name, _troopCommandsPath, ctld.loadTroopsFromZone, { _unitName, true,_loadGroup,false })
missionCommands.addCommandForGroup(_groupId, "Check Cargo", _troopCommandsPath, ctld.checkTroopStatus, { _unitName })
-- local _loadPath = missionCommands.addSubMenuForGroup(_groupId, "Load From Zone", _troopCommandsPath)
for _,_loadGroup in pairs(ctld.loadableGroups) do
if not _loadGroup.side or _loadGroup.side == _unit:getCoalition() then
-- check size & unit
if ctld.getTransportLimit(_unit:getTypeName()) >= _loadGroup.total then
missionCommands.addCommandForGroup(_groupId, "Load ".._loadGroup.name, _troopCommandsPath, ctld.loadTroopsFromZone, { _unitName, true,_loadGroup,false })
end
end
end end
end
if ctld.unitCanCarryVehicles(_unit) then if ctld.unitCanCarryVehicles(_unit) then
local _vehicleCommandsPath = missionCommands.addSubMenuForGroup(_groupId, "Vehicle / FOB Transport", _rootPath) local _vehicleCommandsPath = missionCommands.addSubMenuForGroup(_groupId, "Vehicle / FOB Transport", _rootPath)
missionCommands.addCommandForGroup(_groupId, "Unload Vehicles", _vehicleCommandsPath, ctld.unloadTroops, { _unitName, false }) missionCommands.addCommandForGroup(_groupId, "Unload Vehicles", _vehicleCommandsPath, ctld.unloadTroops, { _unitName, false })
missionCommands.addCommandForGroup(_groupId, "Load / Extract Vehicles", _vehicleCommandsPath, ctld.loadTroopsFromZone, { _unitName, false,"",true }) missionCommands.addCommandForGroup(_groupId, "Load / Extract Vehicles", _vehicleCommandsPath, ctld.loadTroopsFromZone, { _unitName, false,"",true })
if ctld.enabledFOBBuilding and ctld.staticBugWorkaround == false then if ctld.enabledFOBBuilding and ctld.staticBugWorkaround == false then
missionCommands.addCommandForGroup(_groupId, "Load / Unload FOB Crate", _vehicleCommandsPath, ctld.loadUnloadFOBCrate, { _unitName, false }) missionCommands.addCommandForGroup(_groupId, "Load / Unload FOB Crate", _vehicleCommandsPath, ctld.loadUnloadFOBCrate, { _unitName, false })
end
missionCommands.addCommandForGroup(_groupId, "Check Cargo", _vehicleCommandsPath, ctld.checkTroopStatus, { _unitName })
end end
missionCommands.addCommandForGroup(_groupId, "Check Cargo", _vehicleCommandsPath, ctld.checkTroopStatus, { _unitName })
end end
if ctld.enableCrates then if ctld.enableCrates and _unitActions.crates then
if ctld.unitCanCarryVehicles(_unit) == false then if ctld.unitCanCarryVehicles(_unit) == false then
@@ -4590,7 +4711,8 @@ function ctld.addF10MenuOptions()
end end
end end
if ctld.enabledFOBBuilding or ctld.enableCrates then if (ctld.enabledFOBBuilding or ctld.enableCrates) and _unitActions.crates then
local _crateCommands = missionCommands.addSubMenuForGroup(_groupId, "CTLD Commands", _rootPath) local _crateCommands = missionCommands.addSubMenuForGroup(_groupId, "CTLD Commands", _rootPath)
if ctld.hoverPickup == false then if ctld.hoverPickup == false then
if ctld.slingLoad == false then if ctld.slingLoad == false then
@@ -5786,20 +5908,52 @@ if ctld.allowRandomAiTeamPickups == true then
end end
end end
-- add total count
-- Scheduled functions (run cyclically) for _,_loadGroup in pairs(ctld.loadableGroups) do
timer.scheduleFunction(ctld.refreshSmoke, nil, timer.getTime() + 5) _loadGroup.total = 0
timer.scheduleFunction(ctld.addF10MenuOptions, nil, timer.getTime() + 5) if _loadGroup.aa then
timer.scheduleFunction(ctld.checkAIStatus, nil, timer.getTime() + 1) _loadGroup.total = _loadGroup.aa + _loadGroup.total
timer.scheduleFunction(ctld.checkTransportStatus, nil, timer.getTime() + 5) end
timer.scheduleFunction(ctld.refreshRadioBeacons, nil, timer.getTime() + 5)
if _loadGroup.inf then
_loadGroup.total = _loadGroup.inf + _loadGroup.total
end
if _loadGroup.mg then
_loadGroup.total = _loadGroup.mg + _loadGroup.total
end
if _loadGroup.at then
_loadGroup.total = _loadGroup.at + _loadGroup.total
end
if _loadGroup.mortar then
_loadGroup.total = _loadGroup.mortar + _loadGroup.total
end
if ctld.enableCrates == true and ctld.slingLoad == false and ctld.hoverPickup == true then
timer.scheduleFunction(ctld.checkHoverStatus, nil, timer.getTime() + 1)
end end
-- Scheduled functions (run cyclically) -- but hold execution for a second so we can override parts
timer.scheduleFunction(ctld.checkAIStatus, nil, timer.getTime() + 1)
timer.scheduleFunction(ctld.checkTransportStatus, nil, timer.getTime() + 5)
timer.scheduleFunction(function()
timer.scheduleFunction(ctld.refreshRadioBeacons, nil, timer.getTime() + 5)
timer.scheduleFunction(ctld.refreshSmoke, nil, timer.getTime() + 5)
timer.scheduleFunction(ctld.addF10MenuOptions, nil, timer.getTime() + 5)
if ctld.enableCrates == true and ctld.slingLoad == false and ctld.hoverPickup == true then
timer.scheduleFunction(ctld.checkHoverStatus, nil, timer.getTime() + 1)
end
end,nil, timer.getTime()+1 )
--event handler for deaths --event handler for deaths
--world.addEventHandler(ctld.eventHandler) --world.addEventHandler(ctld.eventHandler)
@@ -5848,8 +6002,9 @@ for _coalitionName, _coalitionData in pairs(env.mission.coalition) do
if _group and _group.units and type(_group.units) == 'table' then if _group and _group.units and type(_group.units) == 'table' then
for _unitNum, _unit in pairs(_group.units) do for _unitNum, _unit in pairs(_group.units) do
if _unit.canCargo == true then if _unit.canCargo == true then
ctld.missionEditorCargoCrates[_unit.name] = _unit.name local _cargoName = env.getValueDictByKey(_unit.name)
env.info("Crate Found: " .. _unit.name) ctld.missionEditorCargoCrates[_cargoName] = _cargoName
env.info("Crate Found: " .. _unit.name.." - Unit: ".._cargoName)
end end
end end
end end
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.