From b71bfdb73e14c96aece9bda44bbfe101c7a38641 Mon Sep 17 00:00:00 2001 From: Redo Date: Mon, 13 Oct 2025 12:28:16 -0500 Subject: [PATCH] support more+empty args in hooks --- BlockLua.dll | Bin 379468 -> 379980 bytes readme.md | 13 +++++--- src/util/libbl.lua | 76 ++++++++++++++++++++++++++++----------------- src/util/std.lua | 24 ++++++++++++-- 4 files changed, 77 insertions(+), 36 deletions(-) diff --git a/BlockLua.dll b/BlockLua.dll index 35465213ed3821161fb55ca61e8685df6c5fb5c0..0935a5b166396e2c573a6e0d3e79eed191e84390 100644 GIT binary patch delta 8272 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 Ruy8l}TQ@p_-sKg4`9B$8lDq%_ diff --git a/readme.md b/readme.md index f54d2d9..24fce77 100644 --- a/readme.md +++ b/readme.md @@ -143,7 +143,9 @@ WIP `string.trim(str, charsToTrim=' \t\r\n')` `table.empty` `table.map(func, ...)` +`table.mapk(func, ...)` `table.map_list(func, ...)` +`table.mapi_list(func, ...)` `table.swap(tbl)` `table.reverse(list)` `table.islist(list)` @@ -173,22 +175,23 @@ TorqueScript stores no type information; all values in TorqueScript are strings. ### From Lua to TorqueScript - `nil` becomes the empty string "" - `true` and `false` become "1" and "0" respectively -- Torque containers become their object ID +- A Torque object container becomes its object ID - A `vector` becomes a string containing three numbers separated by spaces -- A table of two vectors becomes a string containing six numbers separated by spaces +- A table of two `vector`s becomes a string containing six numbers separated by spaces +- (WIP) A `matrix` is converted into an axis-angle (a "transform"), a string containing seven numbers separated by spaces - Any `string` is passed directly as a string - Tables cannot be passed and will throw an error ### From TorqueScript to Lua -- Any numeric value becomes a Lua `number`, except as specified with `bl.type`, which may convert a value into a `boolean` or a Torque object container. - The empty string "" becomes `nil` +- Any numeric value becomes a Lua `number`, except as specified with `bl.type`, which may convert a value into a `boolean` or a Torque object container. - A string containing two or three numbers separated by single spaces becomes a `vector` - A string containing six numbers separated by single spaces becomes a table of two vectors, usually defining the corners a bounding box -- (WIP) A string containing seven numbers separated by single spaces is treated as an axis-angle (a "transform" in TorqueScript parlance), and is converted into a `matrix` representing the translation and rotation. +- (WIP) A string containing seven numbers separated by single spaces is treated as an axis-angle (a "transform"), and is converted into a `matrix` representing the translation and rotation - Any other string is passed directly as a `string` For scenarios where the automatic TorqueScript->Lua conversion rules are insufficient or incorrect, use `bl.type`. -To convert objects by hand, use `bl.object`, `bl.boolean`, or `bl.string`. +To convert things by hand, use `bl.object`, `bl.boolean`, or `bl.string`. ## I/O and Safety All Lua code is sandboxed, and file access is confined to the default directories in the same way TorqueScript is. diff --git a/src/util/libbl.lua b/src/util/libbl.lua index 878522a..c84806e 100644 --- a/src/util/libbl.lua +++ b/src/util/libbl.lua @@ -6,15 +6,30 @@ local _bllua_ts = ts bl = bl or {} +-- Config +local tsMaxArgs = 16 +local tsArgsLocal = '%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p' +local tsArgsGlobal = + '$_bllua_hook_arg1,$_bllua_hook_arg2,$_bllua_hook_arg3,$_bllua_hook_arg4,'.. + '$_bllua_hook_arg5,$_bllua_hook_arg6,$_bllua_hook_arg7,$_bllua_hook_arg8,'.. + '$_bllua_hook_arg9,$_bllua_hook_arg10,$_bllua_hook_arg11,$_bllua_hook_arg12,'.. + '$_bllua_hook_arg13,$_bllua_hook_arg14,$_bllua_hook_arg15,$_bllua_hook_arg16' + -- Misc --- Apply a function to each element in a list, building a new list from the returns -local function map(t,f) - local u = {} - for i,v in ipairs(t) do - u[i] = f(v) +local function ipairsNilable(t) + local maxk = 0 + for k,_ in pairs(t) do + if k>maxk then maxk = k end + end + local i = 0 + return function() + i = i+1 + if i>maxk then return nil + else return i, t[i] end end - return u end + +-- Validation local function isValidFuncName(name) return type(name)=='string' and name:find('^[a-zA-Z_][a-zA-Z0-9_]*$') end @@ -184,13 +199,17 @@ local function valFromTs(val, name, name2) end local function arglistFromTs(name, argsS) local args = {} - for i,arg in ipairs(argsS) do + for i,arg in ipairsNilable(argsS) do args[i] = valFromTs(arg, name..':'..i) end return args end local function arglistToTs(args) - return map(args, valToTs) + local argsS = {} + for i,v in ipairsNilable(args) do + table.insert(argsS, valToTs(v)) + end + return argsS end local function classFromForceTypeStr(name) local class, rest = name:match('^([a-zA-Z0-9_]+)(::.+)$') @@ -549,14 +568,13 @@ end local function safeNamespaceName(name) return tostring(name:gsub(':', '_')) end -local nscallArgStr = '%a,%b,%c,%d,%e,%f,%g,%h' bl._cachedNamespaceCalls = {} local function tsNamespacedCallTfname(name) local tfname = bl._cachedNamespaceCalls[name] if not tfname then tfname = '_bllua_nscall_'..safeNamespaceName(name) - local tfcode = 'function '..tfname..'('..nscallArgStr..'){'.. - name..'('..nscallArgStr..');}' + local tfcode = 'function '..tfname..'('..tsArgsLocal..'){'.. + name..'('..tsArgsLocal..');}' _bllua_ts.eval(tfcode) bl._cachedNamespaceCalls[name] = tfname end @@ -753,9 +771,8 @@ local function addCmd(cmd, func) if not isValidFuncName(cmd) then error('addCmd: invalid function name \''..tostring(cmd)..'\'') end bl._cmds[cmd] = func - local arglist = '%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p' - _bllua_ts.eval('function '..cmd..'('..arglist..'){'.. - '_bllua_luacall(_bllua_process_cmd,"'..cmd..'",'..arglist..');}') + _bllua_ts.eval('function '..cmd..'('..tsArgsLocal..'){'.. + '_bllua_luacall(_bllua_process_cmd,"'..cmd..'",'..tsArgsLocal..');}') end function bl.addServerCmd(name, func) name = name:lower() @@ -803,9 +820,6 @@ local function deactivatePackage(pkg) _bllua_ts.call('deactivatePackage', pkg) end end -local hookNargs = 8 -local hookArglistLocal = '%a,%b,%c,%d,%e,%f,%g,%h' -local hookArglistGlobal = '$_bllua_hook_arg1,$_bllua_hook_arg2,$_bllua_hook_arg3,$_bllua_hook_arg4,$_bllua_hook_arg5,$_bllua_hook_arg6,$_bllua_hook_arg7,$_bllua_hook_arg8' bl._hooks = bl._hooks or {} function _bllua_process_hook_before(pkgS, nameS, ...) local args = arglistFromTs(nameS, {...}) @@ -819,7 +833,7 @@ function _bllua_process_hook_before(pkgS, nameS, ...) _bllua_ts.setvar('_bllua_hook_abort', '1') _bllua_ts.setvar('_bllua_hook_return', valToTs(args._return)) end - for i=1,hookNargs do + for i=1,tsMaxArgs do _bllua_ts.setvar('_bllua_hook_arg'..i, valToTs(args[i])) end end @@ -836,13 +850,13 @@ function _bllua_process_hook_after(pkgS, nameS, resultS, ...) end local function updateHook(pkg, name, hk) local beforeCode = hk.before and - ('_bllua_luacall("_bllua_process_hook_before", "'..pkg..'","'..name.. - '",'..hookArglistLocal..');') or '' - local arglist = (hk.before and hookArglistGlobal or hookArglistLocal) + ('_bllua_luacall("_bllua_process_hook_before","'..pkg..'","'..name.. + '",'..tsArgsLocal..');') or '' + local arglist = (hk.before and tsArgsGlobal or tsArgsLocal) local parentCode = tsIsFunctionNsname(name) and -- only call parent if it exists (hk.before and - 'if($_bllua_hook_abort)return $_bllua_hook_return; else ' or '').. + 'if($_bllua_hook_abort)return $_bllua_hook_return;else ' or '').. ((hk.after and '%result=' or 'return ').. 'parent::'..name:match('[^:]+$').. '('..arglist..');') or '' @@ -851,10 +865,11 @@ local function updateHook(pkg, name, hk) arglist..');') or '' local code = 'package '..pkg..'{'.. - 'function '..name..'('..hookArglistLocal..'){'.. + 'function '..name..'('..tsArgsLocal..'){'.. beforeCode..parentCode..afterCode.. '}'.. '};' + print('bl.hook eval output: [['..code..']]') _bllua_ts.eval(code) end function bl.hook(pkg, name, time, func) @@ -880,9 +895,9 @@ end function bl.unhook(pkg, name, time) if not isValidFuncName(pkg) then error('bl.unhook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end - if not isValidFuncNameNs(name) then + if name and not isValidFuncNameNs(name) then error('bl.unhook: argument #2: invalid function name \''..tostring(name)..'\'', 2) end - if time~='before' and time~='after' then + if time and time~='before' and time~='after' then error('bl.unhook: argument #3: time must be \'before\' or \'after\'', 2) end if not name then @@ -909,10 +924,13 @@ function bl.unhook(pkg, name, time) if time~='before' and time~='after' then error('bl.unhook: argument #3: time must be nil, \'before\', or \'after\'', 2) end bl._hooks[pkg][name][time] = nil - if tableEmpty(bl._hooks[pkg][name]) and tableEmpty(bl._hooks[pkg]) then + if tableEmpty(bl._hooks[pkg][name]) then + bl._hooks[pkg][name] = nil + end + if tableEmpty(bl._hooks[pkg]) then bl._hooks[pkg] = nil - deactivatePackage(pkg) updateHook(pkg, name, {}) + deactivatePackage(pkg) else updateHook(pkg, name, bl._hooks[pkg][name]) end @@ -968,7 +986,7 @@ function bl.raycast(start, stop, mask, ignores) local stopS = vecToTs(start) local maskS = maskToTs(mask) local ignoresS = {} - for _,v in ipairs(ignores) do + for _,v in ipairsNilable(ignores) do table.insert(ignoresS, objToTs(v)) end @@ -1017,7 +1035,7 @@ end local maxTsArgLen = 8192 local function valsToString(vals) local strs = {} - for i,v in ipairs(vals) do + for i,v in ipairsNilable(vals) do local tstr = table.tostring(v) if #tstr>maxTsArgLen then tstr = tostring(v) diff --git a/src/util/std.lua b/src/util/std.lua index 53e9e84..16a2d92 100644 --- a/src/util/std.lua +++ b/src/util/std.lua @@ -13,8 +13,18 @@ function table.map(f, ...) local u = {} for k,_ in pairs(ts[1]) do local args = {} - for j=1,#ts do args[j] = ts[j][i] end - u[i] = f(unpack(args)) + for j=1,#ts do args[j] = ts[j][k] end + u[k] = f(unpack(args)) + end + return u +end +function table.mapk(f, ...) + local ts = {...} + local u = {} + for k,_ in pairs(ts[1]) do + local args = {} + for j=1,#ts do args[j] = ts[j][k] end + u[k] = f(k, unpack(args)) end return u end @@ -28,6 +38,16 @@ function table.map_list(f, ...) end return u end +function table.mapi_list(f, ...) + local ts = {...} + local u = {} + for i=1,#ts[1] do + local args = {} + for j=1,#ts do args[j] = ts[j][i] end + u[i] = f(i, unpack(args)) + end + return u +end -- Swap keys/values function table.swap(t) local u = {}