看得破的人,处处都是生机;

看不破的人,处处都是困境;

拿得起的人,处处都是担当;

拿不起的人,处处都是疏忽;

放得下的人,处处都是大道;

放不下的人,处处都是迷茫;

想得开的人,处处都是春天;

想不开的人,处处都是凋枯;

做何人,在自己;

小自我,大天地;

GG修改器编写简单脚本

首先以 弓箭手大作战(非正版,广告一大堆) 游戏为例,用GG修改器搜索到一些需要值的地址,下面是找到的一些数据规律:

弓箭手大作战
​
等级和积分,第一个1为等级,80为积分
1;1;25;80;0::24
​
视野,22为视野
22.0F;3D;0D::12
22.0F;3D;0D;27.5F;33.0F;3.0F::24
​
攻击距离,6为攻击距离
0.5F;30.0F;6.0F;25.0F::16
​
生命值,第一个为最大生命值,第二个为当前生命值,生命值除以25是视觉人物生命值格数
125F;125F;0D;1D::16
View Code

需要注意的是,视野距离和攻击距离可以在游戏外搜索,生命值,等级和积分需要进游戏搜索,一次不成功需要多次变化后搜索。

下面是lua脚本代码

gg.clearResults()--清除数据
dengji,jifen="",""--等级,积分地址
shiju=""--视距
gongjijuli=""--攻击距离
zong,dangqian="",""--总生命中,当前生命中
--显示浮动按钮
gg.showUiButton()
--无限循环判断触发事件
while true do
    --按钮点击事件
    if gg.isClickedUiButton() then
        --调用操作选项
       local ret = gg.choice(
          {'等级和积分',
           '视距', 
           '生命值', 
           '攻击距离',
           "修改",
           '退出'})
        if ret == 1 then--等级积分
         ::soso::--定义标签
         dengji,jifen="",""--初始化
          local t=gg.prompt({"等级","积分"},
          {[1]=1},
          {[1]='number',[2]= 'number'})
          if t == nil then
              --gg.alert('取消返回!')
          else
            if t[1]=="" or tonumber(t[1])<=0 then
                gg.alert("等级不能空!")
            else
            if t[2]=="" or tonumber(t[2])<=0 then
                gg.alert("积分不能为空!")
            else
            --输入成功
                 --gg.clearResults()
                 local str=t[1].."D;1D;25D;"..t[2].."D;0D::24"--联合搜索字符串
                 --str="560"--测试
                 --gg.clearResults()--清除数据
                 if gg.searchNumber(str, gg.TYPE_DWORD) then
                     local c=gg.getResultsCount()
                     if c==5 then
                     --找到了,提取等级和积分地址
                     local r=gg.getResults(5)
                     r=gg.getValues(r)
                     dengji=r[1].address
                     jifen=r[4].address
                     --把需要的项写入表格并保存到列表
                     local t = {}
                     t[1] = {}
                     t[1].address =  dengji
                     t[1].flags = gg.TYPE_DWORD
                     --t[1].freeze = true--冻结
                     t[1].value = r[1].value
                     t[2] = {}
                     t[2].address =  jifen
                     t[2].flags = gg.TYPE_DWORD
                     --t[2].freeze = true--冻结
                     t[2].value = r[4].value
                     gg.addListItems(t)--把列表添加到保存列表
                     --gg.setValues(t)--修改列表值
                     --找到地址添加成功清楚数据
                     gg.clearResults()--清除数据
                     else
                     --[[
                         local ex = gg.alert('未找到,是否再次搜索?', '是', nil, '否')
                         if ex == 1 then--返回1为"是"  3为"否"
                            goto soso--跳转到标签
                          end
                          ]]
                          gg.alert("搜索到"..c.."项,请增加积分或者改变等级后再次搜索!")
                     end
                 end
            end
          end
        end
        end
        if ret == 2 then--视距"
        gg.clearResults()--清除数据
        shiju=""
            if gg.searchNumber("22.0F;3D;0D;27.5F;33.0F;3.0F::24", gg.TYPE_FLOAT) then
                     local c=gg.getResultsCount()
                     if c==6 then
                     --找到了,提取视野地址
                     local r=gg.getResults(6)
                     r=gg.getValues(r)
                     shiju=r[1].address
                     --把需要的项写入表格并保存到列表
                     local t = {}
                     t[1] = {}
                     t[1].address =  shiju
                     t[1].flags = gg.TYPE_FLOAT
                     --t[1].freeze = true--冻结
                     t[1].value = r[1].value
                     gg.addListItems(t)--把列表添加到保存列表
                     --gg.setValues(t)--修改列表值
                     --找到地址添加成功清楚数据
                     gg.clearResults()--清除数据
                     else
                          gg.alert("搜索到"..c.."项,请手动修改视距!")
                     end
                 end
        end
        if ret == 3 then--生命值
        zong=""
        dangqian=""
          local t=gg.prompt({"总生命值","当前生命值"},
          {[1]=5,[2]=5},
          {[1]='number',[2]= 'number'})
          if t == nil then
              --gg.alert('取消返回!')
          else
            if t[1]=="" or tonumber(t[1])<=0 then
                gg.alert("总生命值不能空!")
            else
            if t[2]=="" or tonumber(t[2])<=0 then
                gg.alert("当前生命值不能为空!")
            else
            local str=(tonumber(t[1])*25).."F;"..(tonumber(t[2])*25).."F;0D;1D::16"
            if gg.searchNumber(str, gg.TYPE_FLOAT) then
                     local c=gg.getResultsCount()
                     if c==4 then
                     --找到了,提取攻击距离地址
                     local r=gg.getResults(4)
                     r=gg.getValues(r)
                     zong=r[1].address
                     dangqian=r[2].address
                     --把需要的项写入表格并保存到列表
                     local t = {}
                     t[1] = {}
                     t[1].address =  zong
                     t[1].flags = gg.TYPE_FLOAT
                     --t[1].freeze = true--冻结
                     t[1].value = r[1].value
                     t[2] = {}
                     t[2].address =  dangqian
                     t[2].flags = gg.TYPE_FLOAT
                     t[2].freeze = true--冻结
                     t[2].value = r[2].value
                     gg.addListItems(t)--把列表添加到保存列表
                     --gg.setValues(t)--修改列表值
                     --找到地址添加成功清楚数据
                     gg.clearResults()--清除数据
                     else
                          gg.alert("搜索到"..c.."项,请手动修改生命值!")
                     end
                 end
              end
        end
        end
        end
        if ret == 4 then--攻击距离
            gg.clearResults()--清除数据
            gongjijuli=""
            if gg.searchNumber("0.5F;30.0F;6.0F;25.0F::16", gg.TYPE_FLOAT) then
                     local c=gg.getResultsCount()
                     if c==4 then
                     --找到了,提取攻击距离地址
                     local r=gg.getResults(4)
                     r=gg.getValues(r)
                     gongjijuli=r[3].address
                     --把需要的项写入表格并保存到列表
                     local t = {}
                     t[1] = {}
                     t[1].address =  gongjijuli
                     t[1].flags = gg.TYPE_FLOAT
                     --t[1].freeze = true--冻结
                     t[1].value = r[3].value
                     gg.addListItems(t)--把列表添加到保存列表
                     --gg.setValues(t)--修改列表值
                     --找到地址添加成功清楚数据
                     gg.clearResults()--清除数据
                     else
                          gg.alert("搜索到"..c.."项,请手动修改攻击距离!")
                     end
                 end
        end
        if ret == 5 then--其他选项
            local td1,td2,td3={},{},{}
            local ads,tys,vls={},{},{}
            --dengji="111"
           -- jifen="555"
            local i=1
            if dengji~="" then
                td1[i]="等级"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",dengji),0xFFFFFFFF,gg.TYPE_DWORD) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=r[1].value
               end
                --td2[i]=""
                td3[i]="number"
                ads[i]=dengji
                tys[i]=gg.TYPE_DWORD
                vls[i]=false--是否转换
                i=i+1
            end
            if jifen~="" then
                td1[i]="积分"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",jifen),0xFFFFFFFF,gg.TYPE_DWORD) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=r[1].value
               end
              --  td2[i]=""
                td3[i]="number"
                ads[i]=jifen
                tys[i]=gg.TYPE_DWORD
                vls[i]=false--是否转换
                i=i+1
            end
            if shiju~="" then
                td1[i]="视距"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",shiju),0xFFFFFFFF,gg.TYPE_FLOAT) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=r[1].value
               end
               -- td2[i]=""
                td3[i]="number"
                ads[i]=shiju--地址
                tys[i]=gg.TYPE_FLOAT--数据类型
                vls[i]=false--是否转换
                i=i+1
            end
            if gongjijuli~="" then
                td1[i]="攻击距离"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",gongjijuli),0xFFFFFFFF,gg.TYPE_FLOAT) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=r[1].value
               end
               -- td2[i]=""
                td3[i]="number"
                ads[i]=gongjijuli
                tys[i]=gg.TYPE_FLOAT
                vls[i]=false--是否转换
                i=i+1
            end
            if zong~="" then
                td1[i]="总生命值"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",zong),0xFFFFFFFF,gg.TYPE_FLOAT) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=tonumber(r[1].value)/25
               end
                --td2[i]=""
                td3[i]="number"
                ads[i]=zong
                tys[i]=gg.TYPE_FLOAT
               vls[i]=true--是否转换
                i=i+1
            end
            if dangqian~="" then
                td1[i]="当前生命值"
                gg.clearResults()--清除数据
                --根据地址获取数值
                if gg.searchAddress(string.format("%#x",dangqian),0xFFFFFFFF,gg.TYPE_FLOAT) then
                   local r=gg.getResults(1)
                   r=gg.getValues(r)
                   td2[i]=tonumber(r[1].value)/25
               end
            --    td2[i]=""
                td3[i]="number"
                ads[i]=dangqian
                tys[i]=gg.TYPE_FLOAT
                vls[i]=true--是否转换
                i=i+1
            end
           local t=gg.prompt(td1,td2,td3)
          if t ~= nil then
          local tt={}
          --使用for循环遍历
          --i是数组索引值,v是对应索引的数组元素值。
          --ipairs是Lua提供的一个迭代器函数,用来迭代数组。
               for i,v in ipairs(t) do
                   tt[i]={}
                   if vls[i] then--转换
                      tt[i].value=tonumber(v)*25
                   else
                      tt[i].value=v
                   end
                   tt[i].address=ads[i]
                   tt[i].flags=tys[i]
               end
               --修改列表里的数据
              gg.setValues(tt)
          end
        end
        if ret == 6 then--退出
            local ex = gg.alert('你是否要退出脚本?', '', nil, '')
            if ex == 1 then--返回1为"是"  3为"否"
                 os.exit()--退出脚本
            end
        end
    end
    gg.sleep(100)
end
View Code

 常用函数总结

GG修改器lua脚本常用函数总结:
所有函数参阅官网网站
https://gameguardian.net/help/classgg.html
1.弹一个提示框
gg.alert("输入不能为空!")
local ex = gg.alert('你是否要退出脚本?', '', nil, '')
if ex == 1 then    --返回1为"是"  3为"否"
    os.exit()    --退出脚本
end
                 os.exit()--退出脚本 end
2.弹出一个列表菜单
local t = gg.choice({"第一项","第二项"})--返回选择项的索引,从1开始
if t == 1 then
    gg.alert("第一项!")
end
3.弹出一个具有编辑互交功能的列表菜单
--gg.prompt(t1, t2, t3)  t1代表列表项的菜单名称,t2代表互交控件的默认值,t3代表需要展示什么控件, 可参阅types: 'number', 'text', 'path', 'file', 'new_file', 'setting', 'speed', 'checkbox',返回值是控件里面值的列表
local t = gg.prompt(
{"姓名", "年龄"},
{[1]="张三", [2]=20},--如果没有默认值写  nil
{[1]="text",[2]="number"})--其中 "[数字]= "可省略
if t == nil then
    gg.alert("你选择了取消")
else
    gg.alert("你的姓名:"..t[1].."年龄:"..t[2])
end
4.复选框菜单
local t = gg.multiChoice({'A', 'B', 'C', 'D'})
if t == nil then
    gg.alert('Canceled')
else
    if t[1] then
        gg.alert('do A')
    end
    if t[2] then
        gg.alert('do B')
    end
    if t[3] then
        gg.alert('do C')
    end
    if t[4] then
        gg.alert('do D')
    end
end
5.清除搜索列表
gg.clearResults()
6.搜索一个数值[最常用]
gg.searchNumber("100", gg.TYPE_DWORD) --第一个参数是要搜索的值,第二个参数是搜索的类型,返回值是是否搜到数据列表,搜索类型为TYPE_AUTO,TYPE_BYTE,TYPE_DOUBLE,TYPE_DWORD,TYPE_FLOAT,TYPE_QWORD,TYPE_WORD,TYPE_XOR
7.将结果加载到结果列表中并将其作为表返回。
local r = gg.getResults(5)--获取列表前5项数据,返回到列表中,通过r[1].address,r[1].flags,r[1].value访问,地址是十进制数字
8.获取项列表的值。
local r = gg.getValues(table t)--可以配合gg.getResults(5)使用,通过r[1].address,r[1].flags,r[1].value访问
9.获取找到的结果数。
local c=gg.getResultsCount()
10.编辑所有搜索的结果
在调用此方法之前,必须通过getResults加载结果。值将仅应用于具有指定类型的结果。作用的是搜索结果集
editAll(string value, int type )
11.设置项列表的值。作用的是自定义列表集
setValues(table values)
如:
gg.searchNumber('10', gg.TYPE_DWORD)
local r = gg.getResults(5) -- load items
r[1].value = '15'
gg.setValues(r)
12.添加项到保存列表
gg.addListItems(t)--项有许多约束,可参考官网,最常用的如下
local t = {}
t[1] = {}
t[1].address =  0x18004030--十六进制
t[1].flags = gg.TYPE_FLOAT--数据类型
t[1].freeze = true--冻结,默认不冻结
t[1].value = "100"--
gg.addListItems(t)--把列表添加到保存列表
13.根据地址获取数值
 gg.searchAddress("0xA1234567",0xFFFFFFFF,gg.TYPE_FLOAT)--地址可以是完整的地址也可以是某段'0B?0','A20',如果不指定类型则搜索一个地址所有数据类型,地址必须是十六进制地址
14.休眠
gg.sleep(100)
15.其他
a.while循环
while true do--无限循环
    --循环体
    gg.sleep(100)
end
b.for循环
local t = {"a","b","c"}
for i, v in ipairs(t) do--ipairs是Lua提供的一个迭代器函数,用来迭代数组。
   print(v)--输出每一项的值
end
c.字符串转数字
local n = tonumber("123")
d.十进制转十六进制
local d = string.format("%#x","123456")--十进制数转十六进制地址有用
e.判断语句中等于是==,不等于是~=
f.条件判断
if 条件 then
    代码体
end--或者else继续判断
g.goto语句
::label::--定义标签
代码体
goto label--跳转到标签
16.UI浮动按钮
gg.showUiButton()--显示UI按钮
gg.hideUiButton()--隐藏UI按钮
gg.isClickedUiButton()--获取ui按钮的单击状态。如果点击返回真true
常用方法

 

posted @ 2020-03-21 20:20  心电心  阅读(14729)  评论(1编辑  收藏  举报