3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 191|回复: 3
打印 上一主题 下一主题

[资源分享] 一个批量修改选中的指针的工具,方便更新地址

[复制链接]

49

主题

139

帖子

622

积分

超级玩家

Rank: 5Rank: 5

贡献度
63
金元
3698
积分
622
精华
0
注册时间
2022-1-11
跳转到指定楼层
主题
发表于 2025-12-29 00:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 光烟雾 于 2025-12-29 16:42 编辑


-- 可以收动执行,工具放到菜单栏
-- 保存为lua文件如 batchoffset.lua,放到CE安装目录/autorun/ 文件夹下可实现菜单自动加载
-- 指针偏移批量修改工具
-- 适用于Cheat Engine Lua脚本

-- 定义创建工具窗口的函数
local function createPointerOffsetTool()
    local f = createForm(true)
    f.Caption = '指针偏移批量修改工具'
    f.Width = 500  -- 增加宽度以适应新控件
    f.Height = 250  -- 增加高度
    f.Position = poDesktopCenter  -- 窗口居中

    -- 创建标签
    local lblLayer = createLabel(f)
    lblLayer.Caption = '指针层数:'
    lblLayer.Left = 30
    lblLayer.Top = 40
    lblLayer.Font.Size = 10

    local lblOperation = createLabel(f)
    lblOperation.Caption = '操作类型:'
    lblOperation.Left = 30
    lblOperation.Top = 85
    lblOperation.Font.Size = 10

    local lblValue = createLabel(f)
    lblValue.Caption = '修改值:'
    lblValue.Left = 30
    lblValue.Top = 130
    lblValue.Font.Size = 10

    -- 创建输入框
    local edtLayer = createEdit(f)
    edtLayer.Left = 180
    edtLayer.Top = 35
    edtLayer.Width = 200
    edtLayer.Height = 30
    edtLayer.Text = '1'
    edtLayer.Font.Size = 10

    -- 创建操作类型下拉框
    local cmbOperation = createComboBox(f)
    cmbOperation.Left = 180
    cmbOperation.Top = 80
    cmbOperation.Width = 200
    cmbOperation.Height = 30
    cmbOperation.Font.Size = 10
    cmbOperation.Items.add('等于')
    cmbOperation.Items.add('加')
    cmbOperation.Items.add('减')
    cmbOperation.ItemIndex = 0  -- 默认选择"等于"

    local edtValue = createEdit(f)
    edtValue.Left = 180
    edtValue.Top = 125
    edtValue.Width = 200
    edtValue.Height = 30
    edtValue.Text = '0'
    edtValue.Font.Size = 10

    -- 创建按钮
    local btnApply = createButton(f)
    btnApply.Caption = '应用修改'
    btnApply.Left = 180
    btnApply.Top = 170
    btnApply.Width = 100
    btnApply.Height = 35
    btnApply.Font.Size = 10

    -- 十六进制字符串转数字
    local function hexToNumber(hexStr)
        -- 移除空格
        hexStr = string.gsub(hexStr, " ", "")

        -- 如果字符串为空,返回0
        if hexStr == "" then
            return 0
        end

        -- 转换为数字,基数为16(十六进制)
        local num = tonumber(hexStr, 16)
        return num or 0  -- 如果转换失败,返回0
    end

    -- 应用修改的函数
    local function applyChanges()
        local list = getAddressList()
        if list == nil or list.Count == 0 then
            showMessage('地址列表为空!')
            return
        end

        -- 获取输入的层数值(从1开始)
        local layerInput = tonumber(edtLayer.Text)
        if layerInput == nil or layerInput < 1 then
            showMessage('层数必须为大于0的数字!')
            return
        end

        -- 转换为程序内部使用的索引(从0开始)
        local layerIndex = layerInput - 1

        -- 获取操作类型
        local operation = cmbOperation.Text
        -- 获取输入的修改值
        local changeValue = hexToNumber(edtValue.Text)

        -- 记录修改的数量
        local modifiedCount = 0

        -- 遍历地址列表
        for i = 0, list.Count - 1 do
            local rec = list

            -- 只修改选中的地址
            if rec.Selected then
                -- 检查指针层数是否足够
                if rec.OffsetCount > layerIndex then
                    -- 获取当前偏移值
                    local currentOffset = rec.Offset[layerIndex]
                    
                    -- 根据操作类型计算新的偏移值
                    local newOffset = currentOffset
                    if operation == '等于' then
                        newOffset = changeValue
                    elseif operation == '加' then
                        newOffset = currentOffset + changeValue
                    elseif operation == '减' then
                        newOffset = currentOffset - changeValue
                    end
                    
                    -- 修改指定层的偏移值
                    rec.Offset[layerIndex] = newOffset
                    modifiedCount = modifiedCount + 1
                end
            end
        end

        -- 显示结果
        if modifiedCount > 0 then
            showMessage(string.format('成功修改了 %d 个选中地址第 %d 层的偏移值!\n操作类型:%s,修改值:%X',
                modifiedCount, layerInput, operation, changeValue))
        else
            showMessage('没有选中任何地址,或选中的地址层数不足!')
        end
    end

    -- 按钮点击事件
    btnApply.OnClick = applyChanges

    -- 输入框验证
    edtLayer.OnChange = function(sender)
        local text = sender.Text
        -- 允许输入正整数,不允许0或负数
        if not string.match(text, "^%d*$") then
            sender.Text = sender.OldText or "1"
        else
            -- 如果是空字符串,则不允许,设置为1
            if text == "" then
                sender.Text = "1"
            else
                -- 检查是否大于0
                local num = tonumber(text)
                if num and num <= 0 then
                    sender.Text = "1"
                else
                    sender.OldText = text
                end
            end
        end
    end

    edtValue.OnChange = function(sender)
        local text = sender.Text
        -- 只允许十六进制字符(0-9, A-F, a-f)
        local valid = string.match(text, "^[0-9A-Fa-f]*$")
        if not valid then
            sender.Text = sender.OldText or ""
        else
            sender.OldText = text
        end
    end

    -- 添加快捷键支持
    f.OnKeyDown = function(sender, key)
        if key == 13 then -- 回车键
            applyChanges()
        elseif key == 27 then -- ESC键
            f.close()
        end
    end

    -- 窗体关闭事件
    f.OnClose = function()
        f.destroy()
    end

    -- 显示窗体
    f.show()
end

-- 延迟1秒后执行,将工具添加到菜单
local timer = createTimer()
timer.Interval = 1000 -- 1秒
timer.OnTimer = function(t)
    -- 停止定时器
    t.destroy()

    -- 查找"批量工具"菜单
    local mainMenu = getMainForm().Menu
    local batchToolsMenuItem = nil

    -- 遍历主菜单查找"批量工具"
    for i = 0, mainMenu.Items.Count - 1 do
        local menuItem = mainMenu.Items
        if menuItem.Caption == '批量工具' then
            batchToolsMenuItem = menuItem
            break
        end
    end

    -- 如果没找到"批量工具"菜单,创建一个
    if not batchToolsMenuItem then
        batchToolsMenuItem = createMenuItem(MainForm.Menu)
        batchToolsMenuItem.Caption = '批量工具'
        mainMenu.Items.add(batchToolsMenuItem)
    end

    -- 创建工具菜单项
    local pointerOffsetMenuItem = createMenuItem(batchToolsMenuItem)
    pointerOffsetMenuItem.Caption = '指针偏移批量修改工具'
    pointerOffsetMenuItem.OnClick = createPointerOffsetTool

    -- 添加到批量工具菜单
    batchToolsMenuItem.add(pointerOffsetMenuItem)

    -- 可选:显示提示信息
    -- showMessage('指针偏移批量修改工具已添加到菜单栏 批量工具 -> 指针偏移批量修改工具')
end
回复

使用道具 举报

1

主题

140

帖子

221

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2211
积分
221
精华
0
注册时间
2022-5-15
舒服的沙发
发表于 2025-12-29 15:45 | 只看该作者
什么代码 看不懂
回复 支持 反对

使用道具 举报

1

主题

75

帖子

188

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1875
积分
188
精华
0
注册时间
2023-9-15
硬硬的板凳
发表于 2025-12-29 19:46 | 只看该作者
小白  表示一脸懵逼
回复 支持 反对

使用道具 举报

14

主题

1050

帖子

1389

积分

游戏狂人

Rank: 6Rank: 6

贡献度
36
金元
12446
积分
1389
精华
0
注册时间
2008-1-30
冰凉的地板
发表于 2025-12-31 00:29 | 只看该作者
没有附件吗?我们这些又不是玩代码的,怎么看得懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-24 04:15 , Processed in 0.024652 second(s), 15 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表