diff --git a/CTLD.lua b/CTLD.lua index 702b582..3cb12c8 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -35,7 +35,7 @@ ctld = {} -- DONT REMOVE! ctld.Id = "CTLD - " --- Version. -ctld.Version = "1.2.1" +ctld.Version = "1.2.2" -- To add debugging messages to dcs.log, change the following log levels to `true`; `Debug` is less detailed than `Trace` ctld.Debug = false @@ -814,77 +814,8 @@ ctld.i18n["es"]["Reset TGT Selection"] = "Restablecer selección TGT" ---@param ... any (list) The parameters to replace in the text, in order (all paremeters will be converted to string) ---@return string the translated and formatted text function ctld.i18n_translate(text, ...) - local function p(o, level) - local MAX_LEVEL = 20 - if level == nil then level = 0 end - if level > MAX_LEVEL then - return "" - end - local text = "" - if (type(o) == "table") then - text = "\n" - for key,value in pairs(o) do - for i=0, level do - text = text .. " " - end - text = text .. ".".. key.."="..p(value, level+1) .. "\n" - end - elseif (type(o) == "function") then - text = "[function]" - elseif (type(o) == "boolean") then - if o == true then - text = "[true]" - else - text = "[false]" - end - else - if o == nil then - text = "[nil]" - else - text = tostring(o) - end - end - return text - end - local function formatText(text, ...) - if not text then - return "" - end - if type(text) ~= 'string' then - text = p(text) - else - local args = ... - if args and args.n and args.n > 0 then - local pArgs = {} - for i=1,args.n do - pArgs[i] = p(args[i]) - end - text = text:format(unpack(pArgs)) - end - end - local fName = nil - local cLine = nil - if debug and debug.getinfo then - local dInfo = debug.getinfo(3) - fName = dInfo.name - cLine = dInfo.currentline - end - if fName and cLine then - return fName .. '|' .. cLine .. ': ' .. text - elseif cLine then - return cLine .. ': ' .. text - else - return ' ' .. text - end - end - local function logTrace(message, ...) - message = formatText(message, arg) - env.info(" T - " .. ctld.Id .. message) - end - logTrace("ctld.i18n_translate(lang=%s, text=%s", p(ctld.i18n_lang), p(text)) local _text = ctld.i18n[ctld.i18n_lang][text] - logTrace("_text=%s", p(_text)) -- default to english if _text == nil then @@ -899,14 +830,13 @@ function ctld.i18n_translate(text, ...) if arg and arg.n and arg.n > 0 then local _args = {} for i=1,arg.n do - _args[i] = p(arg[i]) + _args[i] = tostring(arg[i]) or "" end for i = 1, #_args do _text = string.gsub(_text, "%%" .. i, _args[i]) end end - logTrace("returning %s", p(_text)) return _text end @@ -4038,7 +3968,7 @@ function ctld.listNearbyCrates(_args) local _txt = ctld.i18n_translate("No Nearby Crates") if _message ~= "" or _fobMsg ~= "" then - local _txt = "" + _txt = "" if _message ~= "" then _txt = ctld.i18n_translate("Nearby Crates:\n%1", _message) @@ -4500,8 +4430,14 @@ function ctld.dropSlingCrate(_args) local _heightDiff = ctld.heightDiff(_heli) if ctld.inAir(_heli) == false or _heightDiff <= 7.5 then - ctld.displayMessageToGroup(_heli, ctld.i18n_translate("%1 crate has been safely unhooked and is at your %2 o'clock", _currentCrate.desc, ctld.getClockDirection(_heli, _currentCrate.crateUnit)), 10) _point = ctld.getPointAt12Oclock(_heli, 30) + local _position = "12" + + if ctld.unitDynamicCargoCapable(_heli) then + _point = ctld.getPointAt6Oclock(_heli, 15) + _position = "6" + end + ctld.displayMessageToGroup(_heli, ctld.i18n_translate("%1 crate has been safely unhooked and is at your %2 o'clock", _currentCrate.desc, _position), 10) elseif _heightDiff > 7.5 and _heightDiff <= 40.0 then ctld.displayMessageToGroup(_heli, ctld.i18n_translate("%1 crate has been safely dropped below you", _currentCrate.desc), 10) else -- _heightDiff > 40.0, destroy crate @@ -8207,40 +8143,47 @@ end --- Handle world events. ctld.eventHandler = {} function ctld.eventHandler:onEvent(event) - ctld.logTrace("ctld.eventHandler:onEvent(), event = %s", ctld.p(event)) + ctld.logTrace("ctld.eventHandler:onEvent()") if event == nil then ctld.logError("Event handler was called with a nil event!") return end + local eventName = "unknown" -- check that we know the event - if event.id ~= 20 then -- S_EVENT_PLAYER_ENTER_UNIT + if event.id == world.event.S_EVENT_PLAYER_ENTER_UNIT then + eventName = "S_EVENT_PLAYER_ENTER_UNIT" + elseif event.id == world.event.S_EVENT_BIRTH then + eventName = "S_EVENT_BIRTH" + else + ctld.logTrace("Ignoring event %s", ctld.p(event)) return end + ctld.logDebug("caught event %s: %s", ctld.p(eventName), ctld.p(event)) -- find the originator unit local unitName = nil if event.initiator ~= nil and event.initiator.getName then unitName = event.initiator:getName() - ctld.logDebug("caught event S_EVENT_PLAYER_ENTER_UNIT for unit [%s]", ctld.p(unitName)) + ctld.logDebug("unitName = [%s]", ctld.p(unitName)) end if not unitName then - ctld.logWarning("no unitname found in event %s", ctld.p(event)) + ctld.logInfo("no unitname found in event %s", ctld.p(event)) return end - local nextSteps = coroutine.create(function() - ctld.logTrace("in the 'nextSteps' coroutine") + local function processHumanPlayer() + ctld.logTrace("in the 'processHumanPlayer' function") if mist.DBs.humansByName[unitName] then -- it's a human unit - ctld.logDebug("caught event S_EVENT_PLAYER_ENTER_UNIT for human unit [%s]", ctld.p(unitName)) + ctld.logDebug("caught event %s for human unit [%s]", ctld.p(eventName), ctld.p(unitName)) local _unit = Unit.getByName(unitName) if _unit ~= nil then -- assign transport pilot ctld.logTrace("_unit = %s", ctld.p(_unit)) - + local playerTypeName = _unit:getTypeName() ctld.logTrace("playerTypeName = %s", ctld.p(playerTypeName)) - + -- Allow units to CTLD by aircraft type and not by pilot name if ctld.addPlayerAircraftByType then for _,aircraftType in pairs(ctld.aircraftTypeTable) do @@ -8265,18 +8208,18 @@ function ctld.eventHandler:onEvent(event) end end end - end) + end if not mist.DBs.humansByName[unitName] then -- give a few milliseconds for MiST to handle the BIRTH event too ctld.logTrace("give MiST some time to handle the BIRTH event too") timer.scheduleFunction(function() - ctld.logTrace("resuming the 'nextSteps' coroutine in a timer") - coroutine.resume(nextSteps) - end, nil, timer.getTime() + 0.5) + ctld.logTrace("calling the 'processHumanPlayer' function in a timer") + processHumanPlayer() + end, nil, timer.getTime()+0.5) else - ctld.logTrace("resuming the 'nextSteps' coroutine immediately") - coroutine.resume(nextSteps) + ctld.logTrace("calling the 'processHumanPlayer' function immediately") + processHumanPlayer() end end diff --git a/demo-mission.miz b/demo-mission.miz new file mode 100644 index 0000000..080f78d Binary files /dev/null and b/demo-mission.miz differ diff --git a/test-dev.miz b/test-dev-dynamic.miz similarity index 74% rename from test-dev.miz rename to test-dev-dynamic.miz index 5130c14..09517ff 100644 Binary files a/test-dev.miz and b/test-dev-dynamic.miz differ diff --git a/test-dev-static.miz b/test-dev-static.miz new file mode 100644 index 0000000..e014b9b Binary files /dev/null and b/test-dev-static.miz differ