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

Lua脚本报错:attempt to perform arithmetic on a nil value 求助

解决Speedhack Lua脚本的nil值算术错误问题

问题根源

你犯了两个关键错误:

  1. 错误的比较运算符:Lua里判断“不等于”的正确写法是~=,你写成了~-——这个语法会被Lua解析成「按位取反后做减法」,完全不是你想要的非空判断逻辑,导致条件判断失效。
  2. 未检查读取结果:即使[_speed]指针有效,readFloat也可能因内存权限、偏移错误等原因返回nil,直接做乘法运算就会触发attempt to perform arithmetic on a nil value错误。

修正后的代码

function Speedhack1()
    local boost = 1.5  -- 用local声明避免全局变量污染
    local speedPtr = readBytes('[_speed]')
    if speedPtr ~= nil then
        local valDC = readFloat('[_speed]+DC')
        local valE0 = readFloat('[_speed]+E0')
        local valE4 = readFloat('[_speed]+E4')
        -- 检查每个读取值非空后再写入
        if valDC ~= nil then writeFloat ('[_speed]+DC', valDC * boost) end
        if valE0 ~= nil then writeFloat ('[_speed]+E0', valE0 * boost) end
        if valE4 ~= nil then writeFloat ('[_speed]+E4', valE4 * boost) end
    end
end
createHotkey(Speedhack1, VK_UP)

function Speedhack2()
    local boost = 0.5
    local speedPtr = readBytes('[_speed]')
    if speedPtr ~= nil then
        local valDC = readFloat('[_speed]+DC')
        local valE0 = readFloat('[_speed]+E0')
        local valE4 = readFloat('[_speed]+E4')
        if valDC ~= nil then writeFloat ('[_speed]+DC', valDC * boost) end
        if valE0 ~= nil then writeFloat ('[_speed]+E0', valE0 * boost) end
        if valE4 ~= nil then writeFloat ('[_speed]+E4', valE4 * boost) end
    end
end
createHotkey(Speedhack2, VK_DOWN)

关键修正点说明

  • 把所有~-替换为Lua标准的不等于运算符~=,确保非空判断逻辑生效。
  • 用local声明boost和读取的临时变量,避免全局变量冲突。
  • 对每个readFloat的返回值单独做非空检查,彻底避免nil值算术错误。
  • 提前把readBytes('[_speed]')存入变量,避免重复读取指针,提升效率。

内容的提问来源于stack exchange,提问作者William Wolfrom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:40:21