From 5aec1ab797a433079bd0f53feae2c37920f50ccd Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Thu, 10 Sep 2015 17:49:36 +0100 Subject: [PATCH] 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 --- CSAR.lua | 165 ++++++++++++++++++++++++++++++-------------------- csar-test.miz | Bin 475176 -> 475147 bytes 2 files changed, 98 insertions(+), 67 deletions(-) diff --git a/CSAR.lua b/CSAR.lua index 42458a8..d369042 100644 --- a/CSAR.lua +++ b/CSAR.lua @@ -1,5 +1,5 @@ -- CSAR Script for DCS Ciribob 2015 --- Version 1.2 - 16/8/2015 +-- Version 1.3 - 10/9/2015 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.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.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.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 elseif (_event.id == 9) then -- 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 @@ -129,11 +159,22 @@ function csar.eventHandler:onEvent(_event) 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 return end + + local _spawnedGroup = csar.spawnGroup(_unit) csar.addSpecialParametersToGroup(_spawnedGroup) @@ -153,8 +194,23 @@ function csar.eventHandler:onEvent(_event) --mark plane as broken and unflyable 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 --store the old group under the new group name @@ -167,7 +223,7 @@ function csar.eventHandler:onEvent(_event) end end, _event) 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 @@ -177,7 +233,7 @@ function csar.checkDisabledAircraftStatus(_name) 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 csar.currentlyDisabled[_name] = nil @@ -186,10 +242,32 @@ function csar.checkDisabledAircraftStatus(_name) end local _unit = Unit.getByName(_name) + local _time = _details.timeout - timer.getTime() + if _unit ~= nil then - --display message, - csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!", 10) + if _details.noPilot then + + 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 timer.scheduleFunction(csar.destroyUnit, _name, timer.getTime() + 20) @@ -231,53 +309,6 @@ csar.addBeaconToGroup = function(_woundedGroupName, _freq) return 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) 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 - local _tempWounded = csar.getWoundedGroup(_woundedName) + local _tempWounded = csar.getWoundedGroup(_woundedName) - -- check group exists and not moving to someone else - if #_tempWounded > 0 and (_tempWounded[1]:getCoalition() == _side) then + -- check group exists and not moving to someone else + 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 - _closetGroup = _tempWounded[1] - _closetGroupInfo = _groupInfo + _shortestDistance = _distance + _closetGroup = _tempWounded[1] + _closetGroupInfo = _groupInfo - end end + end end return {pilot=_closetGroup,distance=_shortestDistance,groupInfo=_closetGroupInfo} @@ -928,7 +959,7 @@ function csar.signalFlare(_unitName) return end - local _closet = csar.getClosetDownedPilot(_heli) + local _closet = csar.getClosetDownedPilot(_heli) 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) -env.info("Medevac event handler added") +env.info("Medevac event handler added") \ No newline at end of file diff --git a/csar-test.miz b/csar-test.miz index 8e40790331f417f23a49c9240f822525e9e00e71..f1e4de745bc091e2e603a7848298263e4c5670de 100644 GIT binary patch delta 9998 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 delta 10006 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