如何将函数参数作为hook的标识符(GMod Lua)
解决GMod Lua中CyberpunkUIShape函数的Hook标识符问题
问题说明
在GMod Lua中编写CyberpunkUIShape函数用于绘制UI图形时,调用两次函数仅最后一个图形生效,第一个会消失。原因是hook.Add使用了重复的标识符,后添加的Hook会覆盖之前的。为解决此问题给函数添加identifier参数作为Hook标识符,但修改后出现错误:[cyberpunk_hud] bad argument #2 to 'Add' (string expected, got nil)。
错误原因
- Hook标识符引用错误:原代码中
hook.Add("HUDPaint", "identifier" , HUDPaint)将参数名加了引号,变成固定字符串"identifier",而非使用传入的参数值。 - 传入的标识符类型错误:调用函数时传入的
armor、health是未定义变量或非字符串类型,导致identifier参数为nil,不符合hook.Add对第二个参数必须是字符串的要求。
修复方案
1. 修正Hook标识符的引用
将hook.Add中的"identifier"改为变量identifier(去掉引号),确保使用传入的参数值作为Hook标识符。
2. 确保传入字符串类型的标识符
调用函数时,将标识符参数改为字符串形式,比如"armor"、"health"。
3. 可选:添加参数校验
在函数开头增加参数校验,避免无效的nil或非字符串标识符传入。
修复后的完整代码
function CyberpunkUIShape( leftx, downy, fillcolor, linecolor, wid, hei, bendsize, offset, identifier ) -- 校验标识符参数,确保为有效字符串 if not isstring(identifier) then error("CyberpunkUIShape: identifier参数必须是字符串") end local trapezoidbg = { { x = leftx+bendsize, y = downy-hei }, -- 左上 { x = leftx , y = downy }, -- 左下 { x = leftx+wid, y = downy }, -- 右下 { x = leftx+wid+bendsize, y = downy-hei } -- 右上 } local function HUDPaint() surface.SetDrawColor(fillcolor) surface.DrawPoly( trapezoidbg ) surface.SetDrawColor(linecolor) surface.DrawLine(leftx+bendsize+offset, downy-hei+offset, leftx+wid+bendsize-offset-2, downy-hei+offset) -- 上边 surface.DrawLine(leftx+offset+1, downy-offset-1, leftx+wid-offset, downy-offset-1) -- 下边 surface.DrawLine(leftx+bendsize+offset, downy-hei+offset, leftx+offset+1, downy-offset) -- 左边 surface.DrawLine(leftx+wid+bendsize-offset-2, downy-hei+offset, leftx+wid-offset-1, downy-offset) -- 右边 end -- 使用传入的identifier参数作为Hook标识符 hook.Add("HUDPaint", identifier, HUDPaint) end -- 调用时传入字符串类型的标识符 CyberpunkUIShape(25, h-75, BGColor, AccentColor, 229, 30, 8, 2, "armor") CyberpunkUIShape(665, h-75, BGColor, AccentColor, 229, 30, 8, 2, "health")
错误信息中文翻译
[cyberpunk_hud] 'Add'的第2个参数错误(期望字符串,得到nil)
- Add - lua/includes/modules/hook.lua:34
2. CyberpunkUIShape - addons/cyberpunk_hud/lua/autorun/cyberpunk_hud.lua:502
3. v - addons/cyberpunk_hud/lua/autorun/cyberpunk_hud.lua:504
4. unknown - lua/includes/modules/hook.lua:96[cyberpunk_hud] 'Add'的第2个参数错误(期望字符串,得到nil)
- Add - lua/includes/modules/hook.lua:34
2. CyberpunkUIShape - addons/cyberpunk_hud/lua/autorun/cyberpunk_hud.lua:502
3. v - addons/cyberpunk_hud/lua/autorun/cyberpunk_hud.lua:505
4. unknown - lua/includes/modules/hook.lua:96
内容的提问来源于stack exchange,提问作者RAVEN.exe
相关产品推荐
相关产品推荐

