dynamic-cargo

This commit is contained in:
spencershepard 2024-08-18 20:33:20 -07:00 committed by Spencer Shepard
parent 892f12fc98
commit 16429df96c
2 changed files with 75 additions and 35 deletions

View File

@ -14,6 +14,7 @@ client_helos = [
player_helos = [ player_helos = [
dcs.helicopters.AH_64D_BLK_II, dcs.helicopters.AH_64D_BLK_II,
dcs.helicopters.CH_47Fbl1,
dcs.helicopters.Ka_50, dcs.helicopters.Ka_50,
dcs.helicopters.Ka_50_3, dcs.helicopters.Ka_50_3,
dcs.helicopters.Mi_8MT, dcs.helicopters.Mi_8MT,

View File

@ -18,6 +18,8 @@
- davidp57 - https://github.com/veaf - davidp57 - https://github.com/veaf
- Queton1-1 - https://github.com/Queton1-1 - Queton1-1 - https://github.com/Queton1-1
- Proxy404 - https://github.com/Proxy404 - Proxy404 - https://github.com/Proxy404
- GRIMM - https://github.com/spencershepard
]] ]]
ctld = {} -- DONT REMOVE! ctld = {} -- DONT REMOVE!
@ -26,7 +28,7 @@
ctld.Id = "CTLD - " ctld.Id = "CTLD - "
--- Version. --- Version.
ctld.Version = "202401.01" ctld.Version = "202408.01"
--https://github.com/spencershepard/DCS-CTLD/tree/rotorops --https://github.com/spencershepard/DCS-CTLD/tree/rotorops
-- To add debugging messages to dcs.log, change the following log levels to `true`; `Debug` is less detailed than `Trace` -- To add debugging messages to dcs.log, change the following log levels to `true`; `Debug` is less detailed than `Trace`
@ -57,10 +59,10 @@
ctld.maximumDistanceLogistic = 200 -- max distance from vehicle to logistics to allow a loading or spawning operation ctld.maximumDistanceLogistic = 200 -- max distance from vehicle to logistics to allow a loading or spawning operation
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.minimumDeployDistance = 1000 -- minimum distance from a friendly pickup zone where you can deploy a crate
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
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
@ -93,7 +95,7 @@
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.crateWaitTime = 60 -- 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.forceCrateToBeMoved = true -- a crate must be picked up at least once and moved before it can be unpacked. Helps to reduce crate spam
@ -421,6 +423,14 @@
"76MD", -- the il-76 mod doesnt use a normal - sign so il-76md wont match... !!!! GRR "76MD", -- the il-76 mod doesnt use a normal - sign so il-76md wont match... !!!! GRR
"Hercules", "Hercules",
} }
-- ************** Units able to use DCS dynamic cargo system ******************
-- DCS (version) added the ability to load and unload cargo from aircraft.
-- Units listed here will spawn a cargo static that can be loaded with the standard DCS cargo system
-- We will also use this to make modifications to the menu and other checks and messages
ctld.dynamicCargoUnits = {
"CH-47Fbl1",
}
-- ************** Maximum Units SETUP for UNITS ****************** -- ************** Maximum Units SETUP for UNITS ******************
@ -583,20 +593,29 @@
{ weight = 595, desc = "Early Warning Radar", unit = "1L13 EWR", side = 1 }, -- cant be used by BLUE coalition { weight = 595, desc = "Early Warning Radar", unit = "1L13 EWR", side = 1 }, -- cant be used by BLUE coalition
}, },
} }
--- 3D model that will be used to represent a loadable crate ; by default, a generator ctld.spawnableCratesModels = {
ctld.spawnableCratesModel_load = { ["load"] = {
["category"] = "Fortifications", ["category"] = "Fortifications",
["shape_name"] = "GeneratorF", ["shape_name"] = "GeneratorF",
["type"] = "GeneratorF" ["type"] = "GeneratorF",
["canCargo"] = false,
},
["sling"] = {
["category"] = "Cargos",
["shape_name"] = "bw_container_cargo",
["type"] = "container_cargo",
["canCargo"] = true
},
["dynamic"] = {
["category"] = "Cargos",
["shape_name"] = "ammo_box_cargo",
["type"] = "ammo_cargo",
["canCargo"] = true
}
} }
--- 3D model that will be used to represent a slingable crate ; by default, a crate
ctld.spawnableCratesModel_sling = {
["category"] = "Cargos",
["shape_name"] = "bw_container_cargo",
["type"] = "container_cargo"
}
--[[ Placeholder for different type of cargo containers. Let's say pipes and trunks, fuel for FOB building --[[ Placeholder for different type of cargo containers. Let's say pipes and trunks, fuel for FOB building
["shape_name"] = "ab-212_cargo", ["shape_name"] = "ab-212_cargo",
@ -1536,15 +1555,15 @@
return nil return nil
end end
function ctld.spawnCrateStatic(_country, _unitId, _point, _name, _weight,_side) function ctld.spawnCrateStatic(_country, _unitId, _point, _name, _weight, _side, _model_type)
local _crate local _crate
local _spawnedCrate local _spawnedCrate
if ctld.staticBugWorkaround and ctld.slingLoad == false then if ctld.staticBugWorkaround and ctld.slingLoad == false then
local _groupId = ctld.getNextGroupId() local _groupId = ctld.getNextGroupId()
local _groupName = "Crate Group #".._groupId local _groupName = "Crate Group #".._groupId
local _group = { local _group = {
["visible"] = false, ["visible"] = false,
-- ["groupId"] = _groupId, -- ["groupId"] = _groupId,
@ -1555,27 +1574,27 @@
["name"] = _groupName, ["name"] = _groupName,
["task"] = {}, ["task"] = {},
} }
_group.units[1] = ctld.createUnit(_point.x , _point.z , 0, {type="UAZ-469",name=_name,unitId=_unitId}) _group.units[1] = ctld.createUnit(_point.x , _point.z , 0, {type="UAZ-469",name=_name,unitId=_unitId})
--switch to MIST --switch to MIST
_group.category = Group.Category.GROUND; _group.category = Group.Category.GROUND;
_group.country = _country; _group.country = _country;
local _spawnedGroup = Group.getByName(mist.dynAdd(_group).name) local _spawnedGroup = Group.getByName(mist.dynAdd(_group).name)
-- Turn off AI -- Turn off AI
trigger.action.setGroupAIOff(_spawnedGroup) trigger.action.setGroupAIOff(_spawnedGroup)
_spawnedCrate = Unit.getByName(_name) _spawnedCrate = Unit.getByName(_name)
else else
if ctld.slingLoad then if _model_type ~= nil then
_crate = mist.utils.deepCopy(ctld.spawnableCratesModel_sling) _crate = mist.utils.deepCopy(ctld.spawnableCratesModels[_model_type])
_crate["canCargo"] = true elseif ctld.slingLoad then
_crate = mist.utils.deepCopy(ctld.spawnableCratesModels["sling"])
else else
_crate = mist.utils.deepCopy(ctld.spawnableCratesModel_load) _crate = mist.utils.deepCopy(ctld.spawnableCratesModels["load"])
_crate["canCargo"] = false
end end
_crate["y"] = _point.z _crate["y"] = _point.z
@ -1732,8 +1751,14 @@
local _side = _heli:getCoalition() local _side = _heli:getCoalition()
local _name = string.format("%s #%i", _crateType.desc, _unitId) local _name = string.format("%s #%i", _crateType.desc, _unitId)
local _model_type = nil
if ctld.unitDynamicCargoCapable(_heli) then
_model_type = "dynamic"
end
local _spawnedCrate = ctld.spawnCrateStatic(_heli:getCountry(), _unitId, _point, _name, _crateType.weight,_side) local _spawnedCrate = ctld.spawnCrateStatic(_heli:getCountry(), _unitId, _point, _name, _crateType.weight, _side, _model_type)
-- add to move table -- add to move table
ctld.crateMove[_name] = _name ctld.crateMove[_name] = _name
@ -2601,7 +2626,7 @@
local _transUnit = ctld.getTransportUnit(_name) local _transUnit = ctld.getTransportUnit(_name)
--only check transports that are hovering and not planes --only check transports that are hovering and not planes
if _transUnit ~= nil and ctld.inTransitSlingLoadCrates[_name] == nil and ctld.inAir(_transUnit) and ctld.unitCanCarryVehicles(_transUnit) == false then if _transUnit ~= nil and ctld.inTransitSlingLoadCrates[_name] == nil and ctld.inAir(_transUnit) and ctld.unitCanCarryVehicles(_transUnit) == false and not ctld.unitDynamicCargoCapable(_transUnit) then
local _crates = ctld.getCratesAndDistance(_transUnit) local _crates = ctld.getCratesAndDistance(_transUnit)
@ -3105,7 +3130,7 @@
elseif _crate ~= nil and _crate.dist < 200 then elseif _crate ~= nil and _crate.dist < 200 then
if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] then if ctld.forceCrateToBeMoved and ctld.crateMove[_crate.crateUnit:getName()] and not ctld.unitDynamicCargoCapable(_heli) 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
end end
@ -4688,13 +4713,27 @@
for _, _name in ipairs(ctld.vehicleTransportEnabled) do for _, _name in ipairs(ctld.vehicleTransportEnabled) do
local _nameLower = string.lower(_name) local _nameLower = string.lower(_name)
if string.match(_type, _nameLower) then if string.find(_type, _nameLower, 1, true) then
return true return true
end end
end end
return false return false
end end
function ctld.unitDynamicCargoCapable(_unit)
local _type = string.lower(_unit:getTypeName())
for _, _name in ipairs(ctld.dynamicCargoUnits) do
local _nameLower = string.lower(_name)
if string.find(_type, _nameLower, 1, true) then --string.match does not work with patterns containing '-' as it is a magic character
return true
end
end
return false
end
function ctld.isJTACUnitType(_type) function ctld.isJTACUnitType(_type)