function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]end
ms = { }
function setvalue ( add , value , falgs , dj )
local WY = { } WY [ 1 ] = { } WY [ 1 ].address = add WY [ 1 ].value = value WY [ 1 ].flags = falgs
if dj == true then
WY [ 1 ].freeze = true gg.addListItems ( WY )
else
gg.setValues ( WY )
end
end
function ms.ss ( num , ty , nc )
local GGNUMBER_1 = num
local GGNUMBER_2 = ty
local GGNUMBER_3 = false
local GGNUMBER_4 = gg.SIGN_EQUAL
local GGNUMBER_5 = 0x3000000000
local GGNUMBER_6 = 0xFFFFFFFFFF
local GGNUMBER_7 = 0
gg.clearResults ( )
gg.setRanges ( nc )
gg.searchNumber ( GGNUMBER_1 , GGNUMBER_2 , GGNUMBER_3 , GGNUMBER_4 , GGNUMBER_5 , GGNUMBER_6 , GGNUMBER_7 )
Result = gg.getResults ( gg.getResultCount ( ) )
end
function ms.py ( num , py , ty )
if ( Result and # Result ~= 0 ) then
t = { }
for i , v in ipairs ( Result ) do
t [ i ] = { } t [ i ].address = v.address + py t [ i ].flags = ty
end
t = gg.getValues ( t )
for i , v in ipairs ( t ) do
if v.value ~= num then
Result [ i ] = nil
end
end
local MS = { }
for i , v in pairs ( Result ) do
MS [ # MS + 1 ] = v
end
Result = MS
end
end
function ms.bc ( )
data = { }
if Result == nil or # Result == 0 then
gg.alert ( "开启失败" )
else
for i , v in pairs ( Result ) do
data [ # data + 1 ] = v.address
end
end
Result = nil
end
function ms.edit ( nn , off , ty , dj )
if ( Result ) then
ms.bc ( )
end
if # data > 0 then
for i , v in ipairs ( data ) do
setvalue ( v + off , nn , ty , dj or false )
end
end
end
local lib = gg.getRangesList()
for _ in ipairs(lib) do
if string.find(lib[_].name, 'libil2cpp.so') and lib[_].state == 'Xa' and lib[_].type == 'r-xp' then
module = lib[_].start
break
end
end
hook = {
StaticUpdater = 0x1929f34,
}
function HookCall(set)
local action = module + set.hook
local recover = gg.getValues({{address = action, flags = 4}})[1].value
local function offset(a, b)
if a >= b then
return string.format("-0x%X", a - b)
else
return string.format("0x%X", b - a)
end
return 0
end
local original = {}
for a, r in pairs(set.method) do
original[#original+1] = {address = action, flags = 4, value = "~A8 B [PC,#"..offset(action, module + r).."]"}
end
original[#original+1] = {address = action, flags = 4, value = recover}
for I in ipairs(original) do
gg.setValues({original[I]})
gg.sleep(math.random(4 * 7, 5 * 7))
end
return true
end
function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,gg.SIGN_EQUAL,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("搜索到 "..sl.." 个结果️️️") gg.clearResults() else gg.toast("未搜索到结果") end else gg.toast("无搜索值类型") end else gg.toast("无需搜索值") end end
function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[1]={} z1[1].address=sj[i].address+py z1[1].flags=lx z1=gg.getValues(z1) if z1[1].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end
function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[1]={} z1[1].address=sj[i].address+py z1[1].flags=lx z1=gg.getValues(z1) if z1[1].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end
function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("️共修改 "..#z.." 个数据️") else gg.toast("没有搜索数据") end end
function xg2(bz,value,lx,py,dj) if #bz~=nil then z={} for i=1,#bz do z[i]={} z[i].address=bz[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("❣共修改 "..#z.." 个数据❣") else gg.toast("️️没有搜索数据️️️") end end
function editData(qmnb,qmxg)gg.setVisible(false)gg.clearResults()qmnbv=qmnb[3]["value"]or qmnb[3][1]qmnbt=qmnb[3]["type"]or qmnb[3][2]qmnbn=qmnb[2]["name"]or qmnb[2][1]gg.setRanges(qmnb[1]["memory"]or qmnb[1][1])gg.searchNumber(qmnbv,qmnbt)gg.refineNumber(qmnbv,qmnbt)sz=gg.getResultCount()if sz==0 then gg.toast(qmnbn.."开启失败")else sl=gg.getResults(999999)for i=1,sz do pdsz=true for v=4,#qmnb do if pdsz==true then pysz={{}}pysz[1].address=sl[i].address+(qmnb[v]["offset"]or qmnb[v][2])pysz[1].flags=qmnb[v]["type"]or qmnb[v][3]szpy=gg.getValues(pysz)tzszpd=tostring(qmnb[v]["lv"]or qmnb[v][1]):gsub(",","")pyszpd=tostring(szpy[1].value):gsub(",","")if tzszpd==pyszpd then pdjg=true pdsz=true else pdjg=false pdsz=false end end end if pdjg==true then szpy=sl[i].address for x=1,#qmxg do xgsz=qmxg[x]["value"]or qmxg[x][1]xgpy=szpy+(qmxg[x]["offset"]or qmxg[x][2])xglx=qmxg[x]["type"]or qmxg[x][3]xgdj=qmxg[x]["freeze"]or qmxg[x][4]xg={{address=xgpy,flags=xglx,value=xgsz}}if xgdj==true then xg[1].freeze=xgdj gg.addListItems(xg)else gg.setValues(xg)end end xgjg=true end end if xgjg==true then gg.toast(qmnbn.."开启成功")else gg.toast(qmnbn.."开启失败")end end end
local lib = gg.getRangesList()
for _ in ipairs(lib) do
if string.find(lib[_].name, 'libil2cpp.so') and lib[_].state == 'Xa' and lib[_].type == 'r-xp' then
module = lib[_].start
break
end
end
function returnValue(set)
local inputRegister
local page = module + set[1]
local mmap = set[4]
local setva = {
{address = mmap + 0x4, flags = 4, value = '~A8 BR X30'},
{address = mmap + set[2], flags = 16, value = set[3]},
{address = page, flags = 4, value = '~A8 LDR X0, [PC,#0x8]'},
{address = page + 0x4, flags = 4, value = '~A8 BR X0'},
{address = page + 0x8, flags = 32, value = mmap},
}
if set[3] % 1 == 0 then
inputRegister = 'X0'
else
inputRegister = 'S0'
end
table.insert(setva, {address = mmap, flags = 4, value = '~A8 LDR '..inputRegister..', [PC,#'..string.format('0x%X', set[2])..']'})
return gg.setValues(setva)
end
function TL(FUNCTIONADD,TYPE,VALUE)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[1]==nil then _error() else
gg.setValues({{address=SOMOD[1].start+FUNCTIONADD,flags=TYPE,value=VALUE}})
gg.setValues({{address=SOMOD[1].start+FUNCTIONADD+4,flags=TYPE,value="1EFF2FE1r"}})
end
end
function WT(FUNCTIONADD,VALUE,REPAIR,REPAIR2)
local aa = gg.getRangesList("il2cpp.so")[2]
if aa==nil then _error() else
gg.setValues({{address=aa.start+FUNCTIONADD,flags=4,value=VALUE}})
if REPAIR == nil then else
gg.setValues({{address=aa.start+FUNCTIONADD+4,flags=4,value=REPAIR}})
end
if REPAIR2 == nil then else
gg.setValues({{address=aa.start+FUNCTIONADD+8,flags=4,value=REPAIR2}})
end
end
end
function _error()
TLt = gg.alert("模块未加载\n或选错游戏进程","取消","选择进程")
if TLt == 2 then
gg.setProcessX()
end
end
function Set(seach,target,set,name)
local timeStart = os.clock()
gg.clearResults()
gg.setRanges(seach[3])
gg.searchNumber(seach[1], seach[2])
local results = gg.getResults(gg.getResultCount())
if #results == 0 then
gg.toast("开启失败")
return
end
local kv = {}
for tt = 1, #results do
kv[tt] = false
end
for ts = 1, #target do
for tt = 1, #results do
local currentValue = gg.getValues({{address=results[tt].address+target[ts][2],flags=target[ts][3]}})[1].value
if currentValue ~= target[ts][1] then
kv[tt] = true
end
end
end
local conut = 0
for tttt = 1, #set do
for ttt = 1, #results do
if not kv[ttt] then
gg.addListItems({{address=results[ttt].address+set[tttt][1],flags=set[tttt][2],freeze=true,value=set[tttt][3]}})
conut = conut + 1
end
end
end
if conut > 0 then
gg.toast(""..name.."开启成功 共修改"..conut.."个值\n共耗时"..(os.clock() - timeStart).."秒")
else
gg.toast("未修改任何值")
end
end
function WY(a,b,c,d,e)
local time = os.clock()
kv = {}
local aa = gg.getRangesList(a)
if aa[1] == nil then
gg.alert("模块未加载\n或选错游戏进程")
end
local l = gg.getRangesList(a)[1].start
for i, k in ipairs (b) do
local v = l + k
kv[#kv+1] = {address = v, flags = c, value = d, freeze = true}
end
gg.addListItems(kv)
gg.toast(e.."开启成功\n共耗时"..os.clock() - time.."秒\n共修改"..#b.."条值")
end
function SOGSPY_ST(HDZ,DYZ)
if HDZ >= DYZ then
py = string.format("0x%X", HDZ - DYZ)
return tostring(string.format("-0x%X", py))
else
py = string.format("0x%X", DYZ - HDZ)
return tostring(string.format("0x%X", py))
end
end
function SO_PT(FUNCTIONADD, TYPE, VALUE)
local SOMOD = gg.getRangesList("il2cpp.so")
if SOMOD[2] == nil then gg.alert("开启失败\n内存\n解决方法:请重新选择游戏进程\n") else
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD, flags=TYPE, value=VALUE}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+4, flags=TYPE, value="~A8 RET"}})
end
end
function SO_Deposit(FUNCTIONADD, TYPE, VALUE)
local SOMOD = gg.getRangesList("il2cpp.so")
if SOMOD[2] == nil then gg.alert("开启失败\n内存\n解决方法:请重新选择游戏进程\n") else
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD, flags=4, value="~A8 LDR X0, [PC, #0x8]"}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+4, flags=4, value="~A8 RET"}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+8, flags=TYPE, value=VALUE}})
end
end
function SO_Deposit(FUNCTIONADD,TYPE,VALUE)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[2]==nil then gg.alert("开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━") else
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD,flags=4,value='~A8 LDR X0, [PC,#0x8]'}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+4,flags=4,value='~A8 RET'}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+8,flags=TYPE,value=VALUE}})
end
end
function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,536870912,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("搜索到 "..sl.." 个结果") gg.clearResults() else gg.toast("未搜索到结果") end else gg.toast("无搜索值类型") end else gg.toast("无需搜索值") end end function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end
function GL(FUNCTIONADD,TYPE,VALUE)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[2]==nil then gg.alert("开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━") else
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD,flags=TYPE,value=VALUE}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+4,flags=TYPE,value="~A8 RET"}})
end
end
function TL_TL(a,b,c,d,e)
local time = os.clock()
kv = {}
local aa = gg.getRangesList(a)
if aa[1] == nil then
gg.alert("模块未加载\n或选错游戏进程")
end
local l = gg.getRangesList(a)[1].start
for i, k in ipairs (b) do
local v = l + k
kv[#kv+1] = {address = v, flags = c, value = d, freeze = true}
end
gg.addListItems(kv)
gg.toast(e.."开启成功\n共耗时"..os.clock() - time.."秒\n共修改"..#b.."条值")
end
function S_Pointer(t_So, t_Offset, _bit)
local function getRanges()
local ranges = {}
local t = gg.getRangesList('^/data/*.so*$')
for i, v in pairs(t) do
if v.type:sub(2, 2) == 'w' then
table.insert(ranges, v)
end
end
return ranges
end
local function Get_Address(N_So, Offset, ti_bit)
local ti = gg.getTargetInfo()
local S_list = getRanges()
local t = {}
local _t
local _S = nil
if ti_bit then
_t = 32
else
_t = 4
end
for i in pairs(S_list) do
local _N = S_list[i].internalName:gsub('^.*/', '')
if N_So[1] == _N and N_So[2] == S_list[i].state then
_S = S_list[i]
break
end
end
if _S then
t[#t + 1] = {}
t[#t].address = _S.start + Offset[1]
t[#t].flags = _t
if #Offset ~= 1 then
for i = 2, #Offset do
local S = gg.getValues(t)
t = {}
for _ in pairs(S) do
if not ti.x64 then
S[_].value = S[_].value & 0xFFFFFFFF
end
t[#t + 1] = {}
t[#t].address = S[_].value + Offset[i]
t[#t].flags = _t
end
end
end
_S = t[#t].address
end
return _S
end
local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit))
return _A
end
function TL(FUNCTIONADD,VALUE,REPAIR,REPAIR2)
local aa = gg.getRangesList("libil2cpp.so")[2]
if aa==nil then _error() else
gg.setValues({{address=aa.start+FUNCTIONADD,flags=4,value=VALUE}})
if REPAIR == nil then else
gg.setValues({{address=aa.start+FUNCTIONADD+4,flags=4,value=REPAIR}})
if REPAIR2 == nil then else
gg.setValues({{address=aa.start+FUNCTIONADD+8,flags=4,value=REPAIR2}})
end
end
end
end
function _error()
TLt = gg.alert("模块未加载\n或选错游戏进程","取消","选择进程")
if TLt == 2 then
gg.setProcessX()
end
end
function SOGSPY_ST(HDZ,DYZ)
if HDZ >= DYZ then
py=string.format("0x%X",HDZ-DYZ)
return tostring(string.format("-0x%X",py))
else
py=string.format("0x%X",DYZ-HDZ)
return tostring(string.format("0x%X",py))
end
end
function SO_PT(FUNCTIONADD,TYPE,VALUE)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[2]==nil then gg.alert("开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━") else
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD,flags=TYPE,value=VALUE}})
gg.setValues({{address=SOMOD[2].start+FUNCTIONADD+4,flags=TYPE,value="~A8 RET"}})
end
end
local json = json
function json() local always_try_using_lpeg = true local register_global_module_table = false local global_module_name = 'json' local pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset = pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset local error, require, pcall, select = error, require, pcall, select local floor, huge = math.floor, math.huge local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat = string.rep, string.gsub, string.sub, string.byte, string.char, string.find, string.len, string.format local strmatch = string.match local concat = table.concat local json = { version = "dkjson 2.5" } if register_global_module_table then _G[global_module_name] = json end local _ENV = nil pcall(function() local debmeta = require "debug".getmetatable if debmeta then getmetatable = debmeta end end) json.null = setmetatable({}, { __tojson = function() return "null" end }) local function isarray (tbl) local max, n, arraylen = 0, 0, 0 for k, v in pairs(tbl) do if k == 'n' and type(v) == 'number' then arraylen = v if v > max then max = v end else if type(k) ~= 'number' or k < 1 or floor(k) ~= k then return false end if k > max then max = k end n = n + 1 end end if max > 10 and max > arraylen and max > n * 2 then return false end return true, max end local escapecodes = { ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t" } local function escapeutf8 (uchar) local value = escapecodes[uchar] if value then return value end local a, b, c, d = strbyte(uchar, 1, 4) a, b, c, d = a or 0, b or 0, c or 0, d or 0 if a <= 0x7f then value = a elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then value = (a - 0xc0) * 0x40 + b - 0x80 elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80 elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80 else return "" end if value <= 0xffff then return strformat("\\u%.4x", value) elseif value <= 0x10ffff then value = value - 0x10000 local highsur, lowsur = 0xD800 + floor(value / 0x400), 0xDC00 + (value % 0x400) return strformat("\\u%.4x\\u%.4x", highsur, lowsur) else return "" end end local function fsub (str, pattern, repl) if strfind(str, pattern) then return gsub(str, pattern, repl) else return str end end local function quotestring (value) value = fsub(value, "[%z\1-\31\"\\\127]", escapeutf8) if strfind(value, "[\194\216\220\225\226\239]") then value = fsub(value, "\194[\128-\159\173]", escapeutf8) value = fsub(value, "\216[\128-\132]", escapeutf8) value = fsub(value, "\220\143", escapeutf8) value = fsub(value, "\225\158[\180\181]", escapeutf8) value = fsub(value, "\226\128[\140-\143\168-\175]", escapeutf8) value = fsub(value, "\226\129[\160-\175]", escapeutf8) value = fsub(value, "\239\187\191", escapeutf8) value = fsub(value, "\239\191[\176-\191]", escapeutf8) end return "\"" .. value .. "\"" end json.quotestring = quotestring local function replace(str, o, n) local i, j = strfind(str, o, 1, true) if i then return strsub(str, 1, i - 1) .. n .. strsub(str, j + 1, -1) else return str end end local decpoint, numfilter local function updatedecpoint () decpoint = strmatch(tostring(0.5), "([^05+])") numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+" end updatedecpoint() local function num2str (num) return replace(fsub(tostring(num), numfilter, ""), decpoint, ".") end local function str2num (str) local num = tonumber(replace(str, ".", decpoint)) if not num then updatedecpoint() num = tonumber(replace(str, ".", decpoint)) end return num end local function addnewline2 (level, buffer, buflen) buffer[buflen + 1] = "\n" buffer[buflen + 2] = strrep(" ", level) buflen = buflen + 2 return buflen end function json.addnewline (state) if state.indent then state.bufferlen = addnewline2(state.level or 0, state.buffer, state.bufferlen or #(state.buffer)) end end local encode2 local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state) local kt = type(key) if kt ~= 'string' and kt ~= 'number' then return nil, "type '" .. kt .. "' is not supported as a key by JSON." end if prev then buflen = buflen + 1 buffer[buflen] = "," end if indent then buflen = addnewline2(level, buffer, buflen) end buffer[buflen + 1] = quotestring(key) buffer[buflen + 2] = ":" return encode2(value, indent, level, buffer, buflen + 2, tables, globalorder, state) end local function appendcustom(res, buffer, state) local buflen = state.bufferlen if type(res) == 'string' then buflen = buflen + 1 buffer[buflen] = res end return buflen end local function exception(reason, value, state, buffer, buflen, defaultmessage) defaultmessage = defaultmessage or reason local handler = state.exception if not handler then return nil, defaultmessage else state.bufferlen = buflen local ret, msg = handler(reason, value, state, defaultmessage) if not ret then return nil, msg or defaultmessage end return appendcustom(ret, buffer, state) end end function json.encodeexception(reason, value, state, defaultmessage) return quotestring("<" .. defaultmessage .. ">") end encode2 = function(value, indent, level, buffer, buflen, tables, globalorder, state) local valtype = type(value) local valmeta = getmetatable(value) valmeta = type(valmeta) == 'table' and valmeta local valtojson = valmeta and valmeta.__tojson if valtojson then if tables[value] then return exception('reference cycle', value, state, buffer, buflen) end tables[value] = true state.bufferlen = buflen local ret, msg = valtojson(value, state) if not ret then return exception('custom encoder failed', value, state, buffer, buflen, msg)end tables[value] = nil buflen = appendcustom(ret, buffer, state) elseif value == nil then buflen = buflen + 1 buffer[buflen] = "null" elseif valtype == 'number' then local s if value ~= value or value >= huge or -value >= huge then s = "null" else s = num2str(value) end buflen = buflen + 1 buffer[buflen] = s elseif valtype == 'boolean' then buflen = buflen + 1 buffer[buflen] = value and "true" or "false" elseif valtype == 'string' then buflen = buflen + 1 buffer[buflen] = quotestring(value) elseif valtype == 'table' then if tables[value] then return exception('reference cycle', value, state, buffer, buflen) end tables[value] = true level = level + 1 local isa, n = isarray(value) if n == 0 and valmeta and valmeta.__jsontype == 'object' then isa = false end local msg if isa then buflen = buflen + 1 buffer[buflen] = "[" for i = 1, n do buflen, msg = encode2(value[i], indent, level, buffer, buflen, tables, globalorder, state) if not buflen then return nil, msg end if i < n then buflen = buflen + 1 buffer[buflen] = "," end end buflen = buflen + 1 buffer[buflen] = "]" else local prev = false buflen = buflen + 1 buffer[buflen] = "{" local order = valmeta and valmeta.__jsonorder or globalorder if order then local used = {} n = #order for i = 1, n do local k = order[i] local v = value[k] if v then used[k] = true buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) prev = true end end for k, v in pairs(value) do if not used[k] then buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) if not buflen then return nil, msg end prev = true end end else for k, v in pairs(value) do buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) if not buflen then return nil, msg end prev = true end end if indent then buflen = addnewline2(level - 1, buffer, buflen) end buflen = buflen + 1 buffer[buflen] = "}" end tables[value] = nil else return exception('unsupported type', value, state, buffer, buflen, "type '" .. valtype .. "' is not supported by JSON.") end return buflen end function json.encode (value, state) state = state or {} local oldbuffer = state.buffer local buffer = oldbuffer or {} state.buffer = buffer updatedecpoint() local ret, msg = encode2(value, state.indent, state.level or 0, buffer, state.bufferlen or 0, state.tables or {}, state.keyorder, state) if not ret then error(msg, 2) elseif oldbuffer == buffer then state.bufferlen = ret return true else state.bufferlen = nil state.buffer = nil return concat(buffer) end end local function loc (str, where) local line, pos, linepos = 1, 1, 0 while true do pos = strfind(str, "\n", pos, true) if pos and pos < where then line = line + 1 linepos = pos pos = pos + 1 else break end end return "line " .. line .. ", column " .. (where - linepos) end local function unterminated (str, what, where) return nil, strlen(str) + 1, "unterminated " .. what .. " at " .. loc(str, where) end local function scanwhite (str, pos) while true do pos = strfind(str, "%S", pos) if not pos then return nil end local sub2 = strsub(str, pos, pos + 1) if sub2 == "\239\187" and strsub(str, pos + 2, pos + 2) == "\191" then pos = pos + 3 elseif sub2 == "//" then pos = strfind(str, "[\n\r]", pos + 2) if not pos then return nil end elseif sub2 == "/*" then pos = strfind(str, "*/", pos + 2) if not pos then return nil end pos = pos + 2 else return pos end end end local escapechars = { ["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f", ["n"] = "\n", ["r"] = "\r", ["t"] = "\t" } local function unichar (value) if value < 0 then return nil elseif value <= 0x007f then return strchar(value) elseif value <= 0x07ff then return strchar(0xc0 + floor(value / 0x40), 0x80 + (floor(value) % 0x40)) elseif value <= 0xffff then return strchar(0xe0 + floor(value / 0x1000), 0x80 + (floor(value / 0x40) % 0x40), 0x80 + (floor(value) % 0x40)) elseif value <= 0x10ffff then return strchar(0xf0 + floor(value / 0x40000), 0x80 + (floor(value / 0x1000) % 0x40), 0x80 + (floor(value / 0x40) % 0x40), 0x80 + (floor(value) % 0x40)) else return nil end end local function scanstring (str, pos) local lastpos = pos + 1 local buffer, n = {}, 0 while true do local nextpos = strfind(str, "[\"\\]", lastpos) if not nextpos then return unterminated(str, "string", pos) end if nextpos > lastpos then n = n + 1 buffer[n] = strsub(str, lastpos, nextpos - 1) end if strsub(str, nextpos, nextpos) == "\"" then lastpos = nextpos + 1 break else local escchar = strsub(str, nextpos + 1, nextpos + 1) local value if escchar == "u" then value = tonumber(strsub(str, nextpos + 2, nextpos + 5), 16) if value then local value2 if 0xD800 <= value and value <= 0xDBff then if strsub(str, nextpos + 6, nextpos + 7) == "\\u" then value2 = tonumber(strsub(str, nextpos + 8, nextpos + 11), 16) if value2 and 0xDC00 <= value2 and value2 <= 0xDFFF then value = (value - 0xD800) * 0x400 + (value2 - 0xDC00) + 0x10000 else value2 = nil end end end value = value and unichar(value) if value then if value2 then lastpos = nextpos + 12 else lastpos = nextpos + 6 end end end end if not value then value = escapechars[escchar] or escchar lastpos = nextpos + 2 end n = n + 1 buffer[n] = value end end if n == 1 then return buffer[1], lastpos elseif n > 1 then return concat(buffer), lastpos else return "", lastpos end end local scanvalue local function scantable (what, closechar, str, startpos, nullval, objectmeta, arraymeta) local len = strlen(str) local tbl, n = {}, 0 local pos = startpos + 1 if what == 'object' then setmetatable(tbl, objectmeta) else setmetatable(tbl, arraymeta) end while true do pos = scanwhite(str, pos) if not pos then return unterminated(str, what, startpos) end local char = strsub(str, pos, pos) if char == closechar then return tbl, pos + 1 end local val1, err val1, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta) if err then return nil, pos, err end pos = scanwhite(str, pos) if not pos then return unterminated(str, what, startpos) end char = strsub(str, pos, pos) if char == ":" then if val1 == nil then return nil, pos, "cannot use nil as table index (at " .. loc(str, pos) .. ")" end pos = scanwhite(str, pos + 1) if not pos then return unterminated(str, what, startpos) end local val2 val2, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta) if err then return nil, pos, err end tbl[val1] = val2 pos = scanwhite(str, pos) if not pos then return unterminated(str, what, startpos) end char = strsub(str, pos, pos) else n = n + 1 tbl[n] = val1 end if char == "," then pos = pos + 1 end end end scanvalue = function(str, pos, nullval, objectmeta, arraymeta) pos = pos or 1 pos = scanwhite(str, pos) if not pos then return nil, strlen(str) + 1, "no valid JSON value (reached the end)" end local char = strsub(str, pos, pos) if char == "{" then return scantable('object', "}", str, pos, nullval, objectmeta, arraymeta) elseif char == "[" then return scantable('array', "]", str, pos, nullval, objectmeta, arraymeta) elseif char == "\"" then return scanstring(str, pos) else local pstart, pend = strfind(str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos) if pstart then local number = str2num(strsub(str, pstart, pend)) if number then return number, pend + 1 end end pstart, pend = strfind(str, "^%a%w*", pos) if pstart then local name = strsub(str, pstart, pend) if name == "true" then return true, pend + 1 elseif name == "false" then return false, pend + 1 elseif name == "null" then return nullval, pend + 1 end end return nil, pos, "no valid JSON value at " .. loc(str, pos) end end local function optionalmetatables(...) if select("#", ...) > 0 then return ... else return { __jsontype = 'object' }, { __jsontype = 'array' } end end function json.decode (str, pos, nullval, ...) local objectmeta, arraymeta = optionalmetatables(...) return scanvalue(str, pos, nullval, objectmeta, arraymeta) end function json.use_lpeg () local g = require("lpeg") if g.version() == "0.11" then error "due to a bug in LPeg 0.11, it cannot be used for JSON matching" end local pegmatch = g.match local P, S, R = g.P, g.S, g.R local function ErrorCall (str, pos, msg, state) if not state.msg then state.msg = msg .. " at " .. loc(str, pos) state.pos = pos end return false end local function Err (msg) return g.Cmt(g.Cc(msg) * g.Carg(2), ErrorCall) end local SingleLineComment = P "//" * (1 - S "\n\r") ^ 0 local MultiLineComment = P "/*" * (1 - P "*/") ^ 0 * P "*/" local Space = (S " \n\r\t" + P "\239\187\191" + SingleLineComment + MultiLineComment) ^ 0 local PlainChar = 1 - S "\"\\\n\r" local EscapeSequence = (P "\\" * g.C(S "\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars local HexDigit = R("09", "af", "AF") local function UTF16Surrogate (match, pos, high, low) high, low = tonumber(high, 16), tonumber(low, 16) if 0xD800 <= high and high <= 0xDBff and 0xDC00 <= low and low <= 0xDFFF then return true, unichar((high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000) else return false end end local function UTF16BMP (hex) return unichar(tonumber(hex, 16)) end local U16Sequence = (P "\\u" * g.C(HexDigit * HexDigit * HexDigit * HexDigit)) local UnicodeEscape = g.Cmt(U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence / UTF16BMP local Char = UnicodeEscape + EscapeSequence + PlainChar local String = P "\"" * g.Cs(Char ^ 0) * (P "\"" + Err "unterminated string") local Integer = P "-" ^ (-1) * (P "0" + (R "19" * R "09" ^ 0)) local Fractal = P "." * R "09" ^ 0 local Exponent = (S "eE") * (S "+-") ^ (-1) * R "09" ^ 1 local Number = (Integer * Fractal ^ (-1) * Exponent ^ (-1)) / str2num local Constant = P "true" * g.Cc(true) + P "false" * g.Cc(false) + P "null" * g.Carg(1) local SimpleValue = Number + String + Constant local ArrayContent, ObjectContent local function parsearray (str, pos, nullval, state) local obj, cont local npos local t, nt = {}, 0 repeat obj, cont, npos = pegmatch(ArrayContent, str, pos, nullval, state) if not npos then break end pos = npos nt = nt + 1 t[nt] = obj until cont == 'last' return pos, setmetatable(t, state.arraymeta) end local function parseobject (str, pos, nullval, state) local obj, key, cont local npos local t = {} repeat key, obj, cont, npos = pegmatch(ObjectContent, str, pos, nullval, state) if not npos then break end pos = npos t[key] = obj until cont == 'last' return pos, setmetatable(t, state.objectmeta) end local Array = P "[" * g.Cmt(g.Carg(1) * g.Carg(2), parsearray) * Space * (P "]" + Err "']' expected") local Object = P "{" * g.Cmt(g.Carg(1) * g.Carg(2), parseobject) * Space * (P "}" + Err "'}' expected") local Value = Space * (Array + Object + SimpleValue) local ExpectedValue = Value + Space * Err "value expected" ArrayContent = Value * Space * (P "," * g.Cc 'cont' + g.Cc 'last') * g.Cp() local Pair = g.Cg(Space * String * Space * (P ":" + Err "colon expected") * ExpectedValue) ObjectContent = Pair * Space * (P "," * g.Cc 'cont' + g.Cc 'last') * g.Cp() local DecodeValue = ExpectedValue * g.Cp() function json.decode (str, pos, nullval, ...) local state = {} state.objectmeta, state.arraymeta = optionalmetatables(...) local obj, retpos = pegmatch(DecodeValue, str, pos, nullval, state) if state.msg then return nil, state.pos, state.msg else return obj, retpos end end json.use_lpeg = function() return json end json.using_lpeg = true return json end if always_try_using_lpeg then pcall(json.use_lpeg) end return json end
function _getTableCount(search)
local conut=0
for k ,v in pairs(search) do
conut = conut+1
end
return conut
end
function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]end
ms = { }
function setvalue ( add , value , falgs , dj )
local WY = { } WY [ 1 ] = { } WY [ 1 ].address = add WY [ 1 ].value = value WY [ 1 ].flags = falgs
if dj == true then
WY [ 1 ].freeze = true gg.addListItems ( WY )
else
gg.setValues ( WY )
end
end
function ms.ss ( num , ty , nc )
local GGNUMBER_1 = num
local GGNUMBER_2 = ty
local GGNUMBER_3 = false
local GGNUMBER_4 = gg.SIGN_EQUAL
local GGNUMBER_5 = 0x3000000000
local GGNUMBER_6 = 0xFFFFFFFFFF
local GGNUMBER_7 = 0
gg.clearResults ( )
gg.setRanges ( nc )
gg.searchNumber ( GGNUMBER_1 , GGNUMBER_2 , GGNUMBER_3 , GGNUMBER_4 , GGNUMBER_5 , GGNUMBER_6 , GGNUMBER_7 )
Result = gg.getResults ( gg.getResultCount ( ) )
end
function ms.py ( num , py , ty )
if ( Result and # Result ~= 0 ) then
t = { }
for i , v in ipairs ( Result ) do
t [ i ] = { } t [ i ].address = v.address + py t [ i ].flags = ty
end
t = gg.getValues ( t )
for i , v in ipairs ( t ) do
if v.value ~= num then
Result [ i ] = nil
end
end
local MS = { }
for i , v in pairs ( Result ) do
MS [ # MS + 1 ] = v
end
Result = MS
end
end
function ms.bc ( )
data = { }
if Result == nil or # Result == 0 then
gg.alert ( "开启失败" )
else
for i , v in pairs ( Result ) do
data [ # data + 1 ] = v.address
end
end
Result = nil
end
function ms.edit ( nn , off , ty , dj )
if ( Result ) then
ms.bc ( )
end
if # data > 0 then
for i , v in ipairs ( data ) do
setvalue ( v + off , nn , ty , dj or false )
end
end
end
function readPointer(name, offset, i)
local re = gg.getRangesList(name)
local x64 = gg.getTargetInfo().x64
local va = x64 and 32 or 4
local addr
if re[i or 1] then
addr = re[i or 1].start + offset[1]
for j = 2, #offset do
local result = gg.getValues({ { address = addr, flags = va } })[1]
if not result then
gg.toast("读取指针失败")
return nil
end
addr = (result.value & (x64 and 18446744073709551615 or 4294967295)) + offset[j]
end
else
gg.toast("模块不存在")
return nil
end
return addr
end
function gg.edits(addr, Table, name)
if not addr then
gg.toast('修改失败, 可能是模块不存在')
return
end
local Table1 = { {}, {} }
for k, v in ipairs(Table) do
local value = { address = addr + v[3], value = v[1], flags = v[2], freeze = v[4] }
Table1[v[4] and 2 or 1][#Table1[v[4] and 2 or 1] + 1] = value
end
if #Table1[2] > 0 then
gg.addListItems(Table1[2])
end
gg.setValues(Table1[1])
gg.toast((name or "") .. "开启成功, 共修改" .. #Table .. "个值")
end
So_32 = function ( Ad , Value , IF )
if gg.getRangesList ( 'libil2cpp.so' ) [ 1 ] == nil then
gg.alert("请重新选择进程")
else
gg.clearResults ( )
local Ret = "~A8 RET"
local So = gg.getRangesList ( 'libil2cpp.so' )
for key , value in pairs ( So ) do
if value.state ~= "Xa" then
return
else
local Soad = value.start
local Add = Soad + Ad
gg.processPause ( )
gg.setValues ( { { address = Add , flags = 4 , value = Value } } )
gg.processResume ( )
if IF == true then
gg.setValues ( { { address = Add + 4 , flags = 4 , value = Ret } } )
gg.processResume ( )
elseif IF == nil then
gg.processPause ( )
gg.setValues ( { { address = Add + 4 , flags = 4 , value =Ret } } )
gg.processResume ( )
elseif IF == false then
break
end
end
end
end
end
function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]end
ms = { }
function setvalue ( add , value , falgs , dj )
local WY = { } WY [ 1 ] = { } WY [ 1 ].address = add WY [ 1 ].value = value WY [ 1 ].flags = falgs
if dj == true then
WY [ 1 ].freeze = true gg.addListItems ( WY )
else
gg.setValues ( WY )
end
end
function ms.ss ( num , ty , nc )
local GGNUMBER_1 = num
local GGNUMBER_2 = ty
local GGNUMBER_3 = false
local GGNUMBER_4 = gg.SIGN_EQUAL
local GGNUMBER_5 = 0x3000000000
local GGNUMBER_6 = 0xFFFFFFFFFF
local GGNUMBER_7 = 0
gg.clearResults ( )
gg.setRanges ( nc )
gg.searchNumber ( GGNUMBER_1 , GGNUMBER_2 , GGNUMBER_3 , GGNUMBER_4 , GGNUMBER_5 , GGNUMBER_6 , GGNUMBER_7 )
Result = gg.getResults ( gg.getResultCount ( ) )
end
function ms.py ( num , py , ty )
if ( Result and # Result ~= 0 ) then
t = { }
for i , v in ipairs ( Result ) do
t [ i ] = { } t [ i ].address = v.address + py t [ i ].flags = ty
end
t = gg.getValues ( t )
for i , v in ipairs ( t ) do
if v.value ~= num then
Result [ i ] = nil
end
end
local MS = { }
for i , v in pairs ( Result ) do
MS [ # MS + 1 ] = v
end
Result = MS
end
end
function ms.bc ( )
data = { }
if Result == nil or # Result == 0 then
gg.alert ( "开启失败" )
else
for i , v in pairs ( Result ) do
data [ # data + 1 ] = v.address
end
end
Result = nil
end
function ms.edit ( nn , off , ty , dj )
if ( Result ) then
ms.bc ( )
end
if # data > 0 then
for i , v in ipairs ( data ) do
setvalue ( v + off , nn , ty , dj or false )
end
gg.toast ( Name.."成功" )
end
end
Sy_x32 = function ( Address , Value )
local Somod = gg.getRangesList ( 'il2cpp.so' ) [ 2 ]
if Somod == nil then
gg.alert ( '请重新选择地铁跑酷进程' )
else
local So = Somod.start
local Add = So + Address
gg.processPause ( )
gg.setValues ( { { address = Add , flags = 4 , value = Value } } )
gg.setValues ( { { address = Add + 4 , flags = 4 , value = "~A BX LR" } } )
gg.processResume ( )
end
end
function SO_FLPTXG(FUNCTIONADD,TYPE,VALUE)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[2]==nil then gg.alert("开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━") else
local SOMOD1=gg.getRangesList("libil2cpp.so")[2].start
gg.setValues({{address=SOMOD1+FUNCTIONADD,flags=TYPE,value='~A8 MOV W0, #'..VALUE}})
gg.setValues({{address=SOMOD1+FUNCTIONADD+4,flags=TYPE,value="0000271Er"}})
gg.setValues({{address=SOMOD1+FUNCTIONADD+8,flags=TYPE,value="00D8215Er"}})
gg.setValues({{address=SOMOD1+FUNCTIONADD+12,flags=TYPE,value="0000261Er"}})
gg.setValues({{address=SOMOD1+FUNCTIONADD+16,flags=TYPE,value="~A8 RET"}})
end
end
function search(ss,lx,nc,dz1,dz2) gg.setVisible(false) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,536870912,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("搜索到 "..sl.." 个结果") gg.clearResults() else gg.toast("未搜索到结果") end else gg.toast("无搜索值类型") end else gg.toast("无需搜索值") end end function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end
function editData(qmnb,qmxg)gg.setVisible(false)gg.clearResults()qmnbv=qmnb[3]["value"]or qmnb[3][1]qmnbt=qmnb[3]["type"]or qmnb[3][2]qmnbn=qmnb[2]["name"]or qmnb[2][1]gg.setRanges(qmnb[1]["memory"]or qmnb[1][1])gg.searchNumber(qmnbv,qmnbt)gg.refineNumber(qmnbv,qmnbt)sz=gg.getResultCount()if sz==0 then gg.toast(qmnbn.."开启失败")else sl=gg.getResults(999999)for i=1,sz do pdsz=true for v=4,#qmnb do if pdsz==true then pysz={{}}pysz[1].address=sl[i].address+(qmnb[v]["offset"]or qmnb[v][2])pysz[1].flags=qmnb[v]["type"]or qmnb[v][3]szpy=gg.getValues(pysz)tzszpd=tostring(qmnb[v]["lv"]or qmnb[v][1]):gsub(",","")pyszpd=tostring(szpy[1].value):gsub(",","")if tzszpd==pyszpd then pdjg=true pdsz=true else pdjg=false pdsz=false end end end if pdjg==true then szpy=sl[i].address for x=1,#qmxg do xgsz=qmxg[x]["value"]or qmxg[x][1]xgpy=szpy+(qmxg[x]["offset"]or qmxg[x][2])xglx=qmxg[x]["type"]or qmxg[x][3]xgdj=qmxg[x]["freeze"]or qmxg[x][4]xg={{address=xgpy,flags=xglx,value=xgsz}}if xgdj==true then xg[1].freeze=xgdj gg.addListItems(xg)else gg.setValues(xg)end end xgjg=true end end if xgjg==true then gg.toast(qmnbn.."开启成功")else gg.toast(qmnbn.."开启失败")end end end
function xqmnb(qmnb) gg.clearResults() gg.setRanges(qmnb[1]["memory"]) if gg.searchNumber(qmnb[3]["value"],qmnb[3]["type"],false,gg.SIGN_EQUAL,0,-1)~=true then gg.searchAddress(qmnb[3]["value"],-1,qmnb[3]["type"]) end if gg.getResultCount()==0 then gg.toast(qmnb[2]["name"].."开启失败")return end szxx=gg.getResults(gg.getResultCount()) szpd={} a=0 for i=4,#qmnb do for s=1,#szxx do if szpd[s]~="false" then if gg.getValues({{address=szxx[s].address+qmnb[i]["offset"],flags=qmnb[i]["type"]}})[1].value+0~=qmnb[i]["lv"]then szpd[s]="false" a=a+1 end end end end if a==#szxx then gg.toast(qmnb[2]["name"].."开启失败")return end b=0 t={} for x=1,#qmxg do if qmxg[x]["freeze"]==true then a=1 end for i=1,#szxx do if szpd[i]==nil then b=b+1 table.insert(t,{address=szxx[i].address+qmxg[x]["offset"],flags=qmxg[x]["type"],freeze=qmxg[x]["freeze"],value=qmxg[x]["value"]}) end end end gg.setValues(t) gg.addListItems(t) gg.clearResults() if a~=1 then gg.clearList()else a=nil end gg.toast(qmnb[2]["name"].."开启成功,共修改了"..b.."条数据") end
qmnb = function(daarr)
local array = {}
for i = 1, #daarr["搜索数组"] do
local data = {["lv"] =daarr["搜索数组"][i][1], ["offset"] = daarr["搜索数组"][i][2], ["type"] = daarr["搜索类型"]}
table.insert(array, i, data)
end
local isok, data = app.memorysearch(daarr["搜索内存"], array)
if isok then
for i = 1, #data do
for x = 1, #daarr["修改数组"] do
app.memorywrite(data[i] + daarr["修改数组"][x][2], daarr["搜索类型"], daarr["修改数组"][x][1])
end
end
gg.toast(daarr["功能名称"] .. "共修改" .. #data * #daarr["修改数组"] .. "条数据")
else
gg.toast(daarr["功能名称"] .. "开启失败")
end
end
function xg1(value,lx,py,dj) if sj~=nil and #sj>0 then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx if value == nil then value = readValue(z[i].address, lx) end z[i].value= value z[i].freeze = dj and true or false end if dj == true or dj == false then gg.addListItems(z) else gg.setValues(z) end gg.toast('') else gg.toast('') end end
function xg2(bz,value,lx,py,dj) if #bz~=nil then z={} for i=1,#bz do z[i]={} z[i].address=bz[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast('') else gg.toast('') end end function bc(bz) if sj~=nil then _ENV[bz]=sj else gg.toast('') end end
Qr_UIP2FazG='Main'
gg.clearResults() sj={} xgz={} function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,gg.SIGN_EQUAL,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("搜索到 "..sl.." 个结果") gg.clearResults() else gg.toast("未搜索到结果") end else gg.toast("无搜索值类型") end else gg.toast("无需搜索值") end end function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end function xg2(bz,value,lx,py,dj) if #bz~=nil then z={} for i=1,#bz do z[i]={} z[i].address=bz[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end function bc(bz) if sj~=nil then _ENV[bz]=sj else gg.toast("无数据") end end function BaAdd(add) if gg.getTargetInfo().x64==true then t=gg.getValues({[1]={address=add,flags=32}}) return t[1].value else t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end
DWORD=gg.TYPE_DWORD DOUBLE=gg.TYPE_DOUBLE FLOAT=gg.TYPE_FLOAT WORD=gg.TYPE_WORD BYTE=gg.TYPE_BYTE XOR=gg.TYPE_XOR QWORD=gg.TYPE_QWORD
D=gg.TYPE_DWORD E=gg.TYPE_DOUBLE F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD
-------------不懂勿动------------
------------道具赛配置---------------
function SearchWrite(Search, Write, Type, Name)
local time=os.clock()
gg.clearResults()
gg.setVisible(false)
gg.searchNumber(Search[1][1], Type)
local count = gg.getResultCount()
local result = gg.getResults(count)
gg.clearResults()
local data = {}
local base = Search[1][2]
if (count > 0) then
for i, v in ipairs(result) do
v.isUseful = true
end
for k=2, #Search do
local tmp = {}
local offset = Search[k][2] - base
local num = Search[k][1]
for i, v in ipairs(result) do
tmp[#tmp+1] = {}
tmp[#tmp].address = v.address + offset
tmp[#tmp].flags = v.flags
end
tmp = gg.getValues(tmp)
for i, v in ipairs(tmp) do
if ( tostring(v.value) ~= tostring(num) ) then
result[i].isUseful = false
end
end
end
for i, v in ipairs(result) do
if (v.isUseful) then
data[#data+1] = v.address
end
end
if (#data > 0) then
gg.toast("搜索到"..#data.."条数据")
local t = {}
local base = Search[1][2]
for i=1, #data do
for k, w in ipairs(Write) do
offset = w[2] - base
t[#t+1] = {}
t[#t].address = data[i] + offset
t[#t].flags = Type
t[#t].value = w[1]
if (w[3] == true) then
local item = {}
item[#item+1] = t[#t]
item[#item].freeze = true
gg.addListItems(item)
end
end
end
gg.setValues(t)
local time=string.sub(os.clock()-time,0,5)
gg.toast("开启成功 已修改:"..#t.."条数据 本次启动耗时:"..time.."秒")
gg.addListItems(t)
else
gg.toast("开启失败未搜索到任何数据", false)
return false
end
else
gg.toast("开启失败未搜索到任何数据")
return false
end
end
function Fs3Fs4(Fs1, Fs2, Fs3, Fs4, Fs5) gg.clearResults() gg.setRanges(Fs2) gg.setVisible(false) gg.searchNumber(Fs3[1][1], Fs3[1][3]) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Fs3[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Fs3 do local tmp = {} local offset = Fs3[k][2] - base local num = Fs3[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = Fs3[k][3] end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast(Fs1..'\n搜索到{'..#data..'}条数据') local t = {} local base = Fs3[1][2] if Fs5 == '' and Fs5 > 0 and Fs5 < #data then Fs5 = Fs5 else Fs5 = #data end for i=1, Fs5 do for k, w in ipairs(Fs4) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = w[3] t[#t].value = w[1] if (w[4] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) gg.toast(Fs1..'️\n已修改{'..#t..'}条数据') else gg.toast(Fs1..'\n数据搜索失败', false) return false end else gg.toast(Fs1..'\n数据修改失败', false) return false end end
function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,536870912,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("搜索到 "..sl.." 个结果") gg.clearResults() else gg.toast("未搜索到结果") end else gg.toast("无搜索值类型") end else gg.toast("无需搜索值") end end function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("共偏移 "..#sj.." 个数据") else gg.toast("没有搜索数据") end end
function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end
function xg2(bz,value,lx,py,dj) if #bz~=nil then z={} for i=1,#bz do z[i]={} z[i].address=bz[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数据") else gg.toast("没有搜索数据") end end function bc(bz) if sj~=nil then _ENV[bz]=sj else gg.toast("无数据") end end function BaAdd(add) t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end
function readWrite(Search,Get,Type,Range,Name) gg.clearResults() gg.setRanges(Range) gg.setVisible(false) if Search[1][1]~=false then gg.searchAddress(Search[1][1],0xFFFFFFFF,Search[1][4] or Type,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) end gg.searchNumber(Search[1][2],Search[1][4] or Type,false,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) local count=gg.getResultCount() local result=gg.getResults(count) gg.clearResults() local data={} local base=Search[1][3] if (count > 0) then for i,v in ipairs(result) do v.isUseful=true end for k=2,#Search do local tmp={} local offset=Search[k][2] - base local num=Search[k][1] for i,v in ipairs(result) do tmp[#tmp+1]={} tmp[#tmp].address=v.address+offset tmp[#tmp].flags=Search[k][3] or Type end tmp=gg.getValues(tmp) for i,v in ipairs(tmp) do if v.flags==16 or v.flags==64 then values=tostring(v.value):sub(1,6) num=tostring(num):sub(1,6) else values=v.value end if tostring(values)~=tostring(num) then result[i].isUseful=false end end end for i,v in ipairs(result) do if (v.isUseful) then data[#data+1]=v.address end end if (#data > 0) then local t,t_={},{} local base=Search[1][3] for i=1,#data do for k,w in ipairs(Get) do offset=w[2] - base if w[1]==false then t_[#t_+1]={} t_[#t_].address=data[i]+offset t_[#t_].flags=Type th_=(th_) and th_+1 or 1 else t[#t+1]={} t[#t].address=data[i]+offset t[#t].flags=w[3] or Type t[#t].value=w[1] tg_=(tg_) and tg_+1 or 1 if (w[4]==true) then local item={} item[#item+1]=t[#t] item[#item].freeze=w[4] gg.addListItems(item) end end end end tg=(tg_) and "\n已修改"..tg_.."条数据" or "" th=(th_) and "\n已获取"..th_.."条数据" or "" gg.setValues(t) t_=gg.getValues(t_) gg.loadResults(t_) gg.alert("\n"..Name.."搜索成功!\n偏移到"..#data.."条数据"..tg..th) tg_,th_=nil,nil else gg.alert("\n"..Name.."开启失败",false) return false end else gg.alert(Name.."开启失败") return false end end
----以上为指针搜索模块
-----基址指针模块
function S_Pointer(t_So, t_Offset, _bit)
local function getRanges()
local ranges = {}
local t = gg.getRangesList('^/data/*.so*$')
for i, v in pairs(t) do
if v.type:sub(2, 2) == 'w' then
table.insert(ranges, v)
end
end
return ranges
end
local function Get_Address(N_So, Offset, ti_bit)
local ti = gg.getTargetInfo()
local S_list = getRanges()
local t = {}
local _t
local _S = nil
if ti_bit then
_t = 32
else
_t = 4
end
for i in pairs(S_list) do
local _N = S_list[i].internalName:gsub('^.*/', '')
if N_So[1] == _N and N_So[2] == S_list[i].state then
_S = S_list[i]
break
end
end
if _S then
t[#t + 1] = {}
t[#t].address = _S.start + Offset[1]
t[#t].flags = _t
if #Offset ~= 1 then
for i = 2, #Offset do
local S = gg.getValues(t)
t = {}
for _ in pairs(S) do
if not ti.x64 then
S[_].value = S[_].value & 0xFFFFFFFF
end
t[#t + 1] = {}
t[#t].address = S[_].value + Offset[i]
t[#t].flags = _t
end
end
end
_S = t[#t].address
end
return _S
end
local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit))
return _A
end
----指针模块
function readPointer(name, offset, i)
local re = gg.getRangesList(name)
local x64 = gg.getTargetInfo().x64
local va = {[true] = 32, [false] = 4}
if re[i or 1] then
local addr = re[i or 1].start + offset[1]
for i = 2, #offset do
addr = gg.getValues({{address = addr, flags = va[x64]}})
if not x64 then
addr[1].value = addr[1].value & 0xFFFFFFFF
end
addr = addr[1].value + offset[i]
end
return addr
end
end
function gg.edits(addr, Table, name)
local Table1 = {{}, {}}
for k, v in ipairs(Table) do
local value = {address = addr + v[3], value = v[1], flags = v[2], freeze = v[4]}
if v[4] then
Table1[2][#Table1[2] + 1] = value
else
Table1[1][#Table1[1] + 1] = value
end
end
gg.addListItems(Table1[2])
gg.setValues(Table1[1])
gg.toast((name or "") .. "开启成功, 共修改" .. #Table .. "个值")
end
----搜索且冻结模块
function Searssjc(FUNCTIONADD,VALUE,SETRANGES)
local SOMOD=gg.getRangesList("il2cpp.so")
if SOMOD[2]==nil then gg.toast("开启失败") else
gg.setRanges(SETRANGES)
gg.searchNumber(FUNCTIONADD, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
gg.searchNumber(FUNCTIONADD, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)
local jg=gg.getResults(100)
local sl=gg.getResultCount()
for i=1, sl do
dzy=jg[i].address
gg.clearResults()
gg.addListItems({[1]={address=dzy,flags=gg.TYPE_DWORD,freeze=true,value=VALUE}})
end
gg.toast("开启成功")
end
end
----秒开SO模块
YX={}
function YX.SOMODMK(Name,Address,Modify)
if Address==nil then
gg.alert("开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存模块\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━")
else
time=os.clock()
local address=0
for index,offset in ipairs(Address)do
if index==1 then
address=offset
else
address=gg.getValues({{address=address+offset,flags=4}})[1].value
end
end
local Value,Freeze={},{}
for index,value in ipairs(Modify)do
local VALUE={address=address+value[3],flags=value[2],value=value[1],freeze=true}
if value[4]then
Freeze[#Freeze+1]=VALUE
else
Value[#Value+1]=VALUE
end
end
gg.setValues(Value)
gg.addListItems(Freeze)
Comodifiedvalues=#Freeze+#Value
local time=string.sub(os.clock()-time,0,5)
gg.toast(Name..'️开启成功\n当前进程名称:'..gg.getTargetInfo().label..'\n当前进程包名:'..gg.getTargetPackage()..'\n共修改'..Comodifiedvalues..'个值\n总共耗时:'..time..'秒')
gg.toast(Name..'️开启成功\n当前进程名称:'..gg.getTargetInfo().label..'\n当前进程包名:'..gg.getTargetPackage()..'\n总共耗时:'..time..'秒')
end
end
----秒开基址模块
function YX_MkPointer(SONC,NCFW,PYL,TYPE,VALUE,NAME,DJ)
local Somod=gg.getRangesList(SONC)[1]
if Somod==nil then
gg.alert(NAME..'开启失败\n━━━━━━━━━━━━━━━\n错误原因:未找到相关内存\n解决方法:请重新选择游戏进程\n━━━━━━━━━━━━━━━')
else
function S_Pointer(t_So, t_Offset, _bit)
local function getRanges()
local ranges = {}
local t = gg.getRangesList('^/data/*.so*$')
for i, v in pairs(t) do
if v.type:sub(2, 2) == 'w' then
table.insert(ranges, v)
end
end
return ranges
end
local function Get_Address(N_So, Offset, ti_bit)
local ti = gg.getTargetInfo()
local S_list = getRanges()
local t = {}
local _t
local _S = nil
if ti_bit then
_t = 32
else
_t = 4
end
for i in pairs(S_list) do
local _N = S_list[i].internalName:gsub('^.*/', '')
if N_So[1] == _N and N_So[2] == S_list[i].state then
_S = S_list[i]
break
end
end
if _S then
t[#t + 1] = {}
t[#t].address = _S.start + Offset[1]
t[#t].flags = _t
if #Offset ~= 1 then
for i = 2, #Offset do
local S = gg.getValues(t)
t = {}
for _ in pairs(S) do
if not ti.x64 then
S[_].value = S[_].value & 0xFFFFFFFF
end
t[#t + 1] = {}
t[#t].address = S[_].value + Offset[i]
t[#t].flags = _t
end
end
end
_S = t[#t].address
end
return _S
end
local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit))
return _A
end
time=os.clock()
local DZT = S_Pointer({SONC, NCFW},{0x0})
local PY_offsets = PYL
for _,YX in pairs(PY_offsets) do
gg.addListItems({{address = DZT+YX, flags = TYPE, value = VALUE, freeze = DJ}})
end
local time=string.sub(os.clock()-time,0,5)
gg.toast(NAME..'️开启成功\n当前进程名称:'..gg.getTargetInfo().label..'\n当前进程包名:'..gg.getTargetPackage()..'\n总共耗时:'..time..'秒')
end
end
Q弹动画速度=450
gg.alert('欢迎使用CG开启时间有点慢请稍等')
local answer = gg.alert('你要的模板颜色', '灰色', '橙色', '紫色') -- 假设这是选择对话框
if answer == 1 then
控件颜色="#808080"
插件颜色=0xffdA9B7C6
Q版小人="Q版小人1"
大图标="Q版小人1"
开关控件="开关控件3"
模板颜色="灰色"
gg.alert("您选择了灰色模板")
elseif answer == 2 then
控件颜色="#EF8A5C"
插件颜色=0xffEF8A5C
Q版小人="Q版小人2"
大图标="Q版小人2"
开关控件="开关控件1"
模板颜色="橙色"
gg.alert("您选择了橙色模板")
else
控件颜色="#846DCA"
插件颜色=0xff846DCA
Q版小人="Q版小人3"
大图标="Q版小人3"
开关控件="开关控件2"
模板颜色="紫色"
gg.alert("您选择了紫色模板")
end
wenan = {
"看不见的伤疤最疼 流不出的泪最崩溃",
"什么都在涨价 只有人心越来越廉价",
"男儿志在四方 心中有苦不声张.",
"能把青春困在遗憾里 要永远自由潇洒.",
"遇见的都是天意 拥有的都是幸运",
"去拥抱陌生,期待惊喜,所有的不期而遇都在路上",
"后来玫瑰泛滥成灾,街道布满了廉价的爱",
"树高千尺不忘根 人若辉煌莫忘本",
"生活不止眼前的苟且,还有诗和远方",
"星光不问赶路人,时光不负有心人",
"愿你出走半生,归来仍是少年",
"人生没有白走的路,每一步都算数",
"愿你有盔甲也有软肋,善良得有锋芒",
"你若盛开,清风自来",
"生活就像海洋,只有意志坚强的人,才能到达彼岸",
"不要等待机会,而要创造机会",
"命运负责洗牌,但是玩牌的是我们自己",
"你若光明,这世界就不会黑暗",
"愿你走出半生,归来仍是少年",
"不乱于心,不困于情,不畏将来,不念过往",
"你若安好,便是晴天",
"时光会回答成长,成长会回答梦想。",
"愿你我在岁月里不被辜负,不畏将来,不念过往。",
"生活不止眼前的苟且,还有诗和远方。",
"你是我一生最爱的宝物。",
"愿你有盔甲也有软肋,善良得有锋芒。",
"你若盛开,清风自来。",
"生活就像海洋,只有意志坚强的人,才能到达彼岸。",
"不要等待机会,而要创造机会。",
"命运负责洗牌,但是玩牌的是我们自己。",
"你若光明,这世界就不会黑暗。",
"愿你走出半生,归来仍是少年。",
"不乱于心,不困于情,不畏将来,不念过往。",
"你若安好,便是晴天。",
"星光不问赶路人,时光不负有心人。",
"树高千尺不忘根,人若辉煌莫忘本。",
"生活不止眼前的苟且,还有诗和远方。",
"你能翻山越岭,只为与我相见。",
"你是我一生最爱的宝物。"
}
index = math.random(1, #wenan)
gg.alert('每日文案今天的是: '..wenan[index])
if tonumber(device.width)==nil then
dwidth=1340
dheight=2300
else
dwidth=device.width
dheight=device.height
end
vibra = context:getSystemService(Context.VIBRATOR_SERVICE)
changan = {}
colorvs={}
local changan = changan
local android = import('android.*')
write=file.write
function panduan(rec) fille,err = io.open(rec) if fille == nil then return false else return true end end
read=file.read
function getRes(x)
return 获取图片("/sdcard/iosPro/图片/"..x)
end
function 获取图片(txt)
ntxt=string.sub(string.gsub(txt,"/","."),-10,-1)
if string.find(tostring(txt),"http")~=nil then
if panduan("/sdcard/iosPro/图片/"..ntxt)==false then
download(txt,"/sdcard/iosPro/图片/"..ntxt)
end
txt="/sdcard/iosPro/图片/"..ntxt
end
return luajava.getBitmapDrawable(txt)
end
ckimg = {
"Q版小人1",
"Q版小人2",
"Q版小人3",
"blackx",
"软糖.ttf",
}
links = {
"https://postimage.me/images/2024/09/04/xiaomai1.png",
"https://postimage.me/images/2024/09/04/xiaomai2.png",
"https://postimage.me/images/2024/09/04/xiaomai3.png",
"https://postimage.me/images/2024/09/04/retouch_2024090407071361.png",
"https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1729603136617/%E8%BD%AF%E7%B3%96.ttf",
}
for i, filename in ipairs(ckimg) do
if panduan("/sdcard/iosPro/图片/"..filename) ~= true then
local downloadUrl = links[i] -- 获取对应的下载链接
local savePath = "/sdcard/iosPro/图片/"..filename -- 保存路径
gg.toast("正在下载: " .. filename) -- 显示正在下载的文件名
download(downloadUrl, savePath) -- 执行下载操作
end
end
if not io.open ( "/storage/emulated/0/卡片.zip" ) then
local f = io.open ( "/storage/emulated/0/卡片.zip" , 'a' )
f : write ( gg.makeRequest ( 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1730896983736/opo.zip' ).content )---下载zip资源
end
file.mkdir("/storage/emulated/0/iosPro")----创文件夹
file.mkdir("/storage/emulated/0/iosPro/图片")
file.mkdir("/storage/emulated/0/iosPro/图片")
unzip("/storage/emulated/0/卡片.zip","/storage/emulated/0/iosPro/图片/")---解压
context = app.context
window = context:getSystemService("window") -- 获取窗口管理器
function getLayoutParams()
LayoutParams = WindowManager.LayoutParams
layoutParams = luajava.new(LayoutParams)
if (Build.VERSION.SDK_INT >= 26) then -- 设置悬浮窗方式
layoutParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY
else
layoutParams.type = LayoutParams.TYPE_PHONE
end
layoutParams.format = PixelFormat.RGBA_8888 -- 设置背景
layoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE -- 焦点设置Finish
layoutParams.gravity = Gravity.TOP|Gravity.LEFT -- 重力设置
layoutParams.width = LayoutParams.WRAP_CONTENT -- 布局宽度
layoutParams.height = LayoutParams.WRAP_CONTENT -- 布局高度
return layoutParams
end
local typeface=import("android.graphics.Typeface")
local FontPath="/storage/emulated/0/iosPro/图片/软糖.ttf"--字体路径
local font=typeface:createFromFile(FontPath)
--字体
function getCorner(gtvb1,gtvb3,gtvb4,gtvb5,g1,g2,g3,g4)
if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end
local jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(gtvb3)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors(gtvb1)
jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色
jianbians:setCornerRadii({g1,g1,g2,g2,g3,g3,g4,g4})
return jianbians
end
function getVerticalBG(gtvb1,gtvb3,gtvb4,gtvb5)
if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end
local jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(gtvb3)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors(gtvb1)
jianbians:setStroke(gtvb4,gtvb5)
return jianbians
end
function newbg2(gtvb1,gtvb3,gtvb4,gtvb5)
if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end
local jianbians = luajava.loadlayout({
GradientDrawable,
color = {gtvb1},
cornerRadius=gtvb3,
gradientType = GradientDrawable.LINEAR_GRADIENT,
orientation = GradientDrawable.Orientation.TOP_BOTTOM ,
strokeWidth = 10,
strokeColor = gtvb5
})
return jianbians
end
function searchmenu()
luajava.runUiThread (function ()
local searchUI = luajava.getIdValue("tosearch")
if tonumber(tostring(searchUI: getVisibility ())) == 8.0 then
searchUI:setVisibility(View.VISIBLE)
ggscro:setVisibility(View.GONE)
else
searchUI:setVisibility(View.GONE)
ggscro:setVisibility(View.VISIBLE)
end
end)
end
function searchStart()
luajava.runUiThread(function()
local toSearch=tostring(luajava.getIdValue("tosearch"):getText())
if toSearch~="" and toSearch~=nil then
searchInSview(toSearch)
searchmenu()
--searchInTz(toSearch)
else
searchmenu()
end
end)
end
function searchInSview(besearch)
changan.setedit("tosearch","")
if besearch=="退出" then
adtext("
确定要退出?请输入“确认退出”","#C5053C")
luajava.newThread(function()
gg.sleep(200)
luajava.post(function()
ggscro:fullScroll(View.FOCUS_DOWN)
end)
end):start()
return 0
end
if besearch=="确认退出" then
tuichu=1
return 0
end
local tobesearch=besearch
local result={} --print(forsview)
for i=1,#forsview do
for k=1,#forsview[i] do
if type(forsview[i][k])=="table" then
if forsview[i][k].name~=nil then
if string.find(forsview[i][k].name,tobesearch)~=nil then
result[#result+1]={i,k}
end
if forsview[i][k].type=="BOX" or forsview[i][k].type=="BOX2" then
--print(forsview[i][k])
for key,v in pairs(forsview[i][k].vs) do
if v.name~=nil then
if string.find(v.name,tobesearch)~=nil then
result[#result+1]={i,k,key}
end
if v.type=="BOX" or v.type=="BOX2" then
--print(forsview[i][k])
for kk,vv in pairs(v.vs) do
if vv.name~=nil then
if string.find(vv.name,tobesearch)~=nil then
result[#result+1]={i,k,kk,vv}
end
end
end
end
end
end
end
end
end
end
end
if #result>=1990 then
adtext("关于“"..besearch.."”的功能超过10个!请输入更详细的关键词.","#262626")
elseif #result==0 then
adtext("
未搜索到包含“"..besearch.."”的功能","#262626")
else
adtext("
你是否在找:","#191B26")
for i=1,#result do
if #result[i]==2 then
adtext("第"..result[i][1].."页的“"..forsview[result[i][1]][result[i][2]].name.."”".."("..forsview[result[i][1]][result[i][2]].type..")","#262626")
elseif #result[i]==3 then
adtext("第"..result[i][1].."页的BOX:“"..forsview[result[i][1]][result[i][2]].name.."”".."中第"..result[i][3].."项:"..forsview[result[i][1]][result[i][2]].vs[result[i][3]].name.."("..forsview[result[i][1]][result[i][2]].vs[result[i][3]].type..")","#262626")
elseif #result[i]==4 then
--print(result[i])
--print(forsview[result[i][1]][result[i][2]].vs[1].vs[result[i][3]])
adtext("第"..result[i][1]..
"页的BOX:“"
..forsview[result[i][1]][result[i][2]].name..
"”".."中第"..result[i][3]..
"项:"
..result[i][4].name
.."("..result[i][4].type..")","#262626")
end
end
切换(result[1][1])
end
luajava.newThread(function()
gg.sleep(200)
luajava.post(function()
ggscro:fullScroll(View.FOCUS_DOWN)
end)
end):start()
end
function uiadtext(txt,color,size)
if not txt then txt = "" end
if not color then color = "#ffffff" end
if not size then size = "13sp" end
local tmp=luajava.loadlayout(
{
TextView,
Typeface=font,
text = string.fromHtml(" "..getTimeStamp(os.time()).." "..txt..""),
textSize = size,
Typeface=font,
--textColor = color,
gravity="left",
layout_width = "wrap_content",
})
luajava.runUiThread(function()
local searchUI = luajava.getIdValue("tosearch")
if tonumber(tostring(searchUI: getVisibility ())) == 8.0 then
else
searchUI:setVisibility(View.GONE)
ggscro:setVisibility(View.VISIBLE)
end
YoYoImpl:with("FadeOut"):duration(200):playOn(gggscro)
end)
gg.sleep(200)
luajava.post(function()
gggscro:addView(tmp)
end)
luajava.runUiThread(function()
YoYoImpl:with("FadeIn"):duration(300):playOn(gggscro)
end)
luajava.newThread(function()
gg.sleep(200)
luajava.post(function()
ggscro:fullScroll(View.FOCUS_DOWN)
end)
end):start()
end
function adtext(txt,color,size)
if not txt then txt = "" end
if not color then color = "#ffffff" end
if not size then size = "10sp" end
local tmp=luajava.loadlayout(
{
TextView,
Typeface=font,
text = string.fromHtml(" "..txt..""),
textSize = size,
--textColor = color,
gravity="left",
layout_width = "wrap_content",
})
luajava.post(function()
gggscro:addView(tmp)
end)
end
function newbg(gtvb1,gtvb3,gtvb4,gtvb5)
if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end
local jianbians = luajava.loadlayout({
GradientDrawable,
color = {gtvb1},
cornerRadius=45,
gradientType = GradientDrawable.LINEAR_GRADIENT,
orientation = GradientDrawable.Orientation.TOP_BOTTOM ,
strokeWidth = 10,
strokeColor = gtvb5
})
return jianbians
end
function getj6()
jianbian6 = luajava.new(GradientDrawable)
jianbian6:setCornerRadius(20)
jianbian6:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbian6:setColors({0xffffffff,0xffffffff})
jianbian6:setStroke(0,"0xdd000000")--边框宽度和颜色
return jianbian6
end
hanshu = function(v, event)
local Action = event:getAction()
if Action == MotionEvent.ACTION_DOWN then
isMove = false
RawX = event:getRawX()
RawY = event:getRawY()
x = mainLayoutParams.x
y = mainLayoutParams.y
elseif Action == MotionEvent.ACTION_MOVE then
isMove = true
mainLayoutParams.x = tonumber(x) + (event:getRawX() - RawX)
mainLayoutParams.y = tonumber(y) + (event:getRawY() - RawY)
window:updateViewLayout(floatWindow, mainLayoutParams)
end
end
slctb1 = luajava.loadlayout({
GradientDrawable,
color = "#661E1C27",
cornerRadius = 20
})
function topSelect()
local selector = luajava.getStateListDrawable()
selector:addState({
android.R.attr.state_pressed
}, getVerticalBG({0x22161616,0x22161616},30))
selector:addState({
-android.R.attr.state_pressed
}, empty)
return selector
end
slcta1 = luajava.loadlayout({
GradientDrawable,
color = "#331E1C27",
cornerRadius = 20
})
function getSelector3()
return getButtonBG()
end
slctb = luajava.loadlayout({
GradientDrawable,
color = "#001E1C27",
cornerRadius = 0
})
slcta = luajava.loadlayout({
GradientDrawable,
color = 插件颜色,
cornerRadius = 4
})
slctc = luajava.loadlayout {
GradientDrawable,
color = "#ffffffff",
cornerRadius = 16
}
slctd = luajava.loadlayout {
GradientDrawable,
color = "#ddE0E0E0",
cornerRadius = 16
}
slcte = luajava.loadlayout {
GradientDrawable,
color = "#11ffffff",
cornerRadius = 12
}
slctf = luajava.loadlayout {
GradientDrawable,
color = "#aa1E1C27",
cornerRadius = 12
}
changan.controlFlip = function(control,time)
luajava.runUiThread(function()
import "android.view.animation.Animation"
import "android.animation.ObjectAnimator"
xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotationY", {0, 361})
xuanzhuandonghua:setRepeatCount(0)
xuanzhuandonghua:setRepeatMode(Animation.REVERSE)
xuanzhuandonghua:setDuration(time)
xuanzhuandonghua:start()
end) end
changan.controlSmall = function(control,time)
luajava.runUiThread(function()
import "android.animation.ObjectAnimator"
ObjectAnimator():ofFloat(control,"scaleX", {
1, 0.7, 0.4, 0
}):setDuration(time):start()
ObjectAnimator():ofFloat(control,"scaleY", {
1, 0.7, 0.4, 0
}):setDuration(time):start()
end) end
OP={ }
OP.controlWater = function(control,time)
luajava.runUiThread(function()
import "android.animation.ObjectAnimator"
ObjectAnimator():ofFloat(control,"scaleX",{1, 0.8, 0.9, 1}):setDuration(time):start()
ObjectAnimator():ofFloat(control,"scaleY",{1,0.8,0.9,1}):setDuration(time):start()
end) end
OP.controlWater2 = function(control,time)
luajava.runUiThread (function()
import "android.animation.ObjectAnimator"
ObjectAnimator():ofFloat (control , "scaleX" ,{1,1.1,0.9,1}) : setDuration (time):start()
ObjectAnimator():ofFloat (control , "scaleY" , {1,0.9,1.1,1}) : setDuration (time):start()
end) end
function getSelector()
selector = luajava.getStateListDrawable()
selector:addState({
android.R.attr.state_pressed
}, slcta) -- 点击时候的背景
selector:addState({
-android.R.attr.state_pressed
}, slctb) -- 没点击的背景
return selector
end
function getSelector2()
selector = luajava.getStateListDrawable()
selector:addState({
android.R.attr.state_pressed
}, slctd) -- 点击时候的背景
selector:addState({
-android.R.attr.state_pressed
}, slctc) -- 没点击的背景
return selector
end
jianbian = luajava.new(GradientDrawable)
jianbian:setCornerRadius(30)
jianbian:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbian2 = luajava.new(GradientDrawable)
jianbian2:setCornerRadius(30)
jianbian2:setGradientType(GradientDrawable.LINEAR_GRADIENT)
local isswitch
YoYoImpl = luajava.getYoYoImpl()
changan.menu = function(sview)
forsview = sview
if isswitch then
return false
end
for i=1,#stab do
_ENV["jmb"..i]=getSelector()
end
isswitch = true
cebian = {
LinearLayout,
id = "侧边",
gravity = "center",
padding={"8dp","3dp","8dp","3dp"},
layout_height = "wrap_content",
layout_width = "match_parent",
}
gund = {
LinearLayout,
background=getblue(),
gravity = "center",
orientation = "horizontal",
layout_height = "wrap_content",
layout_width = "wrap_content",
}
for i = 1,#stab do
_ENV["jm"..i]=luajava.loadlayout({
LinearLayout,
id = "jm"..i,
layout_height = "28dp",
layout_width = "68dp",
gravity = "center",
layout_marginTop = "2dp",
layout_marginBottom = "2dp",
background = _ENV["jmb"..i],
onClick=function()
changan.controlFlip(_ENV["jm"..i],500)
gg.playMusic("/storage/emulated/0/iosPro/图片/切换音效.mp3")
--OP.controlWater(floatWindow,Q弹动画速度)
OP.controlWater2(floatWindow,Q弹动画速度)
切换(i) end,
{
TextView,
Typeface=font,
id="jm"..i.."t",
gravity = "center",
textColor=控件颜色,
text = stab[i],
--onClick = function() 切换(i) end
}})
gund[#gund+1] = _ENV["jm"..i]
if i< #stab then
gund[#gund+1] = luajava.loadlayout({
LinearLayout,
layout_height="match_parent",
layout_width="1.3dp",
background=控件颜色
})
end
end
cebian[#cebian+1] = {
HorizontalScrollView,
gravity = "center",
fillViewport = "true",
layout_height = "wrap_content",
layout_width = "wrap_content",
gund,
}
cebian = luajava.loadlayout(cebian)
for i = 1,#stab do
local tmp={
LinearLayout,
--background = getj6(),
id = "layoutm"..i,
gravity = "top",
layout_width = "250dp",
orientation = "vertical",
gravity = "center_horizontal",
}
for k = 1,#sview[i] do
if type(sview[i][k]) == "userdata" then
tmp[#tmp+1] = sview[i][k]
else
tmp[#tmp+1] = sview[i][k]["view"]
end
end
_ENV["layout"..i] = luajava.loadlayout(
{
ScrollView,
--background = getj6(),
fillViewport = true,
padding = "3dp",
id = "layout"..i,
visibility = "gone",
padding={"8dp","3dp","8dp","10dp"},
layout_width = "wrap_content",
layout_height = "match",
orientation = "vertical",
{FrameLayout,
{LinearLayout,
layout_height="250dp",
},
tmp},
})
end
changan.controlWater = function(control,time)
luajava.runUiThread(function()
import "android.animation.ObjectAnimator"
ObjectAnimator():ofFloat(control,"scaleX", {
1, 0.8, 0.9, 1
}):setDuration(time):start()
ObjectAnimator():ofFloat(control,"scaleY", {
1,0.8,0.9,1
}):setDuration(time):start()
end) end
gggscro=luajava.loadlayout({LinearLayout,
id="gggscro",
layout_width = "match_parent",
orientation="vertical",
padding="1dp",
layout_marginRight="50dp",
})
xiaomai=luajava.loadlayout({ImageView,
layout_height = "40dp",
layout_width = "40dp",
layout_marginTop="0dp",
layout_marginLeft="0dp",
padding="7dp",
src=getRes(Q版小人),
onClick=function() searchStart() changan.controlWater(xiaomai,200) vibra:vibrate(10) end,
onTouch=hanshu,
background = getVerticalBG({
0x22262626,0x22262626
},360,5,0x33ffffff),
})
ckou = {
LinearLayout,
id = "chuangk",
visibility = "gone",
layout_width = "wrap_content",
layout_height = "wrap_content",
orientation = "vertical",
{
LinearLayout,
layout_width="match_parent",
layout_height="35dp",
background=getCorner({0xffffffff,0xffffffff},15,0,0xff232323,45,45,0,0),
{LinearLayout,
layout_width="35dp",
layout_height="match_parent",
gravity="center",
{LinearLayout,
gravity="center",
background=getVerticalBG({0xffE6E6E6,0xffE6E6E6},90),
layout_width = "20dp",
layout_height = "20dp",
layout_marginLeft = "5dp",
onClick = 隐藏,
onTouch = hanshu,
{LinearLayout,
layout_height="2dp",
layout_width="10dp",
background=getVerticalBG({0xff2c2c2c,0xff2c2c2c},45),
}
}
},
{LinearLayout,
layout_width="35dp",
layout_height="match_parent",
gravity="center",
},
{LinearLayout,
layout_width="fill_parent",
layout_weight=1,
layout_height="match_parent",
gravity="center",
{LinearLayout,
layout_height="match_parent",
layout_width="80dp",
background=topSelect(),
onClick=function() end,
gravity="center",
onTouch=hanshu,
{LinearLayout,
layout_height="5dp",
layout_width="60dp",
background=getVerticalBG({插件颜色,插件颜色},20)
}
}
},
{LinearLayout,
layout_width="35dp",
layout_height="match_parent",
gravity="center",
},
{LinearLayout,
layout_width="35dp",
layout_height="match_parent",
gravity="center",
{
ImageView,
padding = "5dp",
src = getRes("xmtg"),
background=getVerticalBG({0xffE6E6E6,0xffE6E6E6},90),
layout_width = "20dp",
layout_height = "20dp",
layout_marginRight = "5dp",
onClick = 隐藏,
onTouch = hanshu,
}
}
},
{LinearLayout,
layout_height="wrap_content",
layout_width="match_parent",
padding="4dp",
{FrameLayout,
layout_marginTop = "4dp" ,
layout_marginBottom = "4dp" ,
layout_marginLeft="4dp",
layout_marginRight="4dp",
layout_height="50dp",
layout_width="match_parent",
elevation="3dp",
padding="2dp",
background=newbg2(插件颜色,25),
{LinearLayout,
gravity="center_vertical",
layout_height="match_parent",
layout_width = "match_parent",
{
ScrollView,
id="ggscro",
visibility="gone",
layout_weight=1,
layout_gravity="center",
layout_height = "match_parent",
layout_width = "match_parent",
gggscro
},
{
EditText,
visibility="visible",
layout_weight=1,
layout_marginTop="0dp",
id=luajava.newId("tosearch"),
orientation = "vertical",
layout_width = "match_parent",
layout_height="match_parent",
hint = "请输入需要搜索的功能关键词",
textColor = "#ffffff",
gravity = "center",
layout_marginLeft="0dp",
textSize = "12sp",
background = getVerticalBG({
0x00262626,0x00262626
},15,5,0x00ffffff),
},
xiaomai}
}
},
cebian,
}
for i = 1,#stab do
ckou[#ckou+1] = _ENV["layout"..i]
end
--luajava.newThread(function() develo(ckou) end):start()
ckou = luajava.loadlayout(ckou)
title = luajava.loadlayout({
TextView,
Typeface=font,
id = "title",
visibility = "gone",
text = stitle,
background="#80FF00",
textColor="#000000",
gravity = "center",
textSize = "19sp",
layout_marginTop = "20dp",
layout_width = "280dp",
})
xfcpic=获取图片(xfcpic)
floatWindow = {
LinearLayout,
id = "motion",
elevation="4dp",
orientation="vertical",
{FrameLayout,
layout_width="wrap_content",
{LinearLayout,
gravity = "center",
{ImageView,
id = "control",
background = xfcpic,
layout_width = "40dp",
layout_height = "40dp",
}
},
{
ImageView,
id = "exit",
layout_gravity="right",
visibility="gone",
background = "https://postimage.me/images/2024/09/04/retouch_2024090407071361.png",
layout_width = "20dp",
layout_height = "20dp",
layout_marginTop = "10dp",
layout_marginRight = "20dp",
}},
ckou
}
local function invoke()
local ok
local RawX, RawY, x, y
mainLayoutParams = getLayoutParams()
mainLayoutParams.x = 100
mainLayoutParams.y = dheight/4
floatWindow = luajava.loadlayout(floatWindow)
local function invoke2()
block('start')
window:addView(floatWindow, mainLayoutParams)
block('end')
end
local runnable = luajava.getRunnable(invoke2)
local handler = luajava.getHandler()
handler:post(runnable)
block('join')
control.onClick = 隐藏
exit.onClick = 隐藏
local isMove
motion.onTouch = hanshu
control.onTouch = hanshu
exit.onTouch = hanshu
end
invoke(swib1,swib2)
gg.setVisible(false)
luajava.setFloatingWindowHide(true)
切换(1)
import("android.media.AudioManager")
audi = context:getSystemService("audio")
audiotype = {
AudioManager.STREAM_ALARM, --手机闹铃的声音
AudioManager.STREAM_MUSIC, --手机音乐的声音
AudioManager.STREAM_NOTIFICATION, --系统提示的通知
AudioManager.STREAM_RING, --电话铃声的声音
AudioManager.STREAM_SYSTEM, --手机系统的声音
AudioManager.STREAM_VOICE_CALL, --语音电话的声音
AudioManager.STREAM_DTMF, --DTMF音调的声音
--AudioManager.STREAM_BLUETOOTH_SCO,
}
yinl = {}
for i = 1,#audiotype do
yinl[i] = {}
yinl[i].type = audiotype[i]
yinl[i].min = audi:getStreamMinVolume(audiotype[i])
yinl[i].max = audi:getStreamMaxVolume(audiotype[i])
yinl[i].now = audi:getStreamVolume(audiotype[i])
end
yltype = 0
function jianting3(func)
yinln = {}
for i = 1,#audiotype do
yinln[i] = {}
yinln[i].type = audiotype[i]
yinln[i].now = audi:getStreamVolume(audiotype[i])
if yinln[i].now > yinl[i].now then
yinl[i].now = yinln[i].now
if yltype == 1 then
yltype = 0
func()
end
elseif yinln[i].now < yinl[i].now then
yinl[i].now = yinln[i].now
if yltype == 0 then
yltype = 1
func()
end
end
end
end
qhkai = 0
qiehuan = function()
if qhkai == 0 then
qhkai = 1
draw.remove()
luajava.runUiThread(function()
changan.controlSmall(floatWindow,400)
end)
gg.sleep(400)
luajava.runUiThread(function()
floatWindow:setVisibility(View.GONE)
end)
else
qhkai = 0
huiz()
luajava.runUiThread(function() floatWindow:setVisibility(View.VISIBLE) end)
luajava.runUiThread(function()
changan.controlBig(floatWindow,400)
end)
end
end
huiz()
while true do
if tuichu == 1 then break end
jianting3(qiehuan)
gg.sleep(300)
end
luajava.setFloatingWindowHide(false)
end
function changan.line()
rest = luajava.loadlayout({LinearLayout,
layout_width = 'fill_parent',
{
LinearLayout,
layout_width = 'fill_parent',
layout_height = "1dp",
background = "#88C2CAD7",
layout_marginLeft="20dp",
layout_marginRight="20dp"
}})
return rest
end
function changan.line2()
rest = luajava.loadlayout({
LinearLayout,
layout_width = '180dp',
layout_height = "5dp",
layout_marginLeft="35dp",
background = "#0087FF",
layout_marginTop="10dp",
})
return rest
end
function getblue()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(6)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0xffffffff,0xffffffff})
jianbians:setStroke(4,插件颜色)--边框宽度和颜色
return jianbians
end
function getShape3()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(10)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0xffffffff,0xffffffff})
jianbians:setStroke(4,"0x77000000")--边框宽度和颜色
return jianbians
end
function getShape5()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(4)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0xffffffff,插件颜色})
jianbians:setOrientation(GradientDrawable.Orientation.TL_BR)
jianbians:setStroke(2,"0x77000000")--边框宽度和颜色
return jianbians
end
function getShape()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(90)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0xff49C263,0xff49C263})
jianbians:setStroke(0,"0xffffffff")--边框宽度和颜色
return jianbians
end
function getShape2()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(10)
jianbians:setShape(GradientDrawable.RECTANGLE)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0xffffffff,0xffffffff})
jianbians:setStroke(8,"0xff000000")--边框宽度和颜色
return jianbians
end
corbk = true
当前ui = 1
显示 = 0
beij = newbg(0xffeeeeee,nil)
--beijw
beij2 = luajava.loadlayout({
GradientDrawable,
color = "#001E1C27",
cornerRadius = 10
})
changan.controlRotation9 = function(control, time,t)
luajava.runUiThread(function()
import "android.view.animation.Animation"
import "android.animation.ObjectAnimator"
xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotation", {
time,t
})
xuanzhuandonghua:setRepeatCount(0)
xuanzhuandonghua:setRepeatMode(Animation.RESTART)
xuanzhuandonghua:setDuration(4)
xuanzhuandonghua:start()
end)
end
function visi (tid , ttid)
vibra:vibrate(4)
local tview = luajava.getIdValue (tid)
local ttview = luajava.getIdValue (ttid)
if not tview then
return 0
end
if tonumber (tostring (tview : getVisibility ())) == 8.0 then
tview : setVisibility (View.VISIBLE)
YoYoImpl:with("FadeIn"):duration(200):playOn(boxes[tid])
changan.controlRotation9(boxpic[tid],90,-90)
else
tview : setVisibility (View.GONE)
changan.controlRotation9(boxpic[tid],-90,90)
end
end
boxes = {} boxpic = {}
function changan.box2 (views)
local tid = "box"..guid ()
boxpic[tid] = luajava.loadlayout {
ImageView ,
src = getRes("opoback"),
layout_width = "24dp" ,
layout_height = "24dp" ,
}
local ttid = tid.."6"
local t1id = guid ()
firadio = {
LinearLayout ,
layout_width = 'fill_parent' ,
layout_height = "wrap_content" ,
layout_marginTop = "2dp" ,
layout_marginBottom = "2dp" ,
orientation = "vertical" ,
}
if type (views [1]) == "string" or type (views [1]) == "number" then
firadio [# firadio + 1] = {
LinearLayout ,
layout_width = 'fill_parent' ,
layout_height = "40dp" ,
gravity = "center_vertical" ,
layout_marginTop = "4dp" ,
layout_marginBottom = "4dp" ,
layout_marginLeft="4dp",
layout_marginRight="4dp",
onClick = function ()
gg.playMusic("/storage/emulated/0/iosPro/图片/box2音效.mp3")
visi (tid , ttid)
end
,
background = getButtonBG(),
elevation="2dp",
{
TextView , text = views [1] ,
Typeface=font,
textSize = "13sp" ,
layout_marginLeft = "15dp" ,
layout_width = "match_parent" ,
layout_weight=1,
textColor = "#000000" ,
gravity = "left" ,
},{
LinearLayout ,
padding={"0dp","0dp","10dp","0dp"},
layout_width = "30dp" ,
layout_height = "30dp" ,
gravity = "center",
boxpic[tid],
}
} else
gg.alert ("changan.box的table内第一个元素必须是string") os.exit ()
end
radios = {
LinearLayout ,
layout_marginLeft = "0dp" ,
layout_marginRight = "0dp" ,
orientation = "vertical" ,
visibility = "gone" ,
id = luajava.newId (tid) ,
padding = "0dp" ,
layout_width = 'fill_parent' ,
}
local vs={}
for i = 2,#views do
if type(views[i]) == "userdata" then
radios[#radios+1] = views[i]
else
radios[#radios+1] = views[i].view
vs[#vs+1]=views[i]
end
end
boxes[tid] = luajava.loadlayout(radios)
firadio [# firadio + 1] = boxes[tid]
_ENV [t1id] = luajava.loadlayout (firadio)
return {["view"] = _ENV[t1id],
["name"] = views[1],
["type"] = "BOX2",
["vs"]=vs
}
end
function getButtonBG()
local selector = luajava.getStateListDrawable()
selector:addState({
android.R.attr.state_pressed
}, getVerticalBG({0x55d7d7d7,0x55d7d7d7},35))
selector:addState({
-android.R.attr.state_pressed
}, newbg(0xffffffff,35))
return selector
end
function changan.box(views)
local tid = "box"..guid()
local ttid = tid.."6"
firadio = {
LinearLayout,
gravity = "center",
layout_width = 'fill_parent',
layout_height = "wrap_content",
orientation = "vertical",
}
if type(views[1]) == "string" or type(views[1]) == "number" then
if views[1]~="" then tsiz="14sp" else tsiz="0sp"end
firadio[#firadio+1] = {
LinearLayout,
layout_height = "wrap_content",
layout_width = "fill_parent",
{
TextView,
Typeface=font,
text = views[1],
textSize = tsiz,
layout_width = "match_parent",
textColor = "#000000",
gravity = "center",
}} else
end
radios = {
LinearLayout,
layout_marginLeft = "4dp",
layout_marginRight = "4dp",
layout_marginTop="4dp",
layout_marginBottom="4dp",
orientation = "vertical",
padding = "0dp",
elevation="2dp",
background = getButtonBG(),
layout_width = 'fill_parent',
}
local vs={}
for i = 2,#views do
if type(views[i]) == "userdata" then
radios[#radios+1] = views[i]
else
radios[#radios+1] = views[i].view
vs[#vs+1]=views[i]
end
if i~=#views then
radios[#radios+1] = changan.line()
end
end
firadio[#firadio+1] = radios
if views[1]=="" then bxn="BOX" else bxn=views[1] end
return {["view"] = luajava.loadlayout(firadio),
["name"] = bxn,
["type"] = "BOX",
["vs"]=vs
}
end
当前ui = 1
function 切换(x)
当前ui = x
luajava.runUiThread(function()
for i = 1,#stab do
_ENV["jm"..i]:setBackground(_ENV["jmb"..i])
_ENV["jm"..i.."t"]:setTextColor(插件颜色)
_ENV["layout"..i]:setVisibility(View.GONE)
end
_ENV["layout"..当前ui]:setVisibility(View.VISIBLE)
_ENV["jm"..当前ui]:setBackground(slcta)
_ENV["jm"..当前ui.."t"]:setTextColor(0xffffffff)
--YoYoImpl:with("FadeIn"):duration(200):playOn(_ENV["layout"..当前ui])
end)
end
changan.controlBig = function(control,time)
luajava.runUiThread(function()
import "android.animation.ObjectAnimator"
ObjectAnimator():ofFloat(control,"scaleX", {
0, 0.4, 0.7, 1
}):setDuration(time):start()
ObjectAnimator():ofFloat(control,"scaleY", {
0, 0.4, 0.7, 1
}):setDuration(time):start()
end) end
function 隐藏()
luajava.runUiThread(function()
if tonumber(tostring(ckou:getVisibility())) == 8.0 then
control:setVisibility(View.GONE)
ckou:setVisibility(View.VISIBLE)
mainLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
window:updateViewLayout(floatWindow, mainLayoutParams)
--YoYoImpl:with("FadeIn"):duration(300):playOn(title)
_ENV["layout"..当前ui]:setVisibility(View.VISIBLE)
changan.controlBig(floatWindow,300)
floatWindow:setBackground(beij)
else
control:setVisibility(View.VISIBLE)
mainLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE
window:updateViewLayout(floatWindow, mainLayoutParams)
floatWindow:setBackground(beij2)
ckou:setVisibility(View.GONE)
YoYoImpl:with("FadeIn"):duration(200):playOn(floatWindow)
_ENV["layout"..当前ui]:setVisibility(View.GONE)
end
end)
end
function 退出UI()
window:removeView(floatWindow)
luajava.setFloatingWindowHide(false)
tuichu=1
end
function guid()
seed = {
'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
}
tb = {}
for i = 1,32 do
table.insert(tb,seed[math.random(1,16)])
end
sid = table.concat(tb)
return string.format('%s%s%s%s%s',
string.sub(sid,1,8),
string.sub(sid,10,12),
string.sub(sid,21,22))
..string.format('%s%s%s%s%s',
string.sub(sid,1,6),
string.sub(sid,21,25)
)
end
chazhi={} chajv={}
function changan.seek(name,bian,smin,smax,nows)
_ENV[bian] =nows
local thum= getVerticalBG({0xffffffff,0xffffffff},5,5,控件颜色)
thum:setSize(40, 40)
smin=tonumber(smin) smax=tonumber(smax)
chajv[bian]=smax-smin
chazhi[bian]=1-smin
if smin==nil then smin=1 smax=10 end
truesmin=1
truesmax=truesmin+chajv[bian]
if not nows then nows = smin tnows=(smin-nows)
else
tnows=(nows-smin)+1
end
if _ENV[bian] == nil then _ENV[bian] = 1.0 end
if not name then name = "未设置" end
local names = name..guid()
rest = luajava.loadlayout({
LinearLayout,
layout_width = 'fill_parent',
layout_hight = "fill_parent",
{
LinearLayout,
layout_width = 'fill_parent',
layout_hight = "fill_parent",
layout_marginTop = "5dp",
layout_marginBottom = "5dp",
gravity = "center_vertical",
background = getButtonBG(),
elevation="2dp",
layout_marginLeft = "5dp",
layout_marginRight = "5dp",
id=luajava.newId(name.."seekbg"),
{
TextView,
Typeface=font,
padding={"5dp","10dp","0dp","10dp",},
gravity = "top",
textColor="#212121",
text = name..":"..nows,
id = luajava.newId(names),
layout_width = '100dp',
--layout_marginLeft = "5dp",
textSize='13sp',
layout_marginRight = "0dp",
},
{
SeekBar,
layout_width = 'fill_parent',
layout_weight=1,
id=luajava.newId(name.."seekbar"),
min = truesmin,
max = truesmax,
progress=tnows,
maxHeight="10dp",
maxWidth="fill_parent",
minHeight="10dp",
minWidth="fill_parent",
--paddingStart="0dp",
--paddingEnd="0dp",
progressDrawable={ getVerticalBG({控件颜色,控件颜色},45)},
thumb=thum,
progressHeight="10dp",
onSeekBarChange = {
onProgressChanged = function(SeekBar, var2, var3)
if not var3 then
return
end
local resultvar=tonumber(string.sub(var2,0,-3))-chazhi[bian]
luajava.runUiThread(function()
luajava.getIdValue(names):setText(name..":".. resultvar)
end)
_ENV[bian] = resultvar
end
}}
}})
return {["view"] = rest,
["name"] = name,
["type"] = "拉条",
}
end
function getShape(tmp0,tmp1,tmp2,tmp3)
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(tmp0)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors(tmp1)
jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT)
jianbians:setStroke(4,tmp3)--边框宽度和颜色
return jianbians
end
function getShape2(tmp0,tmp1,tmp2,tmp3)
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(tmp0)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors(tmp1)
jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT)
jianbians:setStroke(8,tmp3)--边框宽度和颜色
return jianbians
end
checkbg=getShape(
45,
{0xffB8B8B8,0xffB8B8B8},
4,0xffB8B8B8)
checkbga=getShape(
45,
{插件颜色,插件颜色},
4,插件颜色)
checkbg1=getShape2(
45,
{0xffffffff,0xffffffff},
4,0xffffffff)
checkbg2=getShape2(
45,
{0xffffffff,0xffffffff},
4,0xffffffff)
function 开关3(name,func1,func2,nid)
local gnname=name
name=name..guid()
_ENV[name] = "关"
if func1 == nil then func1 = "" end
if func2 == nil then func2 = "" end
if type(func1) == "function" then
return function()
namers = _ENV[name]
if namers ~= "开" then
luajava.runUiThread(function()
luajava.getIdValue(nid.."k"):setVisibility(View.GONE)
luajava.getIdValue(nid.."g"):setVisibility(View.VISIBLE)
luajava.getIdValue(nid):setBackground(checkbga)
end)
_ENV[name] = "开"
vibra:vibrate(10)
pcall(func1)
uiadtext(gnname.." 已开启.","#ffffff")
else
luajava.runUiThread(function()
luajava.getIdValue(nid.."g"):setVisibility(View.GONE)
luajava.getIdValue(nid.."k"):setVisibility(View.VISIBLE)
luajava.getIdValue(nid):setBackground(checkbg)
end)
_ENV[name] = "关"
vibra:vibrate(10)
pcall(func2)
uiadtext(gnname.." 已关闭.","#545454")
end
end
end
end
function changan.switch(name,func1,func2,yans)
nid = name..guid()
if not yans then yans=控件颜色 end
local func = 开关3(name,func1,func2,nid)
if not name then name = "未设置" end
rest = luajava.loadlayout({
LinearLayout ,
layout_width = 'fill_parent' ,
layout_height = "36dp",
gravity = "center_vertical",
{
LinearLayout,
layout_width = 'fill_parent',
layout_height = "35dp",
gravity = "center_vertical",
{
TextView,
Typeface=font,
gravity = "top",
text = name,
textColor=yans,
textSize="16sp",
layout_width = '170dp',
layout_marginLeft = "10dp",
layout_marginRight = "10dp",
},
{
FrameLayout,
id = luajava.newId(nid),
background = checkbg,
onClick = function() luajava.newThread(function() func() end):start() end,
layout_width = '43dp',
layout_height = 'wrap_content',
padding="1dp",
{
LinearLayout,
layout_gravity="left",
id = luajava.newId(nid.."k"),
background = checkbg1,
onClick = function() luajava.newThread(function() func() end):start() end,
layout_width = '21dp',
layout_height = '21dp',
},{
LinearLayout,
visibility="gone",
layout_gravity="right",
id = luajava.newId(nid.."g"),
background = checkbg2,
onClick = function() luajava.newThread(function() func() end):start() end,
layout_width = '21dp',
layout_height = '21dp',
}
}}
})
return {["view"] = rest,
["name"] = name,
["func1"] = func1,
["func2"] = func2,
["type"] = "开关",
}
end
function changan.edit(name)
_ENV[name] = name..guid()
if not name then name = "点击输入文字" end
rest = luajava.loadlayout({
LinearLayout,
layout_width = 'fill_parent',
layout_height = "40dp",
{
FrameLayout,
layout_width = 'fill_parent',
layout_hight = "fill_parent",
gravity = "center",
--orientation="vertical",
{
EditText,
Typeface=font,
gravity = "top",
background = getShape(),
hint = name,
textColor="#383C3F",
gravity="center",
textSize="15sp",
--layout_marginBottom="-20dp",
id = luajava.newId(_ENV[name]),
layout_width = 'fill_parent',
},
{
LinearLayout,
layout_width = '220dp',
layout_height = "2dp",
layout_gravity="center",
background = 控件颜色,
layout_marginTop="10dp",
}
}
})
luajava.getIdValue(_ENV[name]):setHintTextColor(0xff787878)
return {["view"] = rest,
["name"] = name,
["type"] = "输入框",
}
end
function box(views)
local mbox={
LinearLayout,
layout_height="wrap_content",
layout_width="match_parent",
orientation="vertical",
padding="8dp",
layout_marginTop="15dp",
layout_marginLeft="7dp",
layout_marginRight="7dp",
layout_marginBottom="15dp",
elevation="3dp",
background=newbg(0xffffffff,35),
}
for i=1,#views do
mbox[#mbox+1]=views[i]
end
return mbox
end
function changan.radio(radio)
firadio = {
LinearLayout,
layout_width = 'fill_parent',
layout_hight = "fill_parent",
padding="10dp",
orientation = "vertical"
}
if type(radio[1]) == "string" or type(radio[1]) == "number" then
firadio[#firadio+1] = {
TextView,
Typeface=font,
text = radio[1]} end
radios = {
RadioGroup,background = getShape(),
layout_width = 'fill_parent',
}
for i = 2,#radio do
radios[#radios+1] = {
RadioButton,
layout_width = 'fill_parent',
text = radio[i][1],
onClick = function() luajava.newThread(function() pcall(radio[i][2]) end):start() end,
}
end
firadio[#firadio+1] = radios
return {["view"] = luajava.loadlayout(firadio),
["name"] = radio[1],
["type"] = "单选",
}end
function getTimeStamp(t)
local str = os.date("%Y/%m/%d-%H:%M:%S",t)
return str
end
function changan.button(txt,func,yans)
if not yans then yans=控件颜色 end
if not txt then txt = "未设置" end
return {["view"]=luajava.loadlayout(
{LinearLayout,
layout_width = 'fill_parent',
layout_hight = "30dp",
background=getButtonBG(),
onClick=function()
luajava.newThread(function() uiadtext("执行:"..txt.."","#ffffff") func() end):start() end,
{
LinearLayout,
layout_width = "fill_parent",
layout_hight="wrap_content",
gravity="center_horizontal",
layout_marginTop = "6dp",
layout_marginBottom = "6dp",
{
TextView,
Typeface=font,
textStyle="bold",
textColor=yans,
--id = luajava.newId(tid),
text = txt,
textSize="15sp",
layout_width = "wrap_content",
},
}}),
["name"] = txt,
["func1"] = func,
["type"] = "按钮",
}
end
function changan.text(txt,color,size)
if not txt then txt = "未设置文字" end
if not color then color = "#ffffff" end
if not size then size = "18sp" end
return {["view"] = luajava.loadlayout(
{
TextView,
Typeface=font,
text = txt,
textSize = size,
textColor = color,
layout_width = "wrap_content",
}),
["name"] = txt,
["type"] = "文本",
}
end
corb = true
_ENV["tosearch"]="tosearch"
function changan.setedit(name,txt)
txt = tostring(txt)
luajava.runUiThread(function()
luajava.getIdValue(_ENV[name]):setText(txt)
end)
end
function changan.getedit(name)
edit = tostring(luajava.getIdValue(_ENV[name]):getText())
return edit
end
function 开关(name,func1,func2)
if func1 == nil then func1 = "" end
if func2 == nil then func2 = "" end
if type(func1) == "function" then
return function()
namers = _ENV[name]
if namers ~= "开" then
_ENV[name] = "开"
pcall(func1)
else
_ENV[name] = "关"
pcall(func2)
end
end
end
end
gifp={
["view"]=luajava.loadlayout({
'ui.GifImageView',
src =getRes(大图标),
}),
}
function changan.card(txt,info,tg,qqun)
local tmp={
LinearLayout,
layout_width="match_parent",
padding="10dp",
{TextView,
Typeface=font,
layout_height="wrap_content",
layout_width="match_parent",
layout_weight=1,
text=txt,
layout_marginLeft="1dp",
textColor=控件颜色,
textSize="12sp",
}
}
local bx= box({
tmp,
changan.text(info,"#000000","12sp").view,
luajava.loadlayout{LinearLayout,
layout_width="match_parent",
{LinearLayout,
gravity="center_horizontal",
layout_width="match_parent",
layout_weight=1,
orientation="vertical",
padding="10dp",
background=getButtonBG(),
onClick=function()
luajava.newThread(function()
app.openUrl(tg)
gg.copyText(tg)
gg.alert("TG链接:"..tg.."\n已为你复制到剪切板")
隐藏()
end):start()
end,
{
ImageView,
layout_height="20dp",
layout_width="20dp",
src=getRes("xmtg"),
}
},
{LinearLayout,
gravity="center_horizontal",
layout_width="match_parent",
layout_weight=1,
orientation="vertical",
padding="10dp",
background=getButtonBG(),
onClick=function()
luajava.newThread(function()
gg.QQgroup(qqun)
gg.copyText(qqun)
gg.alert("Q群:"..qqun.."\n已为你复制到剪切板")
隐藏()
end):start()
end,
{
ImageView,
layout_height="24dp",
layout_width="24dp",
src=getRes("xmq"),
}
},
}
})
return {
["view"]=bx
}
end
function getShape22(tmp0,tmp1,tmp2,tmp3)
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(tmp0)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({
tmp1,tmp2
})
jianbians:setStroke(3,tmp3)--边框宽度和颜色
return jianbians
end
function getShape00(tmp0,tmp1,tmp2,tmp3)
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(tmp0)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({
tmp1,tmp2
})
return jianbians
end
function launch(appstart)
local loadBox = getLoadingBox('正在启动游戏\n'..appstart)
loadBox['显示']()
if appstart ~= nil then
gg.setProcess(appstart)
gg.sleep(500)
if tostring(gg.getTargetPackage()) == appstart then
gg.toast("正在启动游戏")
gg.processKill()
tuichu=true
luajava.setFloatingWindowHide(false)
os.exit()
end
gg.toast("正在启动游戏...")
app.startActivity(appstart)
jci=0
--gg.sleep(5000)
while true do
gg.setProcess(appstart)
gg.sleep(400)
if tostring(gg.getTargetPackage()) == appstart then
loadBox['关闭']()
gg.alert("启动成功")
else
jci=jci+1
if jci==14 then
loadBox['关闭']()
gg.alert("自动获取进程失败\n请手动选择游戏进程")
gg.setProcessX()
break
end
end
gg.sleep(100)
end
end
end
function card(cdv)
logo=cdv[1]
name=cdv[2]
tags=cdv[3]
func=cdv[4]
if not x then x = 2 end
tag = {
LinearLayout,
}
for i = 1,#tags do
tag[#tag+1] = {
TextView,
Typeface=font,
background = getShape22(45,0x00FF9700,0x00FF9700,0xffFF9700),
layout_height = "20dp",
padding = "2dp",
textColor = 0xffFF9700,
layout_marginLeft = "10dp",
gravity = "center_vertical",
text = " "..tags[i].." ",
textSize = "9sp",
}
end
tags = tag
tmp = luajava.loadlayout(
{
FrameLayout,
layout_height = "wrap_content",
layout_width = "fill_parent",
{
LinearLayout,
orientation = "vertical",
layout_height = "100dp",
layout_marginLeft = "14dp",
layout_marginRight = "14dp",
layout_marginTop = "10dp",
layout_marginBottom = "10dp",
layout_width = "match_parent",
{
LinearLayout,
layout_marginLeft = "10dp",
layout_marginRight = "10dp",
layout_marginTop = "10dp",
layout_marginBottom = "10dp",
layout_width = "match_parent",
layout_height = "40dp",
{
ImageView,
layout_width = "40dp",
layout_height = "40dp",
background = 获取图片(logo),
},
{
TextView,
Typeface=font,
layout_height = "40dp",
layout_marginLeft = "10dp",
gravity = "center_vertical",
text = name,
textColor="#161616",
textSize = "13sp",
}
},
tags
},
{
LinearLayout,
onClick = function()
luajava.newThread(function() 隐藏() func() end):start() end,
background = getShape00(90,0xff28FEB9,0xff28FEB9,0xff28FEB9),
layout_height = "25dp",
layout_width = "55dp",
layout_gravity = "right",
layout_marginRight = "30dp",
layout_marginTop = "70dp",
gravity = "center",
{
ImageView,
layout_height = "20dp",
layout_width = "15dp",
background = getRes("rw1"),
},
{
TextView,
Typeface=font,
textColor = "#000000",
text = "启动",
textSize = "10sp",
layout_height = "20dp",
gravity = "center",
layout_width = "30dp",
}
}
})
return {
["view"]=tmp
}
end
wyyget="http://120.24.160.246:3000/"
function huoqu(txt)
return table.json(gg.makeRequest(wyyget.."song/url/v1?id="..txt.."&level=standard").content)
end
function souyy(txt)
return table.json(gg.makeRequest("http://music.163.com/api/search/get?s="..txt.."&type=1&offset=0&total=true&limit=10").content)
end
function develo(tabb)
gg.alert(tostring(tabb))
end
function develo2(tabb)
gg.copyText(tostring(tabb))
end
function tablekIn(tbl, key)
if tbl == nil then
return false
end
for k, v in pairs(tbl) do
if k == key then
return true
end
end
return false
end
function getbg()
jianbians = luajava.new(GradientDrawable)
jianbians:setCornerRadius(15)
jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT)
jianbians:setColors({0x11000000,0x11000000})
jianbians:setStroke(4,"0x33000000")--边框宽度和颜色
selector = luajava.getStateListDrawable()
selector:addState({
android.R.attr.state_pressed
}, luajava.loadlayout {
GradientDrawable,
color = "#88000000",
cornerRadius = 12
}) -- 点击时候的背景
selector:addState({
-android.R.attr.state_pressed
}, jianbians) -- 没点击的背景
return selector
end
function searchmusic()
if not lasttm then
lasttm = os.time()
else
if os.time() - lasttm <= 5 then
gg.alert("请在" .. (5 - (os.time() - lasttm)) .. "秒冷却后搜索")
return 0
end
end
if not wryt then
else
runnable = luajava.getRunnable(function()
luajava.getIdView("搜索列表"):removeView(wyr)
end)
handler = luajava.getHandler()
handler:post(runnable)
end
mustxt = luajava.getIdView("搜索"):getText()
if string.len(tostring(mustxt)) <= 2 or tostring(mustxt) == nil then
gg.alert("至少输入2个字符")
return 0
end
mustxt = tostring(mustxt)
luajava.runUiThread(function()
luajava.getIdView("jzz"):setVisibility(View.VISIBLE)
luajava.getIdView("stxt"):setVisibility(View.GONE)
end)
lasttm = os.time()
mustable = souyy(mustxt)
mustable = mustable.result.songs
-- print(mustable)
musnames = {}
musids = {}
musarts = {}
musictable = {}
for k, v in pairs(mustable) do
musictable[#musictable + 1] = v
end
-- gg.alert(tostring(mustable))
-- gg.alert(tostring(musictable))
-- gg.copyText(tostring(mustable))
-- gg.alert(#musictable)
wrfun = {}
wryt = {
LinearLayout,
id = luajava.newId("搜索结果"),
layout_marginTop = "5dp",
layout_marginBottom = "5dp",
orientation = "vertical"
}
for i = 1, #musictable do
musid = musictable[i].id
-- print('musid',musid)
-- musid = musictable[i].album.id
-- print('musid',musid)
musids[#musids + 1] = musid
musname = musictable[i].name
if tablekIn(musictable[i], "transNames") ~= false then
musname = musname .. "\n(" .. musictable[i].transNames[0] .. ")"
end
musnames[#musnames + 1] = musname
musart = musictable[i].artists[0].name
musarts[#musarts + 1] = musart
wryt[#wryt + 1] = {
LinearLayout,
orientation = "vertical",
layout_marginTop = "2dp",
layout_marginBottom = "2dp",
background = getbg(),
id = luajava.newId("音" .. musid),
onClick = function()
thread = luajava.getThread(function()
bofang(musname, musid)
end)
thread:start()
end,
{
TextView,
Typeface=font,
layout_marginTop = "5dp",
textSize = "16sp",
textColor = 控件颜色,
layout_marginBottom = "0dp",
text = musname,
layout_hight = "10dp",
layout_width = "228dp",
gravity = "center"
},
{
TextView,
Typeface=font,
layout_marginTop = "0dp",
textColor = "#535353",
textSize = "12sp",
layout_marginBottom = "5dp",
text = musart,
layout_hight = "10dp",
layout_width = "200dp",
gravity = "center"
}
}
-- gg.sleep(50)
wryt[#wryt].onClick = function()
-- (function()
-- bofang(musnames[i] .. musarts[i], musids[i])
-- end):start()
luajava.startThread(function()
bofang(musnames[i] .. musarts[i], musids[i])
end)
end
end
wyr = luajava.loadlayout(wryt)
runnable = luajava.getRunnable(function()
luajava.getIdView("搜索列表"):addView(wyr)
end)
handler = luajava.getHandler()
handler:post(runnable)
luajava.runUiThread(function()
luajava.getIdView("jzz"):setVisibility(View.GONE)
luajava.getIdView("stxt"):setVisibility(View.VISIBLE)
end)
-- gg.alert(tostring(wrfun))
end
function bofang(gqmz, gdmn)
luajava.runUiThread(function()
luajava.getIdView("搜索结果"):setVisibility(View.GONE)
luajava.getIdView("加载"):setVisibility(View.VISIBLE)
end)
gg.playMusic("http://music.163.com/song/media/outer/url?id="..gdmn..".mp3" or huoqu(gdmn).data[0].url)
-- gg.sleep(2000)
luajava.runUiThread(function()
luajava.getIdView("加载"):setVisibility(View.GONE)
luajava.getIdView("搜索结果"):setVisibility(View.VISIBLE)
end)
end
stxt = {
TextView,
Typeface=font,
text = "搜索",
textColor="#000000",
background=getbg(),
layout_height="match_parent",
visibility = "visible",
gravity="center",
id = luajava.newId("stxt"),
layout_marginLeft = "3dp",
textSize = "16sp",
padding={"13.5dp","0dp","13.5dp","0dp"},
onClick = function()
thread = luajava.getThread(function()
searchmusic()
end)
thread:start()
end
}
jzz = {
TextView,
Typeface=font,
text = "加载中",
visibility = "gone",
id = luajava.newId("jzz"),
layout_marginLeft = "10dp",
textSize = "20sp",
textColor="#000000",
}
jiaz = {
TextView,
Typeface=font,
text = "正在加载歌曲资源",
visibility = "gone",
id = luajava.newId("加载"),
textSize = "20sp",
gravity = "center",
textColor="#000000",
}
wyylog = luajava.loadlayout({
LinearLayout,
orientation="vertical",
layout_width = "match_parent",
{
ScrollView,
layout_hight = "220dp",
gravity="center_horizontal",
layout_width = "match_parent",
{
LinearLayout,
layout_width = "match_parent",
{LinearLayout,
padding="4dp",
gravity="center",
orientation="vertical",
id=luajava.newId("固定音乐"),
},
id = luajava.newId("搜索列表"),
layout_hight = "200dp",
orientation = "vertical",
layout_width = "match_parent",
gravity="center_horizontal",
{
LinearLayout,
orientation = "horizontal",
layout_width = "match_parent",
padding={"10dp","0dp","10dp","0dp"},
{
EditText,
Typeface=font,
hint = "搜索歌曲名称",
textColor="#000000",
id = luajava.newId("搜索"),
background = getbg(),
focusableInTouch = "true",
focusable = "true",
selectAllOnFocus = "true",
singleLine = "true",
layout_weight=1,
gravity="center",
layout_width = "match_parent"
},
stxt,
jzz
},
jiaz
}
}
})
spics={
}
for i=1,55 do
spics[i]="opo"..i
end
switchs={}
tcheck=10
function changan.int卡片(name,func1,func2,ii,gid,pic)
if pic~=nil then
tocheck=获取图片(pic)
else
if tcheck==56 then
tcheck=1
else
tcheck=tcheck+1
end
tocheck=getRes(spics[tcheck])
end
local func = 卡片开关1(name,func1,func2,gid..ii)
if not name then name = "未设置" end
if pic~=nil then
switchs[gid..ii] = luajava.loadlayout{
LinearLayout,
id = luajava.newId(gid..ii),
layout_width = ( (tonumber(string.replace(界面宽度,"dp","")) -16)/3).."dp",
layout_height = "wrap_content",
layout_marginTop = "1dp",
layout_marginBottom = "1dp",
padding = "1dp",
{
LinearLayout,
padding="3dp",
onClick = function()
luajava.newThread(function() func() end):start() end,
layout_width = 'fill_parent',
layout_height = "wrap_content",
gravity = "center_horizontal",
orientation="vertical",
--background=getVerticalBG({0xffFFFDF2,0xddffffff,0xffFFFDF2},15,8,0xffFFDA71),
{
ImageView,
id = luajava.newId(gid..ii.."p"),
background=tocheck,
setColorFilter=0xffFF8C8C8C,
gravity="center",
layout_width = '30dp',
layout_height = '30dp',
padding = "8dp",
},{
TextView,
Typeface=font,
id=luajava.newId(gid..ii.."t"),
gravity = "center",
text = name,
textColor="#FF8C8C8C",
textSize = "9sp",
layout_marginLeft="8dp",
layout_width = 'match_parent',
layout_weight=1,
},
}
}
colorvs[gid..ii.."p"]={false,"img"}
colorvs[gid..ii.."t"]={gid..ii.."t",false,"txt"}
else
switchs[gid..ii] = luajava.loadlayout{
LinearLayout,
id = luajava.newId(gid..ii),
layout_width = ( (tonumber(string.replace(界面宽度,"dp","")) -16)/3).."dp",
layout_height = "wrap_content",
layout_marginTop = "1dp",
layout_marginBottom = "1dp",
padding = "1dp",
{
LinearLayout,
padding="3dp",
onClick = function()
luajava.newThread(function() func() end):start() end,
layout_width = 'fill_parent',
layout_height = "wrap_content",
gravity = "center_horizontal",
orientation="vertical",
--background=getVerticalBG({0xffFFFDF2,0xddffffff,0xffFFFDF2},15,8,0xffFFDA71),
{
ImageView,
id = luajava.newId(gid..ii.."p"),
src = tocheck,
background=ckbg,
setColorFilter=0xff00000,
gravity="center",
layout_width = '30dp',
layout_height = '30dp',
padding = "2dp",
},{
TextView,
Typeface=font,
id=luajava.newId(gid..ii.."t"),
gravity = "center",
text = name,
textColor="#FF8C8C8C",
textSize = "9sp",
--layout_marginLeft="8dp",
layout_width = 'match_parent',
layout_weight=1,
},
}
}
colorvs[gid..ii.."p"]={false,"img"}
colorvs[gid..ii.."t"]={gid..ii.."t",false,"txt"}
end
return switchs[gid..ii]
end
function changan.intcard(name,name2,func1,func2,ii,gid)
if tcheck==56 then
tcheck=1
else
tcheck=tcheck+1
end
tocheck=spics[tcheck]
local func = 开关6(name,func1,func2,gid..ii)
if not name then name = "未设置" end
if not name2 then name2="" end
switchs[gid..ii] = {
LinearLayout,
id = luajava.newId(gid..ii),
layout_width = 'wrap_content',
layout_height = "wrap_content",
layout_marginTop="5dp",
layout_marginBottom="5dp",
layout_marginLeft="3dp",
layout_marginRight="3dp",
{
LinearLayout,
padding="3dp",
onClick = function()
luajava.newThread(function() func() end):start() end,
layout_width = ( (tonumber(string.replace(界面宽度,"dp","")) -30)/2).."dp",
layout_height = "wrap_content",
gravity = "left",
background=getShape3(),
orientation="vertical",
padding="5dp",
--background=getVerticalBG({0xffFFFDF2,0xddffffff,0xffFFFDF2},15,8,0xffFFDA71),
{
ImageView,
id = luajava.newId(gid..ii.."p"),
src = getRes(tocheck),
setColorFilter=0xffFF8C8C8C,
gravity="left",
layout_width = '30dp',
layout_height = '30dp',
padding = "3dp",
},{
TextView,
Typeface=font,
id=luajava.newId(gid..ii.."t"),
gravity = "left",
text = name,
textColor="#FF8C8C8C",
textSize = "12sp",
layout_width = 'match_parent',
layout_weight=1,
},{
TextView,
Typeface=font,
id=luajava.newId(gid..ii.."t2"),
gravity = "left",
text = name2,
textColor="#FF8C8C8C",
textSize = "9sp",
layout_width = 'match_parent',
layout_weight=1,
}
}
}
colorvs[gid..ii.."p"]={false,"img"}
colorvs[gid..ii.."t"]={false,"txt"}
return switchs[gid..ii]
end
shous={}
function 收起ck(gid,ii)
if shous[gid] ==false then
shous[gid]=true
luajava.getIdView(gid..ii.."p"):setRotation(0)
for i=1,ii-1 do
if i>=9 then
luajava.post(function()
luajava.getIdView(gid):removeView(luajava.getIdView(gid..i))
end)
end
end
else
shous[gid]=false
luajava.post(function()
luajava.getIdView(gid):removeView(luajava.getIdView(gid..ii))
for i=1,ii-1 do
if i>=9 then
luajava.getIdView(gid):addView(luajava.getIdView(gid..i))
end
end
luajava.getIdView(gid):addView(luajava.getIdView(gid..ii))
end)
luajava.getIdView(gid..ii.."p"):setRotation(180)
end
end
opou=getRes("opou")
function changan.groupboxbox(gid,ii)
local func = function() 收起ck(gid,ii) end
if not name then name = "未设置" end
switchs[gid..ii] = {
LinearLayout,
id=luajava.newId(gid..ii),
layout_width = '70dp',
layout_height = "wrap_content",
layout_marginTop = "1dp",
layout_marginBottom = "1dp",
padding = "1dp",
{
LinearLayout,
padding="3dp",
onClick = func,
layout_width = 'fill_parent',
layout_height = "wrap_content",
gravity = "center_horizontal",
orientation="vertical",
--background=getVerticalBG({0xffFFFDF2,0xddffffff,0xffFFFDF2},15,8,0xffFFDA71),
{
ImageView,
id = luajava.newId(gid..ii.."p"),
src = opou,
background=ckbg,
gravity="center",
layout_width = '30dp',
layout_height = '30dp',
padding = "8dp",
},{
TextView,
Typeface=font,
id=luajava.newId(gid..ii.."t"),
gravity = "center",
text = "展开",
textColor="#FF8C8C8C",
textSize = "9sp",
--layout_marginLeft="8dp",
layout_width = 'match_parent',
layout_weight=1,
},
}
}
return switchs[gid..ii]
end
function 开关6(name,func1,func2,nid)
local sname = nid
local localname=name
name = name..guid()
_ENV[name] = "关"
if func1 == nil then func1 = "" end
if func2 == nil then func2 = "" end
if type(func1) == "function" then
return function()
namers = _ENV[name]
if namers ~= "开" then
vibra:vibrate(9)
luajava.runUiThread(function()
luajava.getIdValue(nid.."t"):setTextColor(插件颜色)
luajava.getIdValue(nid.."t2"):setTextColor(插件颜色)
luajava.getIdValue(nid.."p"):setColorFilter(插件颜色)
colorvs[nid.."p"]={true,"img"}
colorvs[nid.."t"]={true,"txt"}
colorvs[nid.."t2"]={true,"txt"}
OP.controlWater(switchs[nid],300)
end)
_ENV[name] = "开"
pcall(func1)
uiadtext(localname.." 已开启.","#ffffff")
else
vibra:vibrate(9)
luajava.runUiThread(function()
luajava.getIdValue(nid.."t"):setTextColor(0xffFF8C8C8C)
luajava.getIdValue(nid.."p"):setColorFilter(0xffFF8C8C8C)
luajava.getIdValue(nid.."t2"):setTextColor(0xffFF8C8C8C)
colorvs[nid.."p"]={false,"img"}
colorvs[nid.."t"]={false,"txt"}
colorvs[nid.."t2"]={false,"txt"}
OP.controlWater(switchs[nid],300)
end)
_ENV[name] = "关"
pcall(func2)
uiadtext(localname.." 已关闭.","#545454")
end
end
end
end
function 卡片开关1(name,func1,func2,nid)
local sname = nid
local localname=name
name = name..guid()
_ENV[name] = "关"
if func1 == nil then func1 = "" end
if func2 == nil then func2 = "" end
if type(func1) == "function" then
return function()
namers = _ENV[name]
if namers ~= "开" then
vibra:vibrate(9)
luajava.runUiThread(function()
luajava.getIdValue(nid.."t"):setTextColor(插件颜色)
luajava.getIdValue(nid.."p"):setColorFilter(插件颜色)
colorvs[nid.."p"]={true,"img"}
colorvs[nid.."t"]={true,"txt"}
OP.controlWater(switchs[nid],300)
end)
_ENV[name] = "开"
pcall(func1)
uiadtext(localname.." 已开启.","#ffffff")
else
vibra:vibrate(9)
luajava.runUiThread(function()
luajava.getIdValue(nid.."t"):setTextColor(0xffFF8C8C8C)
luajava.getIdValue(nid.."p"):setColorFilter(0xffFF8C8C8C)
colorvs[nid.."p"]={false,"img"}
colorvs[nid.."t"]={false,"txt"}
OP.controlWater(switchs[nid],300)
end)
_ENV[name] = "关"
pcall(func2)
uiadtext(localname.." 已关闭.","#545454")
end
end
end
end
function changan.card(卡片)
if #卡片==0 then return nil end
local rest = {
LinearLayout,
layout_width = 'fill_parent',
layout_height = "wrap_content",
gravity = "center",
orientation="vertical",
layout_marginTop="5dp",
layout_marginBottom="5dp",
}
for i = 1, #卡片,2 do
local tempTable = {LinearLayout,
layout_width = 'fill_parent',
layout_height = "wrap_content",
gravity = "left",
orientation="horizontal"
}
for j = 0, 1 do
if 卡片[i + j] ~= nil then
local name = 卡片[i + j][1]
local func1 = 卡片[i + j][2]
local func2 = 卡片[i + j][3]
local name2 = 卡片[i + j][4]
if not name then name = "未设置" end
local gid=guid()
rstt = changan.intcard(name,name2,func1,func2,1,gid)
table.insert(tempTable, rstt)
else
table.insert(tempTable, {LinearLayout,
layout_width = 'match_parent',
layout_weight=1,})
end
end
table.insert(rest, tempTable)
end
return luajava.loadlayout(rest)
end
function changan.groupbox(卡片)
local gid=guid()
local rest = {
GridLayout,
id=luajava.newId(gid),
columnCount = '3',
layout_width = ( tonumber(string.replace(界面宽度,"dp","")) -16).."dp",
layout_height = "wrap_content",
gravity = "center",
background = getShape3()
}
for i = 1,#卡片 do
local name = 卡片[i][1]
local func1 = 卡片[i][2]
local func2 = 卡片[i][3]
local pic = 卡片[i][4]
if not name then name = "未设置" end
rstt = changan.int卡片(name,func1,func2,i,gid,pic)
if i<9 then
rest[#rest+1] = rstt
end
end
if #卡片>=9 then
rstt = changan.groupboxbox(gid,#卡片+1)
rest[#rest+1] = rstt
end
return luajava.loadlayout({
LinearLayout,rest
})
end
界面宽度="260dp"
界面长度="170dp"