You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Lua新手求Cheat Engine脚本:实现内存地址值存CSV并读取

嘿,作为Lua新手能想到用Cheat Engine结合CSV来做内存数据的持久化,这个思路很实用!我给你整理了一个完整的示例脚本,带详细注释,你跟着调整参数就能直接用了——

Cheat Engine Lua脚本:内存值自动存读CSV

一、核心配置(先改这里!)

首先把你扫描到的内存地址、数值类型这些填进去:

-- 替换成你自己找到的内存地址列表(可以根据需求加更多)
local memoryAddresses = {
    0x00ABC123,  -- 示例地址1:比如玩家生命值
    0x00DEF456   -- 示例地址2:比如金币数量
}
-- 数值类型:根据你的内存数据选,比如readInteger/readFloat/readString等
local readFunc = readInteger
local writeFunc = writeInteger
-- CSV文件保存路径(可以自定义,比如放游戏目录下)
local csvPath = "game_memory_records.csv"

二、每帧写入内存值到CSV

这段代码会每秒写60次(对应常规游戏帧率),把当前内存值追加到CSV里:

-- 初始化文件:第一次运行时写入表头(内存地址的十六进制)
local function initCSV()
    local file = io.open(csvPath, "r")
    if not file then
        -- 文件不存在,创建并写入表头
        file = io.open(csvPath, "w")
        local headers = {}
        for _, addr in ipairs(memoryAddresses) do
            table.insert(headers, string.format("0x%X", addr))
        end
        file:write(table.concat(headers, ",") .. "\n")
    end
    file:close()
end

-- 每帧获取内存值并写入CSV
local function writeToCSV()
    local values = {}
    for _, addr in ipairs(memoryAddresses) do
        local val = readFunc(addr)
        table.insert(values, tostring(val))
    end
    -- 以追加模式打开文件,写入当前帧的数值
    local file = io.open(csvPath, "a")
    if file then
        file:write(table.concat(values, ",") .. "\n")
        file:close()
    end
end

-- 初始化CSV文件
initCSV()

-- 创建定时器,每16ms执行一次(约60帧/秒),可以根据游戏帧率调整
local writeTimer = createTimer(nil, false)
writeTimer.Interval = 16  -- 单位:毫秒
writeTimer.OnTimer = writeToCSV

-- 可选:添加热键停止/开启写入(比如F8)
registerHotkey(nil, VK_F8, false, function()
    writeTimer.Enabled = not writeTimer.Enabled
    print(writeTimer.Enabled and "开始记录内存值" or "停止记录内存值")
end)

三、游戏启动时读取CSV并应用到内存

这段代码会读取CSV的最后一行(最新的记录),把数值写回内存:

local function readFromCSV()
    local file = io.open(csvPath, "r")
    if not file then
        print("找不到CSV文件,跳过读取")
        return
    end

    -- 读取所有行,取最后一行(最新记录)
    local lastLine = nil
    for line in file:lines() do
        lastLine = line
    end
    file:close()

    if not lastLine then return end

    -- 分割CSV行成数值列表
    local values = {}
    for val in string.gmatch(lastLine, "[^,]+") do
        table.insert(values, tonumber(val))
    end

    -- 写入内存(确保数值数量和地址数量匹配)
    if #values == #memoryAddresses then
        for i, addr in ipairs(memoryAddresses) do
            writeFunc(addr, values[i])
            print(string.format("已恢复地址0x%X的值为:%d", addr, values[i]))
        end
    else
        print("CSV数据格式错误,无法恢复")
    end
end

-- 可选:添加热键触发读取(比如F9)
registerHotkey(nil, VK_F9, false, readFromCSV)

-- 或者脚本启动时自动读取(取消下面注释即可)
-- readFromCSV()

注意事项

  • 数值类型匹配:如果你的内存值是浮点数,把readFunc改成readFloatwriteFunc改成writeFloat,别写错了!
  • 内存地址有效性:游戏重启后内存地址可能会变(如果没用指针的话),最好用CE的指针扫描找到基址+偏移,这样地址才稳定。
  • CSV路径:如果怕找不到文件,可以写绝对路径,比如"C:\\Games\\YourGame\\memory_data.csv"(注意Lua里路径要用双反斜杠)。

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

火山引擎 最新活动