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
常用方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM