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改成readFloat,writeFunc改成writeFloat,别写错了! - 内存地址有效性:游戏重启后内存地址可能会变(如果没用指针的话),最好用CE的指针扫描找到基址+偏移,这样地址才稳定。
- CSV路径:如果怕找不到文件,可以写绝对路径,比如
"C:\\Games\\YourGame\\memory_data.csv"(注意Lua里路径要用双反斜杠)。
内容的提问来源于stack exchange,提问作者JoeFern




