Bug Fixes and two new config options

Fixed error handling bug
Fixed possibility of the timer being reset for disabled planes
Added an option to stop CSAR helis being disabled
Added an option to disable planes whether or not the pilot ejects
This commit is contained in:
Ciaran Fisher
2015-09-10 17:49:36 +01:00
parent 9796d7c657
commit 5aec1ab797
2 changed files with 98 additions and 67 deletions

165
CSAR.lua
View File

@@ -1,5 +1,5 @@
-- CSAR Script for DCS Ciribob 2015 -- CSAR Script for DCS Ciribob 2015
-- Version 1.2 - 16/8/2015 -- Version 1.3 - 10/9/2015
csar = {} csar = {}
@@ -11,9 +11,15 @@ csar.redmash = { "RedMASH #1", "RedMASH #2" } -- The unit that serves as MASH fo
csar.disableAircraft = true -- DISABLE player aircraft until the pilot is rescued? csar.disableAircraft = true -- DISABLE player aircraft until the pilot is rescued?
csar.disableIfNoEjection = false -- if true disables aircraft even if the pilot doesnt eject
-- - I recommend you leave the option on below otherwise the
-- aircraft will be disabled for the duration of the mission
csar.disableAircraftTimeout = true -- Allow aircraft to be used after 20 minutes if the pilot isnt rescued csar.disableAircraftTimeout = true -- Allow aircraft to be used after 20 minutes if the pilot isnt rescued
csar.disableTimeoutTime = 20 -- Time in minutes for TIMEOUT csar.disableTimeoutTime = 20 -- Time in minutes for TIMEOUT
csar.disableCSARAircraft = false -- if set to TRUE then if a CSAR heli crashes or is shot down, it'll have to be rescued by another CSAR Heli!
csar.enableForAI = false -- set to false to disable AI units from being rescued. csar.enableForAI = false -- set to false to disable AI units from being rescued.
csar.bluesmokecolor = 4 -- Color of smokemarker for blue side, 0 is green, 1 is red, 2 is white, 3 is orange and 4 is blue csar.bluesmokecolor = 4 -- Color of smokemarker for blue side, 0 is green, 1 is red, 2 is white, 3 is orange and 4 is blue
@@ -117,9 +123,33 @@ function csar.eventHandler:onEvent(_event)
return true return true
elseif (_event.id == 9) then elseif (_event.id == 9) then
-- Pilot dead -- Pilot dead
trigger.action.outTextForCoalition(_event.initiator:getCoalition(), "MAYDAY MAYDAY! " .. _event.initiator:getTypeName() .. " shot down. No Chute!", 10)
--remove status messages for each Heli? env.info("Event unit - Pilot Dead")
local _unit = _event.initiator
if _unit == nil then
return -- error!
end
trigger.action.outTextForCoalition(_unit:getCoalition(), "MAYDAY MAYDAY! " .._unit:getTypeName() .. " shot down. No Chute!", 10)
--mark plane as broken and unflyable
if csar.disableIfNoEjection and _unit:getPlayerName() ~= nil and csar.disableAircraft == true and csar.currentlyDisabled[_unit:getName()] == nil then
if csar.disableCSARAircraft == false then
for _, _heliName in pairs(csar.csarUnits) do
if _unit:getName() == _heliName then
-- IGNORE Crashed CSAR
return
end
end
end
csar.currentlyDisabled[_unit:getName()] = {timeout = (csar.disableTimeoutTime*60) + timer.getTime(),desc="",noPilot = true}
timer.scheduleFunction(csar.checkDisabledAircraftStatus, _unit:getName(), timer.getTime() + 1)
end
return return
@@ -129,11 +159,22 @@ function csar.eventHandler:onEvent(_event)
local _unit = _event.initiator local _unit = _event.initiator
if _unit == nil then
return -- error!
end
if csar.currentlyDisabled[_unit:getName()] ~= nil then
return --already ejected once!
end
if csar.enableForAI == false and _unit:getPlayerName() == nil then if csar.enableForAI == false and _unit:getPlayerName() == nil then
return return
end end
local _spawnedGroup = csar.spawnGroup(_unit) local _spawnedGroup = csar.spawnGroup(_unit)
csar.addSpecialParametersToGroup(_spawnedGroup) csar.addSpecialParametersToGroup(_spawnedGroup)
@@ -153,8 +194,23 @@ function csar.eventHandler:onEvent(_event)
--mark plane as broken and unflyable --mark plane as broken and unflyable
if _unit:getPlayerName() ~= nil and csar.disableAircraft == true then if _unit:getPlayerName() ~= nil and csar.disableAircraft == true then
csar.currentlyDisabled[_unit:getName()] = {timeout = csar.disableTimeoutTime*60 + timer.getTime(),desc=_text}
timer.scheduleFunction(csar.checkDisabledAircraftStatus, _unit:getName(), timer.getTime() + 1) local _disable = true
if csar.disableCSARAircraft == false then
for _, _heliName in pairs(csar.csarUnits) do
if _unit:getName() == _heliName then
-- IGNORE Crashed CSAR and dont disable
_disable = false
break
end
end
end
if _disable then
csar.currentlyDisabled[_unit:getName()] = {timeout = (csar.disableTimeoutTime*60) + timer.getTime(),desc=_text, noPilot = false}
timer.scheduleFunction(csar.checkDisabledAircraftStatus, _unit:getName(), timer.getTime() + 1)
end
end end
--store the old group under the new group name --store the old group under the new group name
@@ -167,7 +223,7 @@ function csar.eventHandler:onEvent(_event)
end end
end, _event) end, _event)
if (not status) then if (not status) then
env.error(string.format("Error while handling event %s", err), csar.displayerrordialog) env.error(string.format("Error while handling event %s", err),false)
end end
end end
@@ -177,7 +233,7 @@ function csar.checkDisabledAircraftStatus(_name)
if _details ~= nil then if _details ~= nil then
if csar.disableAircraftTimeout and timer.getTime() > _details.timeout then if csar.disableAircraftTimeout and timer.getTime() >= _details.timeout then
--remove from disabled --remove from disabled
csar.currentlyDisabled[_name] = nil csar.currentlyDisabled[_name] = nil
@@ -186,10 +242,32 @@ function csar.checkDisabledAircraftStatus(_name)
end end
local _unit = Unit.getByName(_name) local _unit = Unit.getByName(_name)
local _time = _details.timeout - timer.getTime()
if _unit ~= nil then if _unit ~= nil then
--display message, if _details.noPilot then
csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!", 10)
if csar.disableAircraftTimeout then
local _text = string.format("This aircraft cannot be flow as the pilot was killed in a crash. Reinforcements in %.2dM,%.2dS", (_time/60), _time%60)
--display message,
csar.displayMessageToSAR(_unit,_text, 10)
else
--display message,
csar.displayMessageToSAR(_unit, "This aircraft cannot be flown again as the pilot was killed in a crash", 10)
end
else
if csar.disableAircraftTimeout then
--display message,
csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued or reinforcements arrive before this aircraft can be flown again! Reinforcements in "..string.format("%.2dM,%.2d",(_time/60), _time%60), 10)
else
--display message,
csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again! ", 10)
end
end
--destroy in 20 seconds --destroy in 20 seconds
timer.scheduleFunction(csar.destroyUnit, _name, timer.getTime() + 20) timer.scheduleFunction(csar.destroyUnit, _name, timer.getTime() + 20)
@@ -231,53 +309,6 @@ csar.addBeaconToGroup = function(_woundedGroupName, _freq)
return return
end end
-- local _coordinatesText = string.format("%s at %s - %.2f KHz ADF ", _woundedGroupName, csar.getPositionOfWounded(_group), _freq/1000)
--
-- local _setFrequency = {
-- ["enabled"] = true,
-- ["auto"] = false,
-- ["id"] = "WrappedAction",
-- ["number"] = 1, -- first task
-- ["params"] = {
-- ["action"] = {
-- ["id"] = "SetFrequency",
-- ["params"] = {
-- ["modulation"] = 0, -- 0 is AM 1 is FM --if FM you cant read the message... might be the only fix to stop FC3 aircraft hearing it... :(
-- ["frequency"] =_freq,
-- },
-- },
-- },
-- }
--
-- local _setupDetails = {
-- ["enabled"] = true,
-- ["auto"] = false,
-- ["id"] = "WrappedAction",
-- ["number"] = 2, -- second task
-- ["params"] = {
-- ["action"] = {
-- ["id"] = "TransmitMessage",
-- ["params"] = {
-- ["loop"] = true, --false works too
-- ["subtitle"] = _coordinatesText, --_text
-- ["duration"] = 60, -- reset every 60 seconds --used to have timer.getTime() +60
-- ["file"] = csar.radioSound,
-- },
-- },
-- }
-- }
--
-- local _groupController = _group:getController()
--
-- --reset!
-- _groupController:resetTask()
--
-- _groupController:setTask(_setFrequency)
-- _groupController:setTask(_setupDetails)
--
-- --Make the unit NOT engage
-- _groupController:setOption(AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD)
trigger.action.radioTransmission(csar.radioSound, _group:getUnit(1):getPoint(), 0, false, _freq, 1000) trigger.action.radioTransmission(csar.radioSound, _group:getUnit(1):getPoint(), 0, false, _freq, 1000)
timer.scheduleFunction(csar.refreshRadioBeacon, { _woundedGroupName, _freq }, timer.getTime() + 30) timer.scheduleFunction(csar.refreshRadioBeacon, { _woundedGroupName, _freq }, timer.getTime() + 30)
@@ -899,22 +930,22 @@ function csar.getClosetDownedPilot(_heli)
for _woundedName, _groupInfo in pairs(csar.woundedGroups) do for _woundedName, _groupInfo in pairs(csar.woundedGroups) do
local _tempWounded = csar.getWoundedGroup(_woundedName) local _tempWounded = csar.getWoundedGroup(_woundedName)
-- check group exists and not moving to someone else -- check group exists and not moving to someone else
if #_tempWounded > 0 and (_tempWounded[1]:getCoalition() == _side) then if #_tempWounded > 0 and (_tempWounded[1]:getCoalition() == _side) then
_distance = csar.getDistance(_heli:getPoint(), _tempWounded[1]:getPoint()) _distance = csar.getDistance(_heli:getPoint(), _tempWounded[1]:getPoint())
if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) then if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) then
_shortestDistance = _distance _shortestDistance = _distance
_closetGroup = _tempWounded[1] _closetGroup = _tempWounded[1]
_closetGroupInfo = _groupInfo _closetGroupInfo = _groupInfo
end
end end
end
end end
return {pilot=_closetGroup,distance=_shortestDistance,groupInfo=_closetGroupInfo} return {pilot=_closetGroup,distance=_shortestDistance,groupInfo=_closetGroupInfo}
@@ -928,7 +959,7 @@ function csar.signalFlare(_unitName)
return return
end end
local _closet = csar.getClosetDownedPilot(_heli) local _closet = csar.getClosetDownedPilot(_heli)
if _closet ~= nil and _closet.pilot ~= nil and _closet.distance < 1000.0 then if _closet ~= nil and _closet.pilot ~= nil and _closet.distance < 1000.0 then
@@ -1252,4 +1283,4 @@ timer.scheduleFunction(csar.addMedevacMenuItem, nil, timer.getTime() + 5)
world.addEventHandler(csar.eventHandler) world.addEventHandler(csar.eventHandler)
env.info("Medevac event handler added") env.info("Medevac event handler added")

Binary file not shown.