You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将函数参数作为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)。

错误原因

  1. Hook标识符引用错误:原代码中hook.Add("HUDPaint", "identifier" , HUDPaint)将参数名加了引号,变成固定字符串"identifier",而非使用传入的参数值。
  2. 传入的标识符类型错误:调用函数时传入的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)

  1. 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)

  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:05:20