gg.loopKillGG() rlgg.loopKillSU() gg.loopCheckVpn() GG=[[ 公告: 作者:观望 脚本版本:1.1 ]] F = gg.alert(GG,"进入脚本") if F == 1 then elseif F == 2 then local 卡网 = 棍母 app.openUrl(卡网) gg.goURL(卡网) gg.intent(卡网) end do if type(getrlyunyz) ~= 'function' then gg.alert('请使用RLGG执行') os.exit() return end local info = { example_version = '1.0.3', name = '观望脚本', appid = '101596', appkey = 'F6F64f36FbEfFb60', rc4key = '9pP94rcBC1MPO9g1', version = '1.0', mi_type = '3' } local rlyunyz = getrlyunyz(info) local ret = rlyunyz.start() if not ret or not isTable(ret) or ret.sign ~= '4fe37571ceaea72d43b3e554d4b10a80' then os.exit() return end end function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function fastsearch(search,write) gg.setVisible(false) gg.clearResults() gg.setRanges(search[1][3]) gg.searchNumber(search[1][1],search[1][2]) if gg.getResultCount()==0 then gg.toast("开启失败") return false end local result=gg.getResults(gg.getResultCount()) gg.clearResults() for i=2,#search do local mtp={} for w,r in ipairs(result)do mtp[#mtp+1]={address=r.address+search[i][2],flags=search[i][3]} end mtp=gg.getValues(mtp) local hook={} for w,r in ipairs(mtp)do if r.value==search[i][1]then hook[#hook+1]=result[w] end end result=hook end if #result>0 then local tb={{},{}} for i,v in ipairs(result)do for _,vv in ipairs(write)do local p={address=v.address+vv[2],flags=vv[3],value=vv[1],freeze=vv[4]} if vv[4]then table.insert(tb[2],p) else table.insert(tb[1],p) end end end gg.addListItems(tb[2]) gg.setValues(tb[1]) gg.toast("修改成功, 共修改"..(#tb[1]+#tb[2]).."条结果") else gg.toast("开启失败") end end function Main0() menu = gg.choice({ '选择进程', '防封功能', '安全功能', '娱乐功能', '监听功能', '退出脚本'}, 2018,'观望脚本') if menu == 1 then A() end if menu == 2 then B() end if menu == 3 then C() end if menu == 4 then D() end if menu == 5 then E() end if menu == 6 then Exit() end XGCK=-1 end function A() gg.setProcessX() end function B() menu1 = gg.multiChoice({ '选择进程', '防止闪退', '防止检测(加载10%的时候开)', '防止举报', '防止黑设备[Root]', '返回主页'}, nil,'防封区域') if menu1 == nil then else if menu1[1] == true then A() end if menu1[2] == true then check1() end if menu1[3] == true then check2() end if menu1[4] == true then check3() end if menu1[5] == true then check4() end if menu1[6] == true then Main0() end end GLWW=-1 end function check1() local rngs = gg.getRangesList('/') local mWrites = {} local fnd_libNetHTProtect_so = false for _, v in ipairs(rngs) do if v.internalName:match('[^/]*$') == 'libNetHTProtect.so' and v.type == 'r-xp' then fnd_libNetHTProtect_so = v.start break end end if not fnd_libNetHTProtect_so then gg.alert('未找到模块开启失败') return end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x5662b8, flags = 4, value = "~A8 RET" }) end if #mWrites > 0 then gg.setValues(mWrites) gg.alert('防止闪退开启成功') else end end function check2() local rngs = gg.getRangesList('/') local mWrites = {} local fnd_libNetHTProtect_so = false for _, v in ipairs(rngs) do if v.internalName:match('[^/]*$') == 'libNetHTProtect.so' and v.type == 'r-xp' then fnd_libNetHTProtect_so = v.start break end end if not fnd_libNetHTProtect_so then gg.alert('未找到模块开启失败') return end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x243590, flags = 4, value = "~A8 B\t [PC,#0x0]" }) end if #mWrites > 0 then gg.setValues(mWrites) gg.alert('防止环境开启成功') else end end function check3() local rngs = gg.getRangesList('/') local mWrites = {} local fnd_libNetHTProtect_so = false for _, v in ipairs(rngs) do if v.internalName:match('[^/]*$') == 'libNetHTProtect.so' and v.type == 'r-xp' then fnd_libNetHTProtect_so = v.start break end end if not fnd_libNetHTProtect_so then gg.alert('未找到模块开启失败') return end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x514d08, flags = 4, value = "~A8 B\t [PC,#0x0]" }) end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x514d70, flags = 4, value = "~A8 B\t [PC,#0x0]" }) end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x514e98, flags = 4, value = "~A8\t NOP" }) end do table.insert(mWrites, { address = fnd_libNetHTProtect_so + 0x514d08, flags = 4, value = "~A8 B\t [PC,#0x0]" }) end if #mWrites > 0 then gg.setValues(mWrites) gg.alert('防止举报开启成功') else end end function check4() local a = gg.alert('警告\n深思熟虑是否开启','开启','否') if a == nil then return end if a == 1 then gg.command([[su -c 'F=/data/user/0/com.je.skgame/shared_prefs/com.je.skgame.v2.playerprefs.xml; K=$(tr -dc 0-9a-z < /dev/urandom | head -c 32); cat > $F < iOS $K 1 EOF am force-stop com.je.skgame; cat $F']]) gg.alert("请重启游戏") elseif a == 2 then Main0() end end function C() menu1 = gg.multiChoice({ '选择进程', '解锁模式', '更改视角', '更改任务', '大胃袋无后摇', '无视龙洞', '返回主页'}, nil,'安全功能') if menu1 == nil then else if menu1[1] == true then A() end if menu1[2] == true then jsms() end if menu1[3] == true then sd() end if menu1[4] == true then ggrw() end if menu1[5] == true then dwd() end if menu1[6] == true then wsld() end if menu1[7] == true then Main0() end end GLWW=-1 end function jsms() local qmnb= { {['memory']=32}, {['name']='解锁模式'}, {['value']=550001, ['type']=4}, {['lv']=781001,['offset']=4, ['type']=4}, {['lv']=781001,['offset']=8, ['type']=4}, {['lv']=260001,['offset']=32, ['type']=4}, {['lv']=270001,['offset']=36, ['type']=4}, {['lv']=760001,['offset']=40, ['type']=4}, } local qmxg= { {['value']=9999,['offset']=-292,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end function sd() b = gg.prompt({"选择进程","一倍视角","二倍视角","三倍视角","四倍视角","单局亮透","全局亮透","返回主页"},{},{"checkbox","checkbox","checkbox","checkbox","checkbox","checkbox","checkbox","checkbox"}) if b == nil then else if b[1] == true then A() end if b[2] == true then local qmnb= { {['memory']=16384}, {['name']='上帝视角'}, {['value']=1319181354, ['type']=4}, {['lv']=1386772104,['offset']=8, ['type']=4}, } local qmxg= { {['value']=506204161,['offset']=4,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[3] == true then local qmnb= { {['memory']=16384}, {['name']='上帝视角'}, {['value']=1319181354, ['type']=4}, {['lv']=1386772104,['offset']=8, ['type']=4}, } local qmxg= { {['value']=506335233,['offset']=4,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[4] == true then local qmnb= { {['memory']=16384}, {['name']='上帝视角'}, {['value']=1319181354, ['type']=4}, {['lv']=1386772104,['offset']=8, ['type']=4}, } local qmxg= { {['value']=505417729,['offset']=4,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[5] == true then local qmnb= { {['memory']=16384}, {['name']='上帝视角'}, {['value']=1319181354, ['type']=4}, {['lv']=1386772104,['offset']=8, ['type']=4}, } local qmxg= { {['value']=505466881,['offset']=4,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[6] == true then local qmnb= { {['memory']=32}, {['name']='单局亮透'}, {['value']=7, ['type']=16}, {['lv']=4,['offset']=4, ['type']=16}, {['lv']=0.800000011920929,['offset']=16, ['type']=16}, } local qmxg= { {['value']=999,['offset']=0,['type']=16,['freeze']=true}, {['value']=999,['offset']=4,['type']=16,['freeze']=true}, {['value']=0,['offset']=16,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[7] == true then local qmnb= { {['memory']=32}, {['name']='全局亮透'}, {['value']=7, ['type']=16}, {['lv']=4,['offset']=24, ['type']=16}, {['lv']=0.800000011920929,['offset']=96, ['type']=16}, } local qmxg= { {['value']=999,['offset']=0,['type']=16,['freeze']=true}, {['value']=999,['offset']=24,['type']=16,['freeze']=true}, {['value']=0,['offset']=96,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[8] == true then Main0() end if b[9] == true then Main0() end end end function ggrw() b = gg.prompt({"选择进程","无视通讯","秒做任务1","秒做任务2","移动监控","恢复任务","返回主页"},{},{"checkbox","checkbox","checkbox","checkbox","checkbox","checkbox","checkbox"}) if b == nil then else if b[1] == true then A() end if b[2] == true then local qmnb= { {['memory']=32}, {['name']='无视通讯'}, {['value']=8032, ['type']=4}, {['lv']=1,['offset']=-16, ['type']=4}, {['lv']=8032,['offset']=120, ['type']=4}, } local qmxg= { {['value']=0,['offset']=816,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[3] == true then local qmnb= { {['memory']=32}, {['name']='秒做任务'}, {['value']=8032, ['type']=4}, {['lv']=1,['offset']=-16, ['type']=4}, {['lv']=8032,['offset']=120, ['type']=4}, } local qmxg= { {['value']=911,['offset']=48,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[4] == true then local qmnb= { {['memory']=32}, {['name']='秒做任务'}, {['value']=8032, ['type']=4}, {['lv']=1,['offset']=-16, ['type']=4}, {['lv']=8032,['offset']=120, ['type']=4}, } local qmxg= { {['value']=9200,['offset']=48,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[5] == true then local qmnb= { {['memory']=32}, {['name']='移动监控'}, {['value']=8032, ['type']=4}, {['lv']=1,['offset']=-16, ['type']=4}, {['lv']=8032,['offset']=120, ['type']=4}, } local qmxg= { {['value']=8181,['offset']=48,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end if b[6] == true then Main0() end end end function dwd() local qmnb= { {['memory']=32}, {['name']='大胃袋无后摇'}, {['value']=2000001, ['type']=4}, {['lv']=800001,['offset']=-4, ['type']=4}, {['lv']=550001,['offset']=4, ['type']=4}, } local qmxg= { {['value']=1,['offset']=92,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end function wsld() local qmnb= { {['memory']=32}, {['name']='无视龙洞'}, {['value']=-120, ['type']=16}, {['lv']=60,['offset']=-4, ['type']=16}, {['lv']=30,['offset']=-8, ['type']=16}, } local qmxg= { {['value']=1,['offset']=-24,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end function D() menu1 = gg.multiChoice({ '选择进程', '全局美化', '伪太空号', '全图飞天', '拉回加速', '拉回穿墙', '更改地区', "远刀/怪附", '返回主页'}, nil,'娱乐功能') if menu1 == nil then else if menu1[1] == true then A() end if menu1[2] == true then mh() end if menu1[3] == true then wztkh() end if menu1[4] == true then qtft() end if menu1[5] == true then rwhook() end if menu1[6] == true then rwcq() end if menu1[7] == true then ggdq() end if menu1[8] == true then yx() end if menu1[9] == true then Main0() end end GLWW=-1 end function mh() b = gg.prompt({"选择进程","神话约菲尔","铠甲骑士","铠甲骑士","贝利亚大人","黑暗赛罗","返回主页"},{},{"checkbox","checkbox","checkbox","checkbox","checkbox","checkbox","checkbox"}) if b == nil then else if b[1] == true then A() end if b[2] == true then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("200060",gg.TYPE_DWORD) local count=gg.getResultsCount() if count==0 then gg.toast("约菲尔美化开启失败") return end local results=gg.getResults(count) local freezeList={} for i,v in ipairs(results)do local baseAddr=v.address local addr1=baseAddr+0x320 local check1=gg.getValues({{address=addr1,flags=gg.TYPE_DWORD}}) if check1 and check1[1] and check1[1].value==200059 then local addr2=baseAddr+0x640 local check2=gg.getValues({{address=addr2,flags=gg.TYPE_DWORD}}) if check2 and check2[1] and check2[1].value==200058 then table.insert(freezeList,{address=baseAddr,flags=gg.TYPE_DWORD,value=3001912,freeze=true}) table.insert(freezeList,{address=addr1,flags=gg.TYPE_DWORD,value=3001913,freeze=true}) table.insert(freezeList,{address=addr2,flags=gg.TYPE_DWORD,value=3001914,freeze=true}) end end end if #freezeList>0 then gg.setValues(freezeList) gg.addListItems(freezeList) gg.toast("约菲尔美化开启成功,共修改"..#freezeList.."条数据,冻结"..#freezeList.."条数据") else gg.toast("约菲尔美化开启失败") end gg.clearResults() end if b[3] == true then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("200060",gg.TYPE_DWORD) local count=gg.getResultsCount() if count==0 then gg.toast("铠甲美化开启失败") return end local results=gg.getResults(count) local freezeList={} for i,v in ipairs(results)do local baseAddr=v.address local addr1=baseAddr+0x320 local check1=gg.getValues({{address=addr1,flags=gg.TYPE_DWORD}}) if check1 and check1[1] and check1[1].value==200059 then local addr2=baseAddr+0x640 local check2=gg.getValues({{address=addr2,flags=gg.TYPE_DWORD}}) if check2 and check2[1] and check2[1].value==200058 then table.insert(freezeList,{address=baseAddr,flags=gg.TYPE_DWORD,value=0,freeze=true}) table.insert(freezeList,{address=addr1,flags=gg.TYPE_DWORD,value=3000642,freeze=true}) table.insert(freezeList,{address=addr2,flags=gg.TYPE_DWORD,value=3000641,freeze=true}) end end end if #freezeList>0 then gg.setValues(freezeList) gg.addListItems(freezeList) gg.toast("铠甲美化开启成功,共修改"..#freezeList.."条数据,冻结"..#freezeList.."条数据") else gg.toast("铠甲美化开启失败") end gg.clearResults() end if b[4] == true then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("200060",gg.TYPE_DWORD) local count=gg.getResultsCount() if count==0 then gg.toast("铠甲美化开启失败") return end local results=gg.getResults(count) local freezeList={} for i,v in ipairs(results)do local baseAddr=v.address local addr1=baseAddr+0x320 local check1=gg.getValues({{address=addr1,flags=gg.TYPE_DWORD}}) if check1 and check1[1] and check1[1].value==200059 then local addr2=baseAddr+0x640 local check2=gg.getValues({{address=addr2,flags=gg.TYPE_DWORD}}) if check2 and check2[1] and check2[1].value==200058 then table.insert(freezeList,{address=baseAddr,flags=gg.TYPE_DWORD,value=0,freeze=true}) table.insert(freezeList,{address=addr1,flags=gg.TYPE_DWORD,value=3000662,freeze=true}) table.insert(freezeList,{address=addr2,flags=gg.TYPE_DWORD,value=3000661,freeze=true}) end end end if #freezeList>0 then gg.setValues(freezeList) gg.addListItems(freezeList) gg.toast("铠甲美化开启成功,共修改"..#freezeList.."条数据,冻结"..#freezeList.."条数据") else gg.toast("铠甲美化开启失败") end gg.clearResults() end if b[5] == true then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("200060",gg.TYPE_DWORD) local count=gg.getResultsCount() if count==0 then gg.toast("贝利亚美化开启失败") return end local results=gg.getResults(count) local freezeList={} for i,v in ipairs(results)do local baseAddr=v.address local addr1=baseAddr+0x320 local check1=gg.getValues({{address=addr1,flags=gg.TYPE_DWORD}}) if check1 and check1[1] and check1[1].value==200059 then local addr2=baseAddr+0x640 local check2=gg.getValues({{address=addr2,flags=gg.TYPE_DWORD}}) if check2 and check2[1] and check2[1].value==200058 then table.insert(freezeList,{address=baseAddr,flags=gg.TYPE_DWORD,value=0,freeze=true}) table.insert(freezeList,{address=addr1,flags=gg.TYPE_DWORD,value=3105251,freeze=true}) table.insert(freezeList,{address=addr2,flags=gg.TYPE_DWORD,value=0,freeze=true}) end end end if #freezeList>0 then gg.setValues(freezeList) gg.addListItems(freezeList) gg.toast("贝利亚美化开启成功,共修改"..#freezeList.."条数据,冻结"..#freezeList.."条数据") else gg.toast("贝利亚美化开启失败") end gg.clearResults() end if b[6] == true then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("200060",gg.TYPE_DWORD) local count=gg.getResultsCount() if count==0 then gg.toast("暗黑赛罗美化开启失败") return end local results=gg.getResults(count) local freezeList={} for i,v in ipairs(results)do local baseAddr=v.address local addr1=baseAddr+0x320 local check1=gg.getValues({{address=addr1,flags=gg.TYPE_DWORD}}) if check1 and check1[1] and check1[1].value==200059 then local addr2=baseAddr+0x640 local check2=gg.getValues({{address=addr2,flags=gg.TYPE_DWORD}}) if check2 and check2[1] and check2[1].value==200058 then table.insert(freezeList,{address=baseAddr,flags=gg.TYPE_DWORD,value=0,freeze=true}) table.insert(freezeList,{address=addr1,flags=gg.TYPE_DWORD,value=3105241,freeze=true}) table.insert(freezeList,{address=addr2,flags=gg.TYPE_DWORD,value=0,freeze=true}) end end end if #freezeList>0 then gg.setValues(freezeList) gg.addListItems(freezeList) gg.toast("暗黑赛罗美化开启成功,共修改"..#freezeList.."条数据,冻结"..#freezeList.."条数据") else gg.toast("暗黑赛罗美化开启失败") end gg.clearResults() end if b[7] == true then Main0() end end end function wztkh() local searchValue = gg.prompt({"请输入您的太空号","请输入您想改的太空号"}, {}, {"text","text"}) if searchValue == nil then return end local offset = -0x28 local valType = gg.TYPE_DWORD local minSameCount = 2 local function searchAndStat(value, saveToList) gg.clearResults() gg.searchNumber(tostring(value), valType) local cnt = gg.getResultCount() if cnt == 0 then gg.alert("没有搜索到值:" .. value) return nil end local results = gg.getResults(cnt) local readTask={} local addrMap={} for _,v in ipairs(results)do local addr=v.address+offset table.insert(readTask,{address=addr,flags=valType}) addrMap[addr]=v.address end local readRes=gg.getValues(readTask) local valid={} local countMap={} for _,item in ipairs(readRes)do local origAddr=addrMap[item.address] local offVal=item.value valid[#valid+1]={offsetAddress=item.address,offsetValue=offVal,origAddress=origAddr} local k=tostring(offVal) countMap[k]=(countMap[k] or 0)+1 end if #valid == 0 then gg.alert("无有效值") return nil end local maxCount=0 local maxValues={} for strVal,c in pairs(countMap)do if c>maxCount then maxCount=c maxValues={strVal} elseif c==maxCount then maxValues[#maxValues+1]=strVal end end if saveToList and maxCount >= minSameCount then local saveList={} for _,item in ipairs(valid)do for _,mv in ipairs(maxValues)do if tostring(item.offsetValue)==mv then saveList[#saveList+1]={address=item.offsetAddress,flags=valType,value=item.offsetValue,name="偏移值_"..mv,selected=true} break end end end if #saveList>0 then gg.addListItems(saveList) end end return {maxValues=maxValues,maxCount=maxCount,valid=valid} end local r1 = searchAndStat(searchValue[1], true) if not r1 then return end local firstMaxValues = r1.maxValues local firstMaxCount = r1.maxCount local X = tonumber(firstMaxValues[1]) gg.alert("读取成功") local r2 = searchAndStat(searchValue[2], true) if not r2 then return end local secondMaxValues = r2.maxValues local secondMaxCount = r2.maxCount local Y = tonumber(secondMaxValues[1]) gg.alert("读取成功") if not X then gg.alert("第一步值X无效") return end if not Y then gg.alert("第二步值Y无效") return end gg.removeListItems(gg.getListItems()) gg.toast("已清空旧保存列表") gg.clearResults() gg.searchNumber(tostring(X), valType) local finalCount = gg.getResultCount() if finalCount == 0 then gg.alert("第三步搜索 " .. X .. " 没有结果") return end local newResults = gg.getResults(finalCount) local editList = {} for _, v in ipairs(newResults) do editList[#editList + 1] = {address = v.address,flags = valType,value = Y,freeze = false} end gg.setValues(editList) local saveList = {} for _, v in ipairs(newResults) do saveList[#saveList + 1] = {address = v.address,flags= valType,value= Y,name = "第三步_" .. Y,selected = true} end gg.addListItems(saveList) gg.alert("全部完成") end function qtft() local a = gg.alert('全图可飞','开启','关闭') if a == nil then return end if a == 1 then local qmnb= { {['memory']=32}, {['name']='全图可飞'}, {['value']=327698, ['type']=4}, {['lv']=786433,['offset']=4, ['type']=4}, {['lv']=458774,['offset']=8, ['type']=4}, {['lv']=524310,['offset']=16, ['type']=4}, {['lv']=589846,['offset']=24, ['type']=4}, } local qmxg= { {['value']=999,['offset']=20,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) elseif a == 2 then local qmnb= { {['memory']=32}, {['name']='全图可飞'}, {['value']=327698, ['type']=4}, {['lv']=786433,['offset']=4, ['type']=4}, {['lv']=458774,['offset']=8, ['type']=4}, {['lv']=524310,['offset']=16, ['type']=4}, {['lv']=589846,['offset']=24, ['type']=4}, } local qmxg= { {['value']=0.05000000074505806,['offset']=20,['type']=16,['freeze']=false}, } xqmnb(qmnb,qmxg) end end function rwhook() local a = gg.alert('人物加速','关闭','开启') if a == nil then return end if a == 1 then local Search_array = { [1] = { 4.880000114440918, 16, 32 }, [2] = { 0.20000000298023224, 8, 16 }, [3] = { 0.4000000059604645, 12, 16 }, } local Modifythe_array = { [1] = { 1, 24, 16, true }, } fastsearch(Search_array, Modifythe_array) elseif a == 2 then local g = gg.prompt({"请输入加速倍数"}, {"10"}, {"text"}) if g == nil then return end local Search_array = { [1] = { 4.880000114440918, 16, 32 }, [2] = { 0.20000000298023224, 8, 16 }, [3] = { 0.4000000059604645, 12, 16 }, } local Modifythe_array = { [1] = { g[1], 24, 16, true }, } fastsearch(Search_array, Modifythe_array) end end function rwcq() a = gg.alert('人物穿墙','关闭','开启') if a == 1 then local qmnb= { {['memory']=32}, {['name']='人物穿墙'}, {['value']=2000001, ['type']=4}, {['lv']=800001,['offset']=-4, ['type']=4}, {['lv']=550001,['offset']=4, ['type']=4}, } local qmxg= { {['value']=250,['offset']=-80,['type']=4}, {['value']=1,['offset']=100,['type']=4}, } xqmnb(qmnb,qmxg) else if a == 2 then local qmnb= { {['memory']=32}, {['name']='人物穿墙'}, {['value']=2000001, ['type']=4}, {['lv']=800001,['offset']=-4, ['type']=4}, {['lv']=550001,['offset']=4, ['type']=4}, } local qmxg= { {['value']=250,['offset']=-80,['type']=4}, {['value']=0,['offset']=100,['type']=4}, } xqmnb(qmnb,qmxg) end end end function ggdq() local regionCode={ ["北京市"]=110000, ["天津市"]=120000, ["河北省"]=130000, ["山西省"]=140000, ["内蒙古自治区"]=150000, ["辽宁省"]=210000, ["吉林省"]=220000, ["黑龙江省"]=230000, ["上海市"]=310000, ["江苏省"]=320000, ["浙江省"]=330000, ["安徽省"]=340000, ["福建省"]=350000, ["江西省"]=360000, ["山东省"]=370000, ["河南省"]=410000, ["湖北省"]=420000, ["湖南省"]=430000, ["广东省"]=440000, ["广西壮族自治区"]=450000, ["海南省"]=460000, ["重庆市"]=500000, ["四川省"]=510000, ["贵州省"]=520000, ["云南省"]=530000, ["西藏自治区"]=540000, ["陕西省"]=610000, ["甘肃省"]=620000, ["青海省"]=630000, ["宁夏回族自治区"]=640000, ["新疆维吾尔自治区"]=650000, ["台湾省"]=710000, ["香港特别行政区"]=810000, ["澳门特别行政区"]=820000, ["未知地区"]=100000 } local list="北京市\n天津市\n河北省\n山西省\n内蒙古自治区\n辽宁省\n吉林省\n黑龙江省\n上海市\n江苏省\n浙江省\n安徽省\n福建省\n江西省\n山东省\n河南省\n湖北省\n湖南省\n广东省\n广西壮族自治区\n海南省\n重庆市\n四川省\n贵州省\n云南省\n西藏自治区\n陕西省\n甘肃省\n青海省\n宁夏回族自治区\n新疆维吾尔自治区\n台湾省\n香港特别行政区\n澳门特别行政区\n未知地区" local g1=gg.prompt({"请输入您的地区名称\n"..list},{"北京市"},{"text"}) if g1==nil then return end local from=g1[1] local lv=regionCode[from] if not lv then gg.alert("未找到当前地区:"..from) return end local g2=gg.prompt({"请输入您想更改地区名称\n"..list},{"澳门特别行政区"},{"text"}) if g2==nil then return end local to=g2[1] local target=regionCode[to] if not target then gg.alert("未找到目标地区:"..to) return end local qmnb={ {['memory']=32}, {['name']='更改地区'}, {['value']=lv,['type']=4}, {['lv']=-1,['offset']=-88,['type']=4}, {['lv']=-1,['offset']=40,['type']=4} } local qmxg={ {['value']=target,['offset']=0,['type']=4,['freeze']=true} } xqmnb(qmnb,qmxg) end QK = gg.clearList Qk = gg.clearResults Nc = gg.setRanges So = gg.searchNumber Fw = gg.getResults Xg = gg.editAll Dz = gg.searchAddress Yc = gg.sleep JS = gg.getListItems Js = gg.getResultCount FW = 0xFFFFFFFF TJ = gg.addListItems Ts = gg.toast Fz = gg.copyText Tj = gg.loadResults function lsp(add) local ti = gg.getTargetInfo() if ti.x64 == true then return gg.getValues({{address = add, flags = 32}})[1].value else return gg.getValues({{address = add, flags = 4}})[1].value & 0xFFFFFFFF end end function getDword(add) return gg.getValues({{address = add, flags = 4}})[1].value end function UTF16ToString(startAddress) local str = '' local length = getDword(startAddress - 4) for i = 1, length do str = str .. utf8.char(gg.getValues({{address = startAddress + 0x2 * (i - 1), flags = 2}})[1].value & 0xFFFF) end return str end CONFIG = { monsterEps = 0.0001, freezeRefreshMs = 50, } STATE = { isInitialized = false, players = {}, monsterEnabled = false, monsterAddresses = {}, monsterBaseline = {}, monsterDetected = false, monsterSelfIndex = -1, monsterTargetIndex = -1, monsterFrozen = false, } function initialize() gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4.88", gg.TYPE_FLOAT) local results = gg.getResults(gg.getResultsCount()) if #results == 0 then gg.alert("搜索失败") return end STATE.players = {} for i, v in ipairs(results) do local playerAddr = v.address local offset8C = playerAddr + -0xCC local check450 = gg.getValues({{address = offset8C + 0x234, flags = gg.TYPE_DWORD}})[1].value if check450 ~= 1 and check450 ~= 1 then goto continue end local namePtr = lsp(offset8C + 0xA0) local name = "未知玩家" if namePtr ~= 0 then name = UTF16ToString(namePtr + 0x14) or "未知玩家" end if name ~= "未知玩家" then table.insert(STATE.players, { addr = playerAddr, offset8C = offset8C, name = name, }) end ::continue:: end if #STATE.players == 0 then gg.alert("未找到有效玩家") STATE.isInitialized = false return end STATE.isInitialized = true gg.toast("初始化完成,共 " .. #STATE.players .. " 名玩家") STATE.monsterEnabled = false STATE.monsterSelfIndex = -1 STATE.monsterAddresses = {} STATE.monsterBaseline = {} STATE.monsterDetected = false STATE.monsterTargetIndex = -1 if STATE.monsterFrozen then gg.clearList() STATE.monsterFrozen = false end end function buildChoices() local choices = {} for i, p in ipairs(STATE.players) do local aliveVal = gg.getValues({{address = p.offset8C + 0x234, flags = gg.TYPE_DWORD}})[1].value local status = aliveVal == 1 and "[存活]" or "[死亡]" local marker = "" if STATE.monsterSelfIndex == i then marker = " ←自己(怪兽吸附)" end choices[i] = p.name .. " " .. status .. marker end return choices end function monsterSetup() if not STATE.isInitialized then gg.toast("请先初始化") return end local choices = buildChoices() gg.setVisible(false) local choice = gg.choice(choices, nil, "怪兽吸附:选择你自己") if not choice then return end STATE.monsterEnabled = false STATE.monsterAddresses = {} STATE.monsterBaseline = {} STATE.monsterDetected = false STATE.monsterSelfIndex = choice STATE.monsterTargetIndex = -1 STATE.monsterFrozen = false gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4.88", gg.TYPE_FLOAT) local count = gg.getResultCount() if count <= 0 then gg.toast("未找到4.88") gg.clearResults() STATE.monsterSelfIndex = -1 return end local results = gg.getResults(count) for i, v in ipairs(results) do STATE.monsterAddresses[i] = {address = v.address, flags = gg.TYPE_FLOAT} STATE.monsterBaseline[i] = v.value end STATE.monsterEnabled = true gg.clearResults() gg.toast("怪兽吸附已开启,监控 " .. count .. " 个地址") gg.toast("[怪兽吸附] 已选自己: " .. STATE.players[choice].name) end function isMonsterActive() if not STATE.monsterEnabled then return false end if #STATE.monsterAddresses == 0 then return false end local current = gg.getValues(STATE.monsterAddresses) for i, v in ipairs(current) do if v.value < STATE.monsterBaseline[i] - CONFIG.monsterEps then return true end end return false end function monsterFreezeToTarget(targetIdx) local selfIdx = STATE.monsterSelfIndex if targetIdx <= 0 then return false end if selfIdx < 1 or selfIdx > #STATE.players then return false end local selfP = STATE.players[selfIdx] local targetP = STATE.players[targetIdx] local coords = gg.getValues({ {address = targetP.offset8C + 0x3C0, flags = gg.TYPE_FLOAT}, {address = targetP.offset8C + 0x3C4, flags = gg.TYPE_FLOAT}, {address = targetP.offset8C + 0x3C8, flags = gg.TYPE_FLOAT}, }) local tx, tz, ty = coords[1].value, coords[2].value, coords[3].value if STATE.monsterFrozen then gg.clearList() STATE.monsterFrozen = false end local ok = gg.addListItems({ {address = selfP.offset8C + 0x3C0, flags = gg.TYPE_FLOAT, value = tx, freeze = true, name = "MonsterX"}, {address = selfP.offset8C + 0x3C4, flags = gg.TYPE_FLOAT, value = tz, freeze = true, name = "MonsterZ"}, {address = selfP.offset8C + 0x3C8, flags = gg.TYPE_FLOAT, value = ty, freeze = true, name = "MonsterY"}, }) if ok == false then return false end STATE.monsterFrozen = true return true end function findNearestAlivePlayer(deadIndex) local batch = {} for i, p in ipairs(STATE.players) do batch[#batch + 1] = {address = p.offset8C + 0x3C0, flags = gg.TYPE_FLOAT} batch[#batch + 1] = {address = p.offset8C + 0x3C4, flags = gg.TYPE_FLOAT} batch[#batch + 1] = {address = p.offset8C + 0x3C8, flags = gg.TYPE_FLOAT} batch[#batch + 1] = {address = p.offset8C + 0x234, flags = gg.TYPE_DWORD} end local vals = gg.getValues(batch) local idx = 1 local allPosX, allPosZ, allPosY, allAlive = {}, {}, {}, {} for i = 1, #STATE.players do allPosX[i] = vals[idx].value; idx = idx + 1 allPosZ[i] = vals[idx].value; idx = idx + 1 allPosY[i] = vals[idx].value; idx = idx + 1 allAlive[i] = vals[idx].value; idx = idx + 1 end local baseX, baseZ, baseY = allPosX[deadIndex], allPosZ[deadIndex], allPosY[deadIndex] local minDist = math.huge local nearestIdx = nil for i = 1, #STATE.players do if i == deadIndex then goto continue end if allAlive[i] ~= 1 then goto continue end local dist = math.abs(allPosX[i] - baseX) + math.abs(allPosZ[i] - baseZ) + math.abs(allPosY[i] - baseY) if dist < minDist then minDist = dist nearestIdx = i end ::continue:: end return nearestIdx end function monsterFreezeLoop() if not STATE.monsterEnabled then return end if not STATE.isInitialized then return end if not isMonsterActive() then if STATE.monsterDetected then STATE.monsterDetected = false STATE.monsterTargetIndex = -1 if STATE.monsterFrozen then gg.clearList() STATE.monsterFrozen = false end gg.toast("[怪兽吸附] 怪兽状态结束,冻结解除") end return end if not STATE.monsterDetected then STATE.monsterDetected = true gg.toast("检测到变身怪兽,开始吸附") gg.toast("[怪兽吸附] 变身检测,进入冻结吸附") end local targetIdx = findNearestAlivePlayer(STATE.monsterSelfIndex) if targetIdx and targetIdx > 0 then STATE.monsterTargetIndex = targetIdx monsterFreezeToTarget(targetIdx) end end function remoteKill() if not STATE.isInitialized then gg.toast("请先初始化") return end gg.setVisible(false) gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4.88", gg.TYPE_FLOAT) local freshResults = gg.getResults(gg.getResultsCount()) if #freshResults == #STATE.players then for i, v in ipairs(freshResults) do STATE.players[i].addr = v.address STATE.players[i].offset8C = v.address - 0xCC end end gg.clearResults() local items = {} for i, p in ipairs(STATE.players) do local aliveVal = gg.getValues({{address = p.offset8C + 0x234, flags = gg.TYPE_DWORD}})[1].value local status = aliveVal == 1 and "[存活]" or "[死亡]" items[i] = string.format("[%d] %s %s", i, p.name, status) end items[#items + 1] = "返回" local eChoice = gg.choice(items, nil, "第一步:选择敌人") if not eChoice or eChoice == #items then return end local eIdx = eChoice local eName = STATE.players[eIdx].name local sItems = {} local realIdx = {} for i, p in ipairs(STATE.players) do if i ~= eIdx then local aliveVal = gg.getValues({{address = p.offset8C + 0x234, flags = gg.TYPE_DWORD}})[1].value local status = aliveVal == 1 and "[存活]" or "[死亡]" sItems[#sItems + 1] = string.format("[%d] %s %s", i, p.name, status) realIdx[#realIdx + 1] = i end end sItems[#sItems + 1] = "返回" local sChoice = gg.choice(sItems, nil, "第二步:选择你自己(敌人: " .. eName .. ")") if not sChoice or sChoice == #sItems then return end local sIdx = realIdx[sChoice] local sName = STATE.players[sIdx].name gg.toast("敌人: " .. eName .. "\n自己: " .. sName) local selfValueAddr = STATE.players[sIdx].offset8C + 0x0 local targetAddr = STATE.players[eIdx].offset8C + 0x0 local targetAddrStr = string.format("%Xh", targetAddr) gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.loadResults({{address = selfValueAddr, flags = 32}}) gg.searchPointer(0) local ptrCount = gg.getResultsCount() if ptrCount == 0 then gg.toast("搜索无结果") gg.clearResults() return end local finalResults = gg.getResults(ptrCount) local originalValues = {} local modifyValues = {} for i, v in ipairs(finalResults) do originalValues[i] = {address = v.address, value = v.value, flags = 32} modifyValues[i] = {address = v.address, value = targetAddrStr, flags = 32} end gg.setValues(modifyValues) gg.clearResults() gg.toast("已修改 " .. #finalResults .. " 个 → " .. eName) gg.sleep(3000) gg.setValues(originalValues) gg.toast("已恢复") end function gameEndReset() if not STATE.isInitialized then gg.toast("请先初始化") return end local modifyValues = {} for i, p in ipairs(STATE.players) do table.insert(modifyValues, { address = p.addr, value = 4.9, flags = gg.TYPE_FLOAT }) end gg.setValues(modifyValues) gg.toast("已解密") end function stopMonster() STATE.monsterEnabled = false STATE.monsterSelfIndex = -1 STATE.monsterAddresses = {} STATE.monsterBaseline = {} STATE.monsterDetected = false STATE.monsterTargetIndex = -1 if STATE.monsterFrozen then gg.clearList() STATE.monsterFrozen = false end end function Exit() stopMonster() os.exit() end function yx() local initLabel = STATE.isInitialized and "重新初始化[" .. #STATE.players .. "]" or "初始化" local monsterLabel = STATE.monsterEnabled and "怪兽吸附(运行中)" or "怪兽吸附设置" local currentTime = os.date("%Y-%m-%d %H:%M:%S") local items = { "刷新数据", initLabel, monsterLabel, "远程刀人", "返回主页", } local actions = { gameEndReset, initialize, monsterSetup, remoteKill, Main0, } local choice = gg.choice(items, nil, "远程刀人/怪兽吸附区域") if choice then actions[choice]() end end JT_STATE = { logText = "", listening = false, } JT_Kill_Count, JT_Kill_Dist = {}, {} JT_Run_Count, JT_Vent_Count, JT_Inv_Count = {}, {}, {} JT_LP = {} function JT_addLog(text) gg.toast(text) JT_STATE.logText = JT_STATE.logText .. text .. "\n" end function JT_get_data() gg.clearResults() gg.setRanges(32) local IDS = {1002,1005,1006,1008,1101,1106,2101,2102,4001,4002,4003,4004,4005,4006,4007,5001,5002,7001} local found = false for _, id in ipairs(IDS) do gg.clearResults() gg.searchNumber(id, 4) local rs = gg.getResults(3000) local nr = #rs if nr > 0 then local bases = {} for i = 1, nr do bases[i] = rs[i].address - 0x2BC end local r1 = {} for i = 1, nr do r1[#r1+1] = { address = bases[i] + 0x2BC, flags = 4 } r1[#r1+1] = { address = bases[i] + 0x220, flags = 32 } end local v1 = gg.getValues(r1) local b1, p1, n1 = {}, {}, 0 for i = 1, nr do local idv = v1[(i-1)*2+1].value local pl = v1[(i-1)*2+2].value & 0xFFFFFFFFFF if idv == id and pl > 0x10000 then n1 = n1 + 1; b1[n1] = bases[i]; p1[n1] = pl end end if n1 > 0 then local r2 = {} for i = 1, n1 do r2[#r2+1] = { address = p1[i] + 0x18, flags = 4 } r2[#r2+1] = { address = p1[i] + 0x10, flags = 32 } end local v2 = gg.getValues(r2) local b2, p2, q2, n2 = {}, {}, {}, 0 for i = 1, n1 do local psz = v2[(i-1)*2+1].value local par = v2[(i-1)*2+2].value & 0xFFFFFFFFFF if psz and psz >= 1 and psz <= 64 and par > 0x10000 then n2 = n2 + 1; b2[n2] = b1[i]; p2[n2] = p1[i]; q2[n2] = par end end if n2 > 0 then local r3 = {} for i = 1, n2 do r3[i] = { address = q2[i] + 0x20, flags = 32 } end local v3 = gg.getValues(r3) local b3, p3, q3, n3 = {}, {}, {}, 0 for i = 1, n2 do local a0 = v3[i].value & 0xFFFFFFFFFF if a0 > 0x10000 then n3 = n3 + 1; b3[n3] = b2[i]; p3[n3] = p2[i]; q3[n3] = a0 end end if n3 > 0 then local r4 = {} for i = 1, n3 do r4[i] = { address = q3[i] + 0x0A0, flags = 32 } end local v4 = gg.getValues(r4) local b4, p4, q4, n4 = {}, {}, {}, 0 for i = 1, n3 do local np2 = v4[i].value & 0xFFFFFFFFFF if np2 > 0x10000 then n4 = n4 + 1; b4[n4] = b3[i]; p4[n4] = p3[i]; q4[n4] = np2 end end if n4 > 0 then local r5 = {} for i = 1, n4 do r5[i] = { address = q4[i] + 0x10, flags = 4 } end local v5 = gg.getValues(r5) for i = 1, n4 do local ln = v5[i].value if ln and ln >= 1 and ln <= 20 then JT_QJ_Tz = b4[i]; JT_sz_zja = p4[i] JT_dt_dm = id; JT_djdt_dm = id JT_hy_zt = b4[i] + 0x048; JT_dj_zt = b4[i] + 0x100 found = true; break end end end end end end end if found then break end end gg.clearResults() if found then gg.toast("获取成功") else gg.toast("获取失败(要进对局)") end end function JT_prepare_game_data() if not JT_QJ_Tz then gg.toast("未获取特征,正在自动获取数据...") JT_get_data() if not JT_QJ_Tz then gg.toast("获取数据失败(要进对局)") return false end end local Get1 = {} JT_Get2 = {} JT_rwsz_addr = gg.getValues({{ address = JT_sz_zja + 0x10, flags = 32 }})[1]["value"] & 0xFFFFFFFFFF local rwsz_reads = {} for i = 1, 20 do rwsz_reads[i] = { address = JT_rwsz_addr + 0x18 + i * 0x8, flags = 32 } end local rwsz_data = gg.getValues(rwsz_reads) for i = 1, 20 do local a2 = rwsz_data[i].value if a2 == 0 then JT_rw_jl = i - 1 break end Get1[i] = a2 & 0xFFFFFFFFFF end local OFF = {0x040, 0x224, 0x0A0, 0x2C8, 0x234, 0x458, 0x320, 0x0CC, 0x1F8, 0x558, 0x0B4, 0x2C8, 0x180} for i = 1, #Get1 do local a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 = Get1[i]+OFF[1], Get1[i]+OFF[2], Get1[i]+OFF[3], Get1[i]+OFF[4], Get1[i]+OFF[5], Get1[i]+OFF[6], Get1[i]+OFF[7], Get1[i]+OFF[8], Get1[i]+OFF[9], Get1[i]+OFF[10], Get1[i]+OFF[11], Get1[i]+OFF[12], Get1[i]+OFF[13] JT_Get2[i] = { a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 } end if not JT__offchk then JT__offchk = true local ok, msg = pcall(function() local addr = gg.getValues({{ address = JT_Get2[1][3], flags = 32 }})[1].value & 0xFFFFFFFFFF local t = {} for _i = 1, 12 do local b = gg.getValues({{ address = addr + 0x14 + _i * 0x2 - 0x2, flags = 2 }})[1].value if b == 0 then break end t[#t + 1] = b + (b < 0 and 65536 or 0) end return #t > 0 and utf8.char(table.unpack(t)):gsub("%c", "") or "?" end) gg.toast("偏移自检 玩家1: "..(ok and msg or "读取失败")) end return true end function JT_B3() local Table2 = {} for i = 1, #JT_Get2 do local Table = {} local Xaddr = gg.getValues({{ address = JT_Get2[i][1] - 0x4, flags = 4 }, { address = JT_Get2[i][3], flags = 32 }}) local addr = Xaddr[2].value & 0xFFFFFFFFFF for i = 1, 12 do Table[i] = gg.getValues({{ address = addr + 0x14 + i * 0x2 - 0x2, flags = 2 }})[1]["value"] if Table[i] == 0 then local k = i for i = k, 12 do Table[i] = 1 end break end Table[i] = Table[i] + ( Table[i] < 0 and 65536 or 0 ) end table.insert(Table2, #Table2 + 1, Xaddr[1].value..":"..utf8.char(Table[1], Table[2], Table[3], Table[4], Table[5], Table[6], Table[7], Table[8], Table[9], Table[10], Table[11], Table[12])) end gg.choice(Table2, nil, "玩家名称") end function JT_viewLog() if not JT_STATE.logText or JT_STATE.logText == "" then gg.alert("暂无日志") else gg.alert("记录 : \n" .. JT_STATE.logText) end end function JT_clearLog() JT_STATE.logText = "" gg.toast("日志已清除") end function JT_analyze() local report = "形式 - 分析判断记录:\n\n" report = report .. "◆ 击杀记录 ◆\n" local has_kill = false if JT_Kill_Count then for name, count in pairs(JT_Kill_Count) do has_kill = true report = report .. "▶ " .. name .. ": 击杀" .. count .. "次 → 🟠 可疑行为\n" report = report .. "受害者/地点: " .. (JT_Kill_Dist[name] or "") .. "\n" end end if not has_kill then report = report .. "无\n" end report = report .. "\n◆ 其他行为 ◆\n" local has_other = false local all_names = {} if JT_Run_Count then for n, _ in pairs(JT_Run_Count) do all_names[n] = true end end if JT_Vent_Count then for n, _ in pairs(JT_Vent_Count) do all_names[n] = true end end if JT_Inv_Count then for n, _ in pairs(JT_Inv_Count) do all_names[n] = true end end for n, _ in pairs(all_names) do has_other = true report = report .. "▶ " .. n .. ": " if JT_Run_Count and JT_Run_Count[n] then report = report .. "跑鞋×" .. JT_Run_Count[n] .. " " end if JT_Vent_Count and JT_Vent_Count[n] then report = report .. "管道×" .. JT_Vent_Count[n] .. " " end if JT_Inv_Count and JT_Inv_Count[n] then report = report .. "隐身×" .. JT_Inv_Count[n] .. " " end report = report .. "\n" end if not has_other then report = report .. "无\n" end gg.alert(report, "返回") end function JT_jtzb(x, y, z) return jtzb(x, y, z) end function JT_startListen() if not JT_prepare_game_data() then return end gg.toast("共录入"..JT_rw_jl.."人") JT_STATE.logText = "" JT_Kill_Count, JT_Kill_Dist = {}, {} JT_Run_Count, JT_Vent_Count, JT_Inv_Count = {}, {}, {} if not JT_hy_zt then JT_hy_zt = (JT_QJ_Tz or 0) + 0x048 end if not JT_dj_zt then JT_dj_zt = (JT_QJ_Tz or 0) + 0x100 end local np = #JT_Get2 JT_LP = {} JT_LP.np = np JT_LP.Mc_Table = {} JT_LP.Table = {} local ptr_reads = {} for i = 1, np do ptr_reads[i] = { address = JT_Get2[i][3], flags = 32 } end local ptr_data = gg.getValues(ptr_reads) local name_reads = {} for i = 1, np do local a = ptr_data[i].value & 0xFFFFFFFFFF local base = (i - 1) * 12 for j = 1, 12 do name_reads[base + j] = { address = a + 0x14 + j * 0x2 - 0x2, flags = 2 } end end local name_data = gg.getValues(name_reads) for i = 1, np do local base = (i - 1) * 12 for j = 1, 12 do local b = name_data[base + j].value if b == 0 then for jj = j, 12 do JT_LP.Table[jj] = 1 end break end JT_LP.Table[j] = b + (b < 0 and 65536 or 0) end local str = utf8.char(JT_LP.Table[1], JT_LP.Table[2], JT_LP.Table[3], JT_LP.Table[4], JT_LP.Table[5], JT_LP.Table[6], JT_LP.Table[7], JT_LP.Table[8], JT_LP.Table[9], JT_LP.Table[10], JT_LP.Table[11], JT_LP.Table[12]):gsub("%c", "") str = str:match("^%s*(.-)%s*$") table.insert(JT_LP.Mc_Table, #JT_LP.Mc_Table + 1, " " .. str .. " ") end JT_LP.rw_gd, JT_LP.rw_jd, JT_LP.rw_jdj, JT_LP.rw_jt, JT_LP.rw_ys, JT_LP.rw_mf = {}, {}, {}, {}, {}, {} for i = 1, np do JT_LP.rw_gd[i], JT_LP.rw_jdj[i], JT_LP.rw_jt[i], JT_LP.rw_ys[i], JT_LP.rw_mf[i] = 1, 1, 0, 0, 0 end local rw_reads = {} for i = 1, np do rw_reads[i] = { address = JT_Get2[i][1] - 0x8, flags = 4 } end local rw_data = gg.getValues(rw_reads) JT_LP.rw_jd = {} for i = 1, np do JT_LP.rw_jd[i] = rw_data[i].value end JT_LP.jd_p, JT_LP.sd_p, JT_LP.zy_p, JT_LP.fs_p, JT_LP.hd_p, JT_LP.dw_p = {}, {}, {}, {}, {}, {} JT_LP.swrs = 0 JT_LP.jt_jl = {} JT_LP.os_clock = nil JT_LP.temp2, JT_LP.temp3, JT_LP.temp4, JT_LP.temp5, JT_LP.temp7, JT_LP.temp8, JT_LP.temp9, JT_LP.temp10 = {}, {}, {}, {}, {}, {}, {}, {} jlcd = "" local pos_reads = {} for i = 1, np do local gi = JT_Get2[i] local b = #pos_reads pos_reads[b+1] = { address = gi[7], flags = 16 } pos_reads[b+2] = { address = gi[7] + 0x4, flags = 16 } pos_reads[b+3] = { address = gi[7] + 0x8, flags = 16 } pos_reads[b+4] = { address = gi[5], flags = 4} end JT_LP.pos_reads = pos_reads local all_xaddr_reads = {} for i = 1, np do local gi = JT_Get2[i] all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[1],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[2],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[5],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[6],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[8],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[9],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[10], flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[11], flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = JT_hy_zt,flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[4],flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[12], flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = gi[13], flags = 4 } all_xaddr_reads[#all_xaddr_reads+1] = { address = JT_dj_zt,flags = 4 } end JT_LP.all_xaddr_reads = all_xaddr_reads JT_STATE.listening = true gg.toast("监听已开启") end function JT_listenTick() if not JT_STATE.listening then return end if not JT_LP or not JT_LP.np or JT_LP.np == 0 then return end local np = JT_LP.np local pos_data = gg.getValues(JT_LP.pos_reads) local px, pz, py, palive = {}, {}, {}, {} for i = 1, np do local b = (i - 1) * 4 px[i] = pos_data[b+1].value pz[i] = pos_data[b+2].value py[i] = pos_data[b+3].value palive[i] = pos_data[b+4].value end local all_xaddr = gg.getValues(JT_LP.all_xaddr_reads) for k = 1, np do local sx, sy = px[k], py[k] JT_LP.jt_jl = {} for kk = 1, np do if kk ~= k then local dx = px[kk] - sx local dy = py[kk] - sy JT_LP.jt_jl[kk] = math.sqrt(dx*dx + dy*dy) + (palive[kk] == 1 and 0 or 100000) end end local xbase = (k - 1) * 13 local Xaddr = { all_xaddr[xbase+1],all_xaddr[xbase+2],all_xaddr[xbase+3], all_xaddr[xbase+4],all_xaddr[xbase+5],all_xaddr[xbase+6], all_xaddr[xbase+7],all_xaddr[xbase+8],all_xaddr[xbase+9], all_xaddr[xbase+10], all_xaddr[xbase+11], all_xaddr[xbase+12], all_xaddr[xbase+13], } JT_LP.Xaddr = Xaddr if Xaddr[1].value == JT_LP.rw_jd[k] then if JT_LP.temp4[k] == nil then JT_LP.temp4[k] = Xaddr[6].value elseif JT_LP.temp4[k] ~= Xaddr[6].value then local _,zj_ys = min(JT_LP.jt_jl) JT_addLog(JT_LP.Mc_Table[k].."被诅咒了"..JT_LP.Mc_Table[zj_ys].."最近"..jlcd) JT_LP.temp4[k] = Xaddr[6].value end end if Xaddr[1].value == JT_LP.rw_jd[k] then if Xaddr[4].value ~= 0 and JT_LP.rw_ys[k] ~= 1 then JT_LP.os_clock = tonumber(os.clock()) JT_addLog(JT_LP.Mc_Table[k].."是变色龙/忍者/蜜蜂消失了") JT_Inv_Count[JT_LP.Mc_Table[k]] = (JT_Inv_Count[JT_LP.Mc_Table[k]] or 0) + 1 JT_LP.rw_ys[k] = 1 elseif Xaddr[4].value == 0 and JT_LP.rw_ys[k] == 1 then JT_addLog(JT_LP.Mc_Table[k]..math.floor(os.clock() - JT_LP.os_clock + 1).."s解除了消失状态") JT_LP.rw_ys[k] = 0 end end if Xaddr[1].value == JT_LP.rw_jd[k] and Xaddr[5].value ~= 1083975926 and Xaddr[5].value >= 1069245531 and Xaddr[3].value==1 and Xaddr[4].value ~= ysks then if not JT_LP.sd_p[k] then local msg if Xaddr[5].value == 1089092976 then msg = JT_LP.Mc_Table[k].."开跑鞋了(最快移速)" elseif Xaddr[5].value == 1086022747 then msg = JT_LP.Mc_Table[k].."移速增加了(加速技能)" elseif Xaddr[5].value == 1082952516 then msg = JT_LP.Mc_Table[k].."移速增加了(怪兽变身)" elseif Xaddr[5].value == 1069245531 then msg = JT_LP.Mc_Table[k].."移速变缓了(饕鬄吞噬)" elseif Xaddr[5].value == 1081727779 then msg = JT_LP.Mc_Table[k].."移速变慢了(剧毒温泉)" elseif Xaddr[5].value == 1075587318 then msg = JT_LP.Mc_Table[k].."移速变慢了(胶水炸弹)" else msg = JT_LP.Mc_Table[k].."开跑鞋了" end JT_addLog(msg) JT_Run_Count[JT_LP.Mc_Table[k]] = (JT_Run_Count[JT_LP.Mc_Table[k]] or 0) + 1 JT_LP.sd_p[k] = -1 end elseif Xaddr[5].value == 1083975926 and JT_LP.sd_p[k] == -1 then JT_addLog(JT_LP.Mc_Table[k].."恢复了原速") JT_LP.sd_p[k] = nil end if Xaddr[1].value == JT_LP.rw_jd[k] then if JT_LP.temp7[k] == nil then JT_LP.temp7[k] = Xaddr[7].value elseif JT_LP.temp7[k] ~= Xaddr[7].value and not JT_LP.hd_p[k] then local _,zj_ys = min(JT_LP.jt_jl) JT_addLog(JT_LP.Mc_Table[k].."获得了护盾"..JT_LP.Mc_Table[zj_ys].."最近"..jlcd) JT_LP.hd_p[k] = -1 JT_LP.temp7[k] = Xaddr[7].value end end if JT_LP.temp7[k] ~= Xaddr[7].value and JT_LP.hd_p[k] == -1 then JT_LP.hd_p[k] = nil end if Xaddr[1].value == JT_LP.rw_jd[k] then if JT_LP.temp8[k] == nil then JT_LP.temp8[k] = Xaddr[12].value elseif JT_LP.temp8[k] ~= Xaddr[12].value and JT_LP.rw_gd[k] == 1 then JT_LP.os_clock=tonumber(os.clock()) JT_LP.temp8[k] = Xaddr[12].value JT_LP.rw_gd[k] = 0 elseif JT_LP.temp8[k] ~= Xaddr[12].value and JT_LP.rw_gd[k] == 0 then JT_addLog(JT_LP.Mc_Table[k]..math.floor(os.clock()-JT_LP.os_clock + 1).."S结束了大变活人") JT_LP.temp8[k] = Xaddr[12].value JT_LP.rw_gd[k] = 1 end end if Xaddr[1].value == JT_LP.rw_jd[k] then if JT_LP.temp9[k] == nil then JT_LP.temp9[k] = Xaddr[11].value elseif JT_LP.temp9[k] ~= Xaddr[11].value and not JT_LP.hd_p[k] then local _,zj_ys = min(JT_LP.jt_jl) JT_addLog(JT_LP.Mc_Table[k].."是奶龙") JT_LP.hd_p[k] = 119 JT_LP.temp9[k] = Xaddr[11].value end end if JT_LP.temp9[k] ~= Xaddr[11].value and JT_LP.hd_p[k] == 119 then JT_addLog(JT_LP.Mc_Table[k].."是奶龙变身结束") JT_LP.hd_p[k] = nil end if Xaddr[3].value == JT_LP.rw_jt[k] then if Xaddr[3].value == 0 and Xaddr[9].value == 0 then local _,zj_ys = min(JT_LP.jt_jl) JT_addLog(JT_LP.Mc_Table[k].."死了"..jtzb(px[k], py[k], pz[k])..JT_LP.Mc_Table[zj_ys].."最近"..jlcd) JT_Kill_Count[JT_LP.Mc_Table[zj_ys]] = (JT_Kill_Count[JT_LP.Mc_Table[zj_ys]] or 0) + 1 JT_Kill_Dist[JT_LP.Mc_Table[zj_ys]] = (JT_Kill_Dist[JT_LP.Mc_Table[zj_ys]] or "") .. JT_LP.Mc_Table[k].."("..jtzb(px[k], py[k], pz[k])..") " JT_LP.rw_jt[k] = 1 JT_LP.swrs = JT_LP.swrs + 1 elseif Xaddr[3].value == 0 and Xaddr[9].value == 1 then JT_addLog(JT_LP.Mc_Table[k].."在会议上死了") JT_LP.rw_jt[k] = 1 JT_LP.swrs = JT_LP.swrs + 1 elseif Xaddr[3].value == 1 then local _,zj_ys = min(JT_LP.jt_jl) JT_addLog(JT_LP.Mc_Table[k].."复活了"..JT_LP.Mc_Table[zj_ys].."最近"..jlcd) JT_LP.rw_jt[k] = 0 JT_LP.swrs = JT_LP.swrs - 1 end end if Xaddr[1].value ~= JT_LP.rw_jd[k] and Xaddr[3].value == 0 then if not JT_LP.jd_p[k] then JT_addLog(JT_LP.Mc_Table[k].."被摄魂怪夺舍了") JT_LP.jd_p[k] = -1 end elseif Xaddr[1].value ~= JT_LP.rw_jd[k] and Xaddr[3].value == 1 then if not JT_LP.jd_p[k] then JT_addLog(JT_LP.Mc_Table[k].."变身了") JT_LP.jd_p[k] = -1 end end if Xaddr[1].value == JT_LP.rw_jd[k] and JT_LP.jd_p[k] == -1 then JT_addLog(JT_LP.Mc_Table[k].."恢复了原形") JT_LP.jd_p[k] = nil end if Xaddr[1].value == JT_LP.rw_jd[k] then if JT_LP.temp5[k] == nil then JT_LP.temp5[k] = Xaddr[2].value elseif JT_LP.temp5[k] ~= Xaddr[2].value then JT_addLog(JT_LP.Mc_Table[k].."跳管道或出管道或其他") JT_Vent_Count[JT_LP.Mc_Table[k]] = (JT_Vent_Count[JT_LP.Mc_Table[k]] or 0) + 1 JT_LP.temp5[k] = Xaddr[2].value end end end if JT_LP.swrs == JT_rw_jl then JT_STATE.logText = "" JT_STATE.listening = false gg.toast("对局已结束,已自动退出监听") return end if JT_LP.Xaddr and type(JT_LP.Xaddr) == "table" then if JT_LP.Xaddr[13] and JT_LP.Xaddr[13].value == 0 then JT_STATE.logText = "" JT_STATE.listening = false gg.toast("对局已结束,已自动退出监听.") return end end end function JT_toggleListen() if JT_STATE.listening then JT_STATE.listening = false gg.toast("停止监听") else JT_startListen() end end function E() local items = { "获取数据", JT_STATE.listening and "停止监听" or "开始监听", "查看名字", "查看日志", "清除日志", "分析判断", "返回主页", } local choice = gg.choice(items, 2024, "监听区域") if not choice then return end if choice == 1 then JT_get_data() elseif choice == 2 then JT_toggleListen() elseif choice == 3 then if JT_prepare_game_data() then pcall(JT_B3) end elseif choice == 4 then JT_viewLog() elseif choice == 5 then JT_clearLog() elseif choice == 6 then JT_analyze() elseif choice == 7 then Main0() end end function Exit() print("小白脚本") os.exit() end cs = '小白脚本' while(true)do if gg.isVisible(true) then XGCK=1 gg.setVisible(false) end if XGCK==1 then Main0() end monsterFreezeLoop() pcall(JT_listenTick) end