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
需要注意的是,视野距离和攻击距离可以在游戏外搜索,生命值,等级和积分需要进游戏搜索,一次不成功需要多次变化后搜索。
下面是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
常用函数总结
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