From 845f2809c0a1b6ef5b20d672227d09e7f9a55b25 Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Thu, 12 May 2016 21:00:21 +0100 Subject: [PATCH] Fix for FARP / Airfield MASH --- CSAR.lua | 460 ++++++++++++++++++--------------------- csar-test.miz | Bin 68859 -> 68972 bytes csarSlotBlockGameGUI.lua | 4 +- 3 files changed, 219 insertions(+), 245 deletions(-) diff --git a/CSAR.lua b/CSAR.lua index a3fb7f3..6e52a85 100644 --- a/CSAR.lua +++ b/CSAR.lua @@ -1,5 +1,5 @@ -- CSAR Script for DCS Ciribob - 2015 --- Version 1.9.0 - 25/03/2016 +-- Version 1.9.1 - 12/05/2016 -- DCS 1.5 Compatible - Needs Mist 4.0.55 or higher! -- -- 4 Options: @@ -100,8 +100,6 @@ csar.csarUnits = { "MEDEVAC BLUE #19", "MEDEVAC BLUE #20", "MEDEVAC BLUE #21", - - } -- List of all the MEDEVAC _UNIT NAMES_ (the line where it says "Pilot" in the ME)! csar.bluemash = { @@ -133,10 +131,10 @@ csar.redmash = { csar.csarMode = 0 - -- 0 - No Limit - NO Aircraft disabling - -- 1 - Disable Aircraft when its down - Timeout to reenable aircraft - -- 2 - Disable Aircraft for Pilot when he's shot down -- timeout to reenable pilot for aircraft - -- 3 - Pilot Life Limit - No Aircraft Disabling -- timeout to reset lives? +-- 0 - No Limit - NO Aircraft disabling +-- 1 - Disable Aircraft when its down - Timeout to reenable aircraft +-- 2 - Disable Aircraft for Pilot when he's shot down -- timeout to reenable pilot for aircraft +-- 3 - Pilot Life Limit - No Aircraft Disabling -- timeout to reset lives? csar.maxLives = 8 -- Maximum pilot lives @@ -155,7 +153,7 @@ csar.enableForAI = false -- set to false to disable AI units from being rescued. csar.enableForRED = true -- enable for red side -csar.enableForBLUE = true -- enable for blue side +csar.enableForBLUE = true -- enable for blue side csar.enableSlotBlocking = true -- if set to true, you need to put the csarSlotBlockGameGUI.lua -- in C:/Users//DCS/Scripts for 1.5 or C:/Users//DCS.openalpha/Scripts for 2.0 @@ -195,9 +193,9 @@ function csar.resetAllPilotLives() for x, _pilot in pairs(csar.pilotLives) do - trigger.action.setUserFlag("CSAR_PILOT".._pilot:gsub('%W',''),csar.maxLives+1) + trigger.action.setUserFlag("CSAR_PILOT" .. _pilot:gsub('%W', ''), csar.maxLives + 1) end - + csar.pilotLives = {} env.info("Pilot Lives Reset!") end @@ -207,10 +205,10 @@ end -- csar.resetAllPilotLives() -- function csar.resetPilotLife(_playerName) - + csar.pilotLives[_playerName] = nil - trigger.action.setUserFlag("CSAR_PILOT".._playerName:gsub('%W',''),csar.maxLives+1) + trigger.action.setUserFlag("CSAR_PILOT" .. _playerName:gsub('%W', ''), csar.maxLives + 1) env.info("Pilot life Reset!") end @@ -285,50 +283,42 @@ function csar.eventHandler:onEvent(_event) elseif _event.id == 3 then -- taken offf - if _event.initiator:getName() then - csar.takenOff[_event.initiator:getName()] = true - end - - return true - elseif _event.id == 4 then -- landed - - if _event.initiator:getName() then - csar.takenOff[_event.initiator:getName()] = nil - end - - return true + if _event.initiator:getName() then + csar.takenOff[_event.initiator:getName()] = true + end + return true elseif _event.id == 15 then --player entered unit - if _event.initiator:getName() then - csar.takenOff[_event.initiator:getName()] = nil - end + if _event.initiator:getName() then + csar.takenOff[_event.initiator:getName()] = nil + end - -- if its a sar heli, re-add check status script - for _, _heliName in pairs(csar.csarUnits) do + -- if its a sar heli, re-add check status script + for _, _heliName in pairs(csar.csarUnits) do - if _heliName == _event.initiator:getName() then - -- add back the status script - for _woundedName, _groupInfo in pairs(csar.woundedGroups) do + if _heliName == _event.initiator:getName() then + -- add back the status script + for _woundedName, _groupInfo in pairs(csar.woundedGroups) do - if _groupInfo.side == _event.initiator:getCoalition() then + if _groupInfo.side == _event.initiator:getCoalition() then - --env.info(string.format("Schedule Respawn %s %s",_heliName,_woundedName)) - -- queue up script - -- Schedule timer to check when to pop smoke - timer.scheduleFunction(csar.checkWoundedGroupStatus, { _heliName, _woundedName }, timer.getTime() + 5) - end + --env.info(string.format("Schedule Respawn %s %s",_heliName,_woundedName)) + -- queue up script + -- Schedule timer to check when to pop smoke + timer.scheduleFunction(csar.checkWoundedGroupStatus, { _heliName, _woundedName }, timer.getTime() + 5) end end end + end - if _event.initiator:getName() and _event.initiator:getPlayerName() then + if _event.initiator:getName() and _event.initiator:getPlayerName() then - env.info("Checking Unit - ".._event.initiator:getName()) - csar.checkDisabledAircraftStatus({_event.initiator:getName(), _event.initiator:getPlayerName() }) - end + env.info("Checking Unit - " .. _event.initiator:getName()) + csar.checkDisabledAircraftStatus({ _event.initiator:getName(), _event.initiator:getPlayerName() }) + end - return true + return true elseif (_event.id == 9) then -- Pilot dead @@ -344,17 +334,17 @@ function csar.eventHandler:onEvent(_event) local _coalition = _unit:getCoalition() if _coalition == 1 and not csar.enableForRED then - return --ignore! + return --ignore! end if _coalition == 2 and not csar.enableForBLUE then - return --ignore! + return --ignore! end -- Catch multiple events here? - if csar.takenOff[_event.initiator:getName()] == true then + if csar.takenOff[_event.initiator:getName()] == true or _unit:inAir() then - trigger.action.outTextForCoalition(_unit:getCoalition(), "MAYDAY MAYDAY! " .._unit:getTypeName() .. " shot down. No Chute!", 10) + trigger.action.outTextForCoalition(_unit:getCoalition(), "MAYDAY MAYDAY! " .. _unit:getTypeName() .. " shot down. No Chute!", 10) csar.handleEjectOrCrash(_unit, true) else env.info("Pilot Hasnt taken off, ignore") @@ -375,11 +365,11 @@ function csar.eventHandler:onEvent(_event) local _coalition = _unit:getCoalition() if _coalition == 1 and not csar.enableForRED then - return --ignore! + return --ignore! end if _coalition == 2 and not csar.enableForBLUE then - return --ignore! + return --ignore! end -- TODO catch ejection on runway? @@ -389,7 +379,7 @@ function csar.eventHandler:onEvent(_event) return end - if csar.takenOff[_event.initiator:getName()] ~= true then + if csar.takenOff[_event.initiator:getName()] ~= true and not _unit:inAir() then env.info("Pilot Hasnt taken off, ignore") return -- give up, pilot hasnt taken off end @@ -402,7 +392,7 @@ function csar.eventHandler:onEvent(_event) local _freq = csar.generateADFFrequency() - csar.addBeaconToGroup(_spawnedGroup:getName(),_freq) + csar.addBeaconToGroup(_spawnedGroup:getName(), _freq) --handle lives and plane disabling csar.handleEjectOrCrash(_unit, false) @@ -410,27 +400,31 @@ function csar.eventHandler:onEvent(_event) -- Generate DESCRIPTION text local _text = " " if _unit:getPlayerName() ~= nil then - _text = "Pilot ".._unit:getPlayerName().." of ".._unit:getName().." - ".._unit:getTypeName() + _text = "Pilot " .. _unit:getPlayerName() .. " of " .. _unit:getName() .. " - " .. _unit:getTypeName() else - _text = "AI Pilot of ".._unit:getName().." - ".._unit:getTypeName() + _text = "AI Pilot of " .. _unit:getName() .. " - " .. _unit:getTypeName() end - csar.woundedGroups[_spawnedGroup:getName()] = { side = _spawnedGroup:getCoalition(), originalUnit = _unit:getName(), frequency= _freq, desc = _text, player = _unit:getPlayerName() } + csar.woundedGroups[_spawnedGroup:getName()] = { side = _spawnedGroup:getCoalition(), originalUnit = _unit:getName(), frequency = _freq, desc = _text, player = _unit:getPlayerName() } - csar.initSARForPilot(_spawnedGroup,_freq) + csar.initSARForPilot(_spawnedGroup, _freq) return true elseif world.event.S_EVENT_LAND == _event.id then + if _event.initiator:getName() then + csar.takenOff[_event.initiator:getName()] = nil + end + if csar.allowFARPRescue then - -- env.info("Landing") + --env.info("Landing") local _unit = _event.initiator if _unit == nil then - -- env.info("Unit Nil on Landing") + env.info("Unit Nil on Landing") return -- error! end @@ -439,7 +433,7 @@ function csar.eventHandler:onEvent(_event) local _place = _event.place if _place == nil then - -- env.info("Landing Place Nil") + env.info("Landing Place Nil") return -- error! end -- Coalition == 3 seems to be a bug... unless it means contested?! @@ -449,22 +443,21 @@ function csar.eventHandler:onEvent(_event) -- env.info("Rescued by Landing") else - env.info("Cant Rescue ") + -- env.info("Cant Rescue ") - env.info(string.format("airfield %d, unit %d",_place:getCoalition(),_unit:getCoalition())) + env.info(string.format("airfield %d, unit %d", _place:getCoalition(), _unit:getCoalition())) end end return true - end end, _event) if (not status) then - env.error(string.format("Error while handling event %s", err),false) + env.error(string.format("Error while handling event %s", err), false) end end -function csar.handleEjectOrCrash(_unit,_crashed) +function csar.handleEjectOrCrash(_unit, _crashed) -- disable aircraft for ALL pilots if csar.csarMode == 1 then @@ -474,7 +467,7 @@ function csar.handleEjectOrCrash(_unit,_crashed) end -- --mark plane as broken and unflyable - if _unit:getPlayerName() ~= nil and csar.currentlyDisabled[_unit:getName()] == nil then + if _unit:getPlayerName() ~= nil and csar.currentlyDisabled[_unit:getName()] == nil then if csar.countCSARCrash == false then for _, _heliName in pairs(csar.csarUnits) do @@ -486,74 +479,69 @@ function csar.handleEjectOrCrash(_unit,_crashed) end end - csar.currentlyDisabled[_unit:getName()] = {timeout = (csar.disableTimeoutTime*60) + timer.getTime(),desc="",noPilot = _crashed,unitId=_unit:getID(),name=_unit:getName() } + csar.currentlyDisabled[_unit:getName()] = { timeout = (csar.disableTimeoutTime * 60) + timer.getTime(), desc = "", noPilot = _crashed, unitId = _unit:getID(), name = _unit:getName() } -- disable aircraft - trigger.action.setUserFlag("CSAR_AIRCRAFT".._unit:getID(),100) - - env.info("Unit Disabled: ".._unit:getName().." ID:".._unit:getID()) + trigger.action.setUserFlag("CSAR_AIRCRAFT" .. _unit:getID(), 100) + env.info("Unit Disabled: " .. _unit:getName() .. " ID:" .. _unit:getID()) end elseif csar.csarMode == 2 then -- disable aircraft for pilot - --csar.pilotDisabled - if _unit:getPlayerName() ~= nil and csar.pilotDisabled[_unit:getPlayerName().."_".._unit:getName()] == nil then + --csar.pilotDisabled + if _unit:getPlayerName() ~= nil and csar.pilotDisabled[_unit:getPlayerName() .. "_" .. _unit:getName()] == nil then - if csar.countCSARCrash == false then - for _, _heliName in pairs(csar.csarUnits) do + if csar.countCSARCrash == false then + for _, _heliName in pairs(csar.csarUnits) do - if _unit:getName() == _heliName then - -- IGNORE Crashed CSAR - return - end + if _unit:getName() == _heliName then + -- IGNORE Crashed CSAR + return end end - - csar.pilotDisabled[_unit:getPlayerName().."_".._unit:getName()] = {timeout = (csar.disableTimeoutTime*60) + timer.getTime(),desc="",noPilot = true,unitId=_unit:getID(), player=_unit:getPlayerName(), name=_unit:getName() } - - -- disable aircraft - - -- strip special characters from name gsub('%W','') - trigger.action.setUserFlag("CSAR_AIRCRAFT".._unit:getPlayerName():gsub('%W','').."_".._unit:getID(),100) - - env.info("Unit Disabled for player : ".._unit:getName()) - end + csar.pilotDisabled[_unit:getPlayerName() .. "_" .. _unit:getName()] = { timeout = (csar.disableTimeoutTime * 60) + timer.getTime(), desc = "", noPilot = true, unitId = _unit:getID(), player = _unit:getPlayerName(), name = _unit:getName() } + + -- disable aircraft + + -- strip special characters from name gsub('%W','') + trigger.action.setUserFlag("CSAR_AIRCRAFT" .. _unit:getPlayerName():gsub('%W', '') .. "_" .. _unit:getID(), 100) + + env.info("Unit Disabled for player : " .. _unit:getName()) + end + elseif csar.csarMode == 3 then -- No Disable - Just reduce player lives - --csar.pilotDisabled - if _unit:getPlayerName() ~= nil then + --csar.pilotDisabled + if _unit:getPlayerName() ~= nil then - if csar.countCSARCrash == false then - for _, _heliName in pairs(csar.csarUnits) do + if csar.countCSARCrash == false then + for _, _heliName in pairs(csar.csarUnits) do - if _unit:getName() == _heliName then - -- IGNORE Crashed CSAR - return - end + if _unit:getName() == _heliName then + -- IGNORE Crashed CSAR + return end end - - local _lives = csar.pilotLives[_unit:getPlayerName()] - - if _lives == nil then - _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES - end - - csar.pilotLives[_unit:getPlayerName()] = _lives - 1 - - trigger.action.setUserFlag("CSAR_PILOT".._unit:getPlayerName():gsub('%W',''),_lives-1) - end - end + local _lives = csar.pilotLives[_unit:getPlayerName()] + if _lives == nil then + _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES + end + + csar.pilotLives[_unit:getPlayerName()] = _lives - 1 + + trigger.action.setUserFlag("CSAR_PILOT" .. _unit:getPlayerName():gsub('%W', ''), _lives - 1) + end + end end -function csar.enableAircraft(_name,_playerName) +function csar.enableAircraft(_name, _playerName) -- enable aircraft for ALL pilots @@ -565,41 +553,38 @@ function csar.enableAircraft(_name,_playerName) csar.currentlyDisabled[_name] = nil -- {timeout = (csar.disableTimeoutTime*60) + timer.getTime(),desc="",noPilot = _crashed,unitId=_unit:getID() } --use flag to reenable - trigger.action.setUserFlag("CSAR_AIRCRAFT".._details.unitId,0) + trigger.action.setUserFlag("CSAR_AIRCRAFT" .. _details.unitId, 0) end elseif csar.csarMode == 2 and _playerName ~= nil then -- enable aircraft for pilot - local _details = csar.pilotDisabled[_playerName.."_".._name] + local _details = csar.pilotDisabled[_playerName .. "_" .. _name] - if _details ~= nil then - csar.pilotDisabled[_playerName.."_".._name] = nil + if _details ~= nil then + csar.pilotDisabled[_playerName .. "_" .. _name] = nil - trigger.action.setUserFlag("CSAR_AIRCRAFT".._playerName:gsub('%W','').."_".._details.unitId,0) - end + trigger.action.setUserFlag("CSAR_AIRCRAFT" .. _playerName:gsub('%W', '') .. "_" .. _details.unitId, 0) + end elseif csar.csarMode == 3 and _playerName ~= nil then -- No Disable - Just reduce player lives - -- give back life + -- give back life - local _lives = csar.pilotLives[_playerName] - - if _lives == nil then - _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES - else - _lives = _lives + 1 -- give back live! - - if csar.maxLives + 1 <= _lives then - _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES - end + local _lives = csar.pilotLives[_playerName] + if _lives == nil then + _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES + else + _lives = _lives + 1 -- give back live! + if csar.maxLives + 1 <= _lives then + _lives = csar.maxLives + 1 --plus 1 because we'll use flag set to 1 to indicate NO MORE LIVES end + end - csar.pilotLives[_playerName] = _lives - - trigger.action.setUserFlag("CSAR_PILOT".._playerName:gsub('%W',''),_lives) + csar.pilotLives[_playerName] = _lives + trigger.action.setUserFlag("CSAR_PILOT" .. _playerName:gsub('%W', ''), _lives) end end @@ -614,28 +599,24 @@ function csar.reactivateAircraft() for _unitName, _details in pairs(csar.currentlyDisabled) do - if timer.getTime() >= _details.timeout then + if timer.getTime() >= _details.timeout then csar.enableAircraft(_unitName) - end end elseif csar.csarMode == 2 then -- disable aircraft for pilot - for _key, _details in pairs(csar.pilotDisabled) do + for _key, _details in pairs(csar.pilotDisabled) do - if timer.getTime() >= _details.timeout then + if timer.getTime() >= _details.timeout then - csar.enableAircraft(_details.name, _details.player) - end + csar.enableAircraft(_details.name, _details.player) end - - elseif csar.csarMode == 3 then -- No Disable - Just reduce player lives - end - + elseif csar.csarMode == 3 then -- No Disable - Just reduce player lives + end end function csar.checkDisabledAircraftStatus(_args) @@ -660,21 +641,21 @@ function csar.checkDisabledAircraftStatus(_args) 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\n\nIt will be DESTROYED on takeoff!", (_time/60), _time%60) + local _text = string.format("This aircraft cannot be flow as the pilot was killed in a crash. Reinforcements in %.2dM,%.2dS\n\nIt will be DESTROYED on takeoff!", (_time / 60), _time % 60) --display message, - csar.displayMessageToSAR(_unit,_text, 10,true) + csar.displayMessageToSAR(_unit, _text, 10, true) else --display message, - csar.displayMessageToSAR(_unit, "This aircraft cannot be flown again as the pilot was killed in a crash\n\nIt will be DESTROYED on takeoff!", 10,true) + csar.displayMessageToSAR(_unit, "This aircraft cannot be flown again as the pilot was killed in a crash\n\nIt will be DESTROYED on takeoff!", 10, true) 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).."\n\nIt will be DESTROYED on takeoff!", 10,true) + 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) .. "\n\nIt will be DESTROYED on takeoff!", 10, true) else --display message, - csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!\n\nIt will be DESTROYED on takeoff!", 10,true) + csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!\n\nIt will be DESTROYED on takeoff!", 10, true) end end @@ -682,7 +663,7 @@ function csar.checkDisabledAircraftStatus(_args) return --plane destroyed else --check again in 10 seconds - timer.scheduleFunction(csar.checkDisabledAircraftStatus,_args, timer.getTime() + 10) + timer.scheduleFunction(csar.checkDisabledAircraftStatus, _args, timer.getTime() + 10) end end @@ -690,79 +671,76 @@ function csar.checkDisabledAircraftStatus(_args) elseif csar.csarMode == 2 then -- disable aircraft for pilot - local _details = csar.pilotDisabled[_unit:getPlayerName().."_".._unit:getName()] + local _details = csar.pilotDisabled[_unit:getPlayerName() .. "_" .. _unit:getName()] - if _details ~= nil then + if _details ~= nil then - local _time = _details.timeout - timer.getTime() + local _time = _details.timeout - timer.getTime() - if _details.noPilot then + if _details.noPilot then - if csar.disableAircraftTimeout 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\n\nIt will be DESTROYED on takeoff!", (_time/60), _time%60) + local _text = string.format("This aircraft cannot be flow as the pilot was killed in a crash. Reinforcements in %.2dM,%.2dS\n\nIt will be DESTROYED on takeoff!", (_time / 60), _time % 60) - --display message, - csar.displayMessageToSAR(_unit,_text, 10,true) - else - --display message, - csar.displayMessageToSAR(_unit, "This aircraft cannot be flown again as the pilot was killed in a crash\n\nIt will be DESTROYED on takeoff!", 10,true) - end + --display message, + csar.displayMessageToSAR(_unit, _text, 10, true) 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).."\n\nIt will be DESTROYED on takeoff!", 10,true) - else - --display message, - csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!\n\nIt will be DESTROYED on takeoff!", 10,true) - end + --display message, + csar.displayMessageToSAR(_unit, "This aircraft cannot be flown again as the pilot was killed in a crash\n\nIt will be DESTROYED on takeoff!", 10, true) end - - if csar.destroyUnit(_unit) then - return --plane destroyed + 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) .. "\n\nIt will be DESTROYED on takeoff!", 10, true) else - --check again in 10 seconds - timer.scheduleFunction(csar.checkDisabledAircraftStatus, _args, timer.getTime() + 10) + --display message, + csar.displayMessageToSAR(_unit, _details.desc .. " needs to be rescued before this aircraft can be flown again!\n\nIt will be DESTROYED on takeoff!", 10, true) end end + if csar.destroyUnit(_unit) then + return --plane destroyed + else + --check again in 10 seconds + timer.scheduleFunction(csar.checkDisabledAircraftStatus, _args, timer.getTime() + 10) + end + end + elseif csar.csarMode == 3 then -- No Disable - Just reduce player lives - local _lives = csar.pilotLives[_unit:getPlayerName()] + local _lives = csar.pilotLives[_unit:getPlayerName()] - if _lives == nil or _lives > 1 then + if _lives == nil or _lives > 1 then - if _lives == nil then - _lives = csar.maxLives + 1 - end - - -- -1 for lives as we use 1 to indicate out of lives! - local _text = string.format("CSAR ACTIVE! \n\nYou have "..(_lives-1).." lives remaining. Make sure you eject!") - - csar.displayMessageToSAR(_unit,_text, 20,true) - - return - - else - - local _text = string.format("You have run out of LIVES! Lives will be reset on mission restart or when your pilot is rescued.\n\nThis aircraft will be DESTROYED on takeoff!") - - --display message, - csar.displayMessageToSAR(_unit,_text, 10,true) - - if csar.destroyUnit(_unit) then - return --plane destroyed - else - --check again in 10 seconds - timer.scheduleFunction(csar.checkDisabledAircraftStatus, _args, timer.getTime() + 10) - end + if _lives == nil then + _lives = csar.maxLives + 1 end + -- -1 for lives as we use 1 to indicate out of lives! + local _text = string.format("CSAR ACTIVE! \n\nYou have " .. (_lives - 1) .. " lives remaining. Make sure you eject!") + + csar.displayMessageToSAR(_unit, _text, 20, true) + + return + + else + + local _text = string.format("You have run out of LIVES! Lives will be reset on mission restart or when your pilot is rescued.\n\nThis aircraft will be DESTROYED on takeoff!") + + --display message, + csar.displayMessageToSAR(_unit, _text, 10, true) + + if csar.destroyUnit(_unit) then + return --plane destroyed + else + --check again in 10 seconds + timer.scheduleFunction(csar.checkDisabledAircraftStatus, _args, timer.getTime() + 10) + end + end end end - - end function csar.destroyUnit(_unit) @@ -773,9 +751,9 @@ function csar.destroyUnit(_unit) if csar.heightDiff(_unit) > csar.destructionHeight then - csar.displayMessageToSAR(_unit, "**** Aircraft Destroyed as the pilot needs to be rescued or you have no lives! ****", 10,true) + csar.displayMessageToSAR(_unit, "**** Aircraft Destroyed as the pilot needs to be rescued or you have no lives! ****", 10, true) --if we're off the ground then explode - trigger.action.explosion(_unit:getPoint(),100); + trigger.action.explosion(_unit:getPoint(), 100); return true end @@ -809,7 +787,7 @@ csar.addBeaconToGroup = function(_woundedGroupName, _freq) return end - local _sound = "l10n/DEFAULT/"..csar.radioSound + local _sound = "l10n/DEFAULT/" .. csar.radioSound trigger.action.radioTransmission(_sound, _group:getUnit(1):getPoint(), 0, false, _freq, 1000) @@ -818,7 +796,7 @@ end csar.refreshRadioBeacon = function(_args) - csar.addBeaconToGroup(_args[1],_args[2]) + csar.addBeaconToGroup(_args[1], _args[2]) end csar.addSpecialParametersToGroup = function(_spawnedGroup) @@ -853,7 +831,7 @@ function csar.spawnGroup(_deadUnit) local _id = mist.getNextGroupId() - local _groupName = "Downed Pilot #" .. _id + local _groupName = "Downed Pilot #" .. _id local _side = _deadUnit:getCoalition() @@ -861,7 +839,7 @@ function csar.spawnGroup(_deadUnit) local _group = { ["visible"] = false, - ["groupId"] =_id, + ["groupId"] = _id, ["hidden"] = false, ["units"] = {}, ["name"] = _groupName, @@ -906,7 +884,7 @@ function csar.createUnit(_x, _y, _heading, _type) return _newUnit end -function csar.initSARForPilot(_downedGroup,_freq) +function csar.initSARForPilot(_downedGroup, _freq) local _leader = _downedGroup:getUnit(1) @@ -914,7 +892,7 @@ function csar.initSARForPilot(_downedGroup,_freq) local _text = string.format("%s requests SAR at %s, beacon at %.2f KHz", - _leader:getName(), _coordinatesText, _freq/1000) + _leader:getName(), _coordinatesText, _freq / 1000) local _randPercent = math.random(1, 100) @@ -1032,7 +1010,7 @@ function csar.popSmokeForGroup(_woundedGroupName, _woundedLeader) end end -function csar.pickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) +function csar.pickupUnit(_heliUnit, _pilotName, _woundedGroup, _woundedGroupName) local _woundedLeader = _woundedGroup[1] @@ -1056,7 +1034,6 @@ function csar.pickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) csar.inTransitGroups[_heliName][_woundedGroupName] = { - originalUnit = csar.woundedGroups[_woundedGroupName].originalUnit, woundedGroup = _woundedGroupName, side = _heliUnit:getCoalition(), @@ -1095,7 +1072,7 @@ function csar.checkCloseWoundedGroup(_distance, _heliUnit, _heliName, _woundedGr if csar.heliVisibleMessage[_lookupKeyHeli] == nil then - csar.displayMessageToSAR(_heliUnit, string.format("%s: %s. I hear you! Damn that thing is loud! Land or hover by the smoke.", _heliName,_pilotName), 30) + csar.displayMessageToSAR(_heliUnit, string.format("%s: %s. I hear you! Damn that thing is loud! Land or hover by the smoke.", _heliName, _pilotName), 30) --mark as shown for THIS heli and THIS group csar.heliVisibleMessage[_lookupKeyHeli] = true @@ -1117,21 +1094,21 @@ function csar.checkCloseWoundedGroup(_distance, _heliUnit, _heliName, _woundedGr -- if you land on them, doesnt matter if they were heading to someone else as you're closer, you win! :) if (_distance < csar.loadDistance) then - return csar.pickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) + return csar.pickupUnit(_heliUnit, _pilotName, _woundedGroup, _woundedGroupName) end else local _unitsInHelicopter = csar.pilotsOnboard(_heliName) - if csar.inAir(_heliUnit) and _unitsInHelicopter + 1 <= csar.max_units then + if csar.inAir(_heliUnit) and _unitsInHelicopter + 1 <= csar.max_units then - if _distance < 8.0 then + if _distance < 8.0 then --check height! local _height = _heliUnit:getPoint().y - _woundedLeader:getPoint().y - if _height <= 20.0 then + if _height <= 20.0 then local _time = csar.hoverStatus[_lookupKeyHeli] @@ -1144,14 +1121,14 @@ function csar.checkCloseWoundedGroup(_distance, _heliUnit, _heliName, _woundedGr end if _time > 0 then - csar.displayMessageToSAR(_heliUnit, "Hovering above " .. _pilotName .. ". \n\nHold hover for " .. _time .. " seconds to winch them up. \n\nIf the countdown stops you're too far away!", 10,true) + csar.displayMessageToSAR(_heliUnit, "Hovering above " .. _pilotName .. ". \n\nHold hover for " .. _time .. " seconds to winch them up. \n\nIf the countdown stops you're too far away!", 10, true) else csar.hoverStatus[_lookupKeyHeli] = nil - return csar.pickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) + return csar.pickupUnit(_heliUnit, _pilotName, _woundedGroup, _woundedGroupName) end _reset = false else - csar.displayMessageToSAR(_heliUnit, "Too high to winch " .. _pilotName .. " \nReduce height and hover for 10 seconds!", 5,true) + csar.displayMessageToSAR(_heliUnit, "Too high to winch " .. _pilotName .. " \nReduce height and hover for 10 seconds!", 5, true) end end end @@ -1229,9 +1206,8 @@ function csar.scheduledSARFlight(_args) -- enable pilots again for _, _rescueGroup in pairs(_rescuedGroups) do - csar.enableAircraft(_rescueGroup.originalUnit,_rescuedGroups.player ) + csar.enableAircraft(_rescueGroup.originalUnit, _rescuedGroups.player) end - end end @@ -1282,7 +1258,7 @@ end function csar.rescuePilots(_heliUnit) local _rescuedGroups = csar.inTransitGroups[_heliUnit:getName()] - if _rescuedGroups == nil then + if _rescuedGroups == nil then -- Groups already rescued return end @@ -1294,7 +1270,7 @@ function csar.rescuePilots(_heliUnit) -- enable pilots again for _, _rescueGroup in pairs(_rescuedGroups) do - csar.enableAircraft(_rescueGroup.originalUnit,_rescueGroup.player) + csar.enableAircraft(_rescueGroup.originalUnit, _rescueGroup.player) end csar.displayMessageToSAR(_heliUnit, _txt, 10) @@ -1347,18 +1323,17 @@ function csar.delayedHelpMessage(_args) return nil end -function csar.displayMessageToSAR(_unit, _text, _time,_clear) +function csar.displayMessageToSAR(_unit, _text, _time, _clear) local _groupId = csar.getGroupId(_unit) if _groupId then if _clear == true then - trigger.action.outTextForGroup(_groupId, _text, _time,_clear) + trigger.action.outTextForGroup(_groupId, _text, _time, _clear) else trigger.action.outTextForGroup(_groupId, _text, _time) end end - end function csar.getWoundedGroup(_groupName) @@ -1448,17 +1423,18 @@ function csar.displayActiveSAR(_unitName) local _distance = csar.getDistance(_heli:getPoint(), _woundedGroup[1]:getPoint()) - table.insert(_csarList, {dist = _distance,msg = string.format("%s at %s - %.2f KHz ADF - %.3fKM ", _value.desc, _coordinatesText, _value.frequency/1000,_distance/1000.0)}) + table.insert(_csarList, { dist = _distance, msg = string.format("%s at %s - %.2f KHz ADF - %.3fKM ", _value.desc, _coordinatesText, _value.frequency / 1000, _distance / 1000.0) }) end end - local function sortDistance(a,b) + local function sortDistance(a, b) return a.dist < b.dist end + table.sort(_csarList, sortDistance) - for _,_line in pairs(_csarList) do - _msg = _msg .."\n".._line.msg + for _, _line in pairs(_csarList) do + _msg = _msg .. "\n" .. _line.msg end csar.displayMessageToSAR(_heli, _msg, 20) @@ -1489,12 +1465,11 @@ function csar.getClosetDownedPilot(_heli) _shortestDistance = _distance _closetGroup = _tempWounded[1] _closetGroupInfo = _groupInfo - end end end - return {pilot=_closetGroup,distance=_shortestDistance,groupInfo=_closetGroupInfo} + return { pilot = _closetGroup, distance = _shortestDistance, groupInfo = _closetGroupInfo } end function csar.signalFlare(_unitName) @@ -1505,20 +1480,19 @@ 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 < 8000.0 then - local _clockDir = csar.getClockDirection(_heli,_closet.pilot) + local _clockDir = csar.getClockDirection(_heli, _closet.pilot) - local _msg = string.format("%s - %.2f KHz ADF - %.3fM - Popping Signal Flare at your %s ", _closet.groupInfo.desc, _closet.groupInfo.frequency/1000,_closet.distance,_clockDir) + local _msg = string.format("%s - %.2f KHz ADF - %.3fM - Popping Signal Flare at your %s ", _closet.groupInfo.desc, _closet.groupInfo.frequency / 1000, _closet.distance, _clockDir) csar.displayMessageToSAR(_heli, _msg, 20) - trigger.action.signalFlare(_closet.pilot:getPoint(),1, 0 ) + trigger.action.signalFlare(_closet.pilot:getPoint(), 1, 0) else csar.displayMessageToSAR(_heli, "No Pilots within 8KM", 20) end - end function csar.displayToAllSAR(_message, _side, _ignore) @@ -1580,19 +1554,19 @@ function csar.checkOnboard(_unitName) --list onboard pilots - local _inTransit = csar.inTransitGroups[_unitName] + local _inTransit = csar.inTransitGroups[_unitName] - if _inTransit == nil or csar.tableLength(_inTransit) == 0 then + if _inTransit == nil or csar.tableLength(_inTransit) == 0 then csar.displayMessageToSAR(_unit, "No Rescued Pilots onboard", 30) else local _text = "Onboard - RTB to FARP/Airfield or MASH: " - for _,_onboard in pairs(csar.inTransitGroups[_unitName]) do - _text = _text .."\n".._onboard.desc + for _, _onboard in pairs(csar.inTransitGroups[_unitName]) do + _text = _text .. "\n" .. _onboard.desc end - csar.displayMessageToSAR(_unit,_text , 30) + csar.displayMessageToSAR(_unit, _text, 30) end end @@ -1619,12 +1593,12 @@ function csar.addMedevacMenuItem() local _rootPath = missionCommands.addSubMenuForGroup(_groupId, "CSAR") - missionCommands.addCommandForGroup(_groupId, "List Active CSAR", _rootPath, csar.displayActiveSAR, + missionCommands.addCommandForGroup(_groupId, "List Active CSAR", _rootPath, csar.displayActiveSAR, _unitName) - missionCommands.addCommandForGroup(_groupId, "Check Onboard", _rootPath, csar.checkOnboard,_unitName) + missionCommands.addCommandForGroup(_groupId, "Check Onboard", _rootPath, csar.checkOnboard, _unitName) - missionCommands.addCommandForGroup(_groupId, "Request Signal Flare", _rootPath, csar.signalFlare,_unitName) + missionCommands.addCommandForGroup(_groupId, "Request Signal Flare", _rootPath, csar.signalFlare, _unitName) end end else @@ -1827,7 +1801,7 @@ end function csar.getGroupId(_unit) - local _unitDB = mist.DBs.unitsById[tonumber(_unit:getID())] + local _unitDB = mist.DBs.unitsById[tonumber(_unit:getID())] if _unitDB ~= nil and _unitDB.groupId then return _unitDB.groupId end @@ -1841,7 +1815,7 @@ csar.generateVHFrequencies() timer.scheduleFunction(csar.addMedevacMenuItem, nil, timer.getTime() + 5) if csar.disableAircraftTimeout then --- Schedule timer to reactivate things + -- Schedule timer to reactivate things timer.scheduleFunction(csar.reactivateAircraft, nil, timer.getTime() + 5) end @@ -1850,12 +1824,12 @@ world.addEventHandler(csar.eventHandler) env.info("CSAR event handler added") --save CSAR MODE -trigger.action.setUserFlag("CSAR_MODE",csar.csarMode) +trigger.action.setUserFlag("CSAR_MODE", csar.csarMode) -- disable aircraft if csar.enableSlotBlocking then - trigger.action.setUserFlag("CSAR_SLOTBLOCK",100) + trigger.action.setUserFlag("CSAR_SLOTBLOCK", 100) env.info("CSAR Slot block enabled") end diff --git a/csar-test.miz b/csar-test.miz index fa85cb90b2a15a627538e1607311cdca22b760db..9c809ba4bfc9514dd0ddd7aeb4b06f3ec42a9ddc 100644 GIT binary patch delta 13054 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 M0T2eG3jqKC0M!N`>i_@% delta 12940 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 diff --git a/csarSlotBlockGameGUI.lua b/csarSlotBlockGameGUI.lua index 4e549fb..147baa2 100644 --- a/csarSlotBlockGameGUI.lua +++ b/csarSlotBlockGameGUI.lua @@ -1,7 +1,7 @@ local csarSlotBlock = {} -- DONT REMOVE!!! --[[ - CSAR Slot Blocking - V1.9.0 + CSAR Slot Blocking - V1.9.1 Put this file in C:/Users//DCS/Scripts for 1.5 or C:/Users//DCS.openalpha/Scripts for 2.0 @@ -12,7 +12,7 @@ local csarSlotBlock = {} -- DONT REMOVE!!! ]] csarSlotBlock.showEnabledMessage = true -- if set to true, the player will be told that the slot is enabled when switching to it -csarSlotBlock.version = "1.9.0" +csarSlotBlock.version = "1.9.1" -- Logic for determining if player is allowed in a slot function csarSlotBlock.shouldAllowSlot(_playerID, _slotID) -- _slotID == Unit ID unless its multi aircraft in which case slotID is unitId_seatID