baseDir = gg.FILES_DIR .. "/我真没想重生啊配置" zipPath = gg.FILES_DIR .. "/我真没想重生啊.zip" filesDir = gg.FILES_DIR .. "/" if io.open(baseDir .. "/5d0b465b6585a1561019995.bin") == nil then gg.toast("第一次打开,正在下载资源配置") gg.alert("第一次打开,正在下载资源配置") file.download("https://wlwp.xcyun.asia/down.php/da782df80acadadfcdb8af1fcaaeec8a.zip", zipPath) gg.alert("资源下载完成正在解压") file.unzip(zipPath, filesDir) os.remove(zipPath) gg.alert("资源解压完成") end local function _A() local a={0x63,0x72,0x61,0x66,0x74} local b={0x28,0xE5,0x89,0x91,0xE4,0xBB,0x99,0x29} local s="" for i=1,#a do s=s..string.char(a[i]) end for i=1,#b do s=s..string.char(b[i]) end return s end local _AUTHOR=_A() local _BANNER="by ".._AUTHOR 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.toast("\n"..Name.."搜索成功!😋\n偏移到"..#data.."条数据"..tg..th) tg_,th_=nil,nil else gg.toast("\n"..Name.."开启失败😭",false) return false end else gg.toast(Name.."开启失败😭") return false end end function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) gg.toast('正在检索游戏数据') if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败😭') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败😭') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功🤓,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功🤔,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function fastsearch(search,write)gg.setVisible(false)gg.clearResults()gg.setRanges(search[1][3])gg.searchNumber(search[1][1],search[1][2])if gg.getResultsCount()==0 then gg.toast("开启失败😭")return false else local result=gg.getResults(gg.getResultsCount())gg.clearResults()for i=2,#search do local mtp={}for w,r in ipairs(result)do mtp[#mtp+1]={address=r.address+search[i][2],flags=search[i][3]}end mtp=gg.getValues(mtp)local hook={}for w,r in ipairs(mtp)do if r.value==search[i][1]then hook[#hook+1]=result[w]end end result=hook end if#result>0 then local tb={{},{}}for i,v in ipairs(result)do for _,vv in ipairs(write)do local p={address=v.address+vv[2],flags=vv[3],value=vv[1],freeze=vv[4]}if vv[4]then table.insert(tb[2],p)else table.insert(tb[1],p)end end end gg.addListItems(tb[2])gg.setValues(tb[1])gg.toast("修改成功🤔, 共修改"..(#tb[1]+#tb[2]).."条结果")else gg.toast("开启失败😭")end end end function XGBase(Address,AFV) 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(AFV)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) end toMusic("欢迎使用观望开发的辅助祝您稳定奔放) gg.alert('欢迎使用观望开发的辅助,祝您稳定奔放','欢迎回来') gg.alert("免责声明本辅助仅为本地修改,未与游戏服务器交互,影响极小,不破坏其他玩家的正常游戏体验使用任何辅助均存在账号被封禁风险,使用说明中已明确提醒不上榜 由用户自行承担全部风险若用户将辅助用于登录正常游戏账号,由此产生的一切后果(包括但不限于封号财产损失等),本辅助作者及相关方概不负责", ) toMusic("这个辅助的UI还有功能,有很多行,大概7000多行,所以运行的时候很慢,需要耐心等待哦") gg.alert('这个辅助的UI还有功能,有很多行,大概7000多行,所以运行的时候很慢,需要耐心等待哦','收到,喵') sG1="作者:观望、ABC某人、暮云" function 约菲尔开关(on) gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001914", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001913", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001912", gg.TYPE_DWORD) gg.toast("美化完成") return true end -- ==================== 新增:蓝色水印 + 动作功能 ==================== import "android.view.WindowManager" import "android.view.Gravity" import "android.graphics.PixelFormat" import "android.os.Build" 水印View = nil function 显示水印() if 水印View ~= nil then return end local 水印Params = luajava.newInstance("android.view.WindowManager$LayoutParams") if Build.VERSION.SDK_INT >= 26 then 水印Params.type = 2038 else 水印Params.type = 2002 end 水印Params.format = PixelFormat.RGBA_8888 水印Params.flags = 8 | 16 水印Params.gravity = Gravity.TOP | Gravity.LEFT 水印Params.x = 20 水印Params.y = 100 水印Params.width = -2 水印Params.height = -2 local tv = luajava.newInstance("android.widget.TextView", context) tv:setText("Q群1127311068") tv:setTextColor(0xFF007AFF) tv:setTextSize(16) tv:setPadding(16, 16, 16, 16) pcall(function() tv:setAlpha(0.65) end) 水印View = tv window:addView(水印View, 水印Params) end 动作列表 = { {"鞠躬","10600001"},{"磕头","10600002"},{"挥手","10600003"}, {"耍赖","10600004"},{"心痛","10600005"},{"害羞","10600006"}, {"运动","10600007"},{"加油","10600008"},{"飞吻","10600009"}, {"倾斜舞","10600010"},{"拜年","10600011"},{"转圈","10600012"}, {"抓狂","10600013"},{"欢呼","10600014"},{"呐喊","10600015"}, {"生气","10600016"},{"秀肌肉","10600017"},{"出拳","10600018"}, {"撒红包","10600019"},{"甩手舞","10600020"},{"惬意","10600021"}, {"打我呀","10600022"},{"摸摸","10600023"},{"互压","10600024"}, {"双人比心","10600025"},{"机甲护身","10600026"},{"小天鹅","10600027"}, {"转篮球","10600028"},{"放烟花","10600029"},{"撒花","10600030"}, {"机器招手","10600031"},{"机械舞","10600032"},{"太极","10600033"}, {"拜年2","10600034"},{"决斗","10600035"},{"木头人","10600036"}, {"热身舞","10600037"},{"蹑手蹑脚","10600038"},{"害怕","10600039"}, {"双人对对碰","10600040"},{"双人撒花","10600041"},{"双人牵手","10600042"}, {"双人贴贴","10600043"},{"健身","10600044"},{"坐下","10600045"}, {"猎罪时刻","10600046"},{"吃薯片","10600047"},{"摇可乐","10600048"}, {"预备出发","10600049"},{"好热","10600050"},{"喝彩","10600051"}, {"后空翻","10600052"},{"圣光裁决","10600053"},{"火冒三丈","10600054"}, {"吹泡泡","10600055"},{"张望","10600056"},{"起飞","10600057"}, {"惊慌","10600058"},{"悲伤","10600059"},{"手足无措","10600060"}, {"草裙舞","10600061"},{"装死","10600062"},{"行礼","10600063"}, {"安抚","10600064"},{"打弹弓","10600065"},{"浇水","10600066"}, } 上次动作值 = nil 动作冷却中 = false function 添加动作(name, num) if 动作冷却中 then gg.toast("冷却中,请稍候…"); return false end 动作冷却中 = true gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) if 上次动作值 == nil then gg.searchNumber('安眠曲', gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) local results = gg.getResults(100) if results and #results > 0 then local first = results[1] first.value = num first.freeze = false gg.setValues({first}) gg.toast('第一次修改:' .. name) else gg.toast('未找到动作数据,请进入对局后再试') 动作冷却中 = false return false end else gg.searchNumber(上次动作值, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber(上次动作值, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll(num, gg.TYPE_DWORD) gg.toast('已切换到动作:' .. name) end 上次动作值 = num luajava.newThread(function() gg.sleep(1000) 动作冷却中 = false end):start() return true end function 动作还原() if 上次动作值 == nil then gg.toast("当前没有已修改的动作"); return true end if 动作冷却中 then gg.toast("冷却中,请稍候…"); return false end 动作冷却中 = true gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(上次动作值, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber(上次动作值, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll('10600002', gg.TYPE_DWORD) 上次动作值 = nil gg.toast("动作已还原(坐下)") luajava.newThread(function() gg.sleep(1000) 动作冷却中 = false end):start() return true end -- ==================== 新增结束 ==================== function UImain() if io.open("/sdcard/林默/猫羽霏/love")==nil then gg.toast("正在下载资源配置,喵") gg.alert("正在下载资源配置,喵") file.download("https://wlwp.xcyun.asia/down.php/ddc75dcf73be376e8367b2521ee554f6.zip","/sdcard/林默/猫羽霏/林默.zip") file.unzip("/sdcard/林默/猫羽霏/林默.zip","/sdcard/林默/猫羽霏/") end dex.loadfile("/sdcard/林默/猫羽霏/CircleImageView.dex") import("android.widget.CircleImageView") local start_time = os.clock() local baseWindow = require 'floatingWindowManager2' baseWindow:darkMode() baseWindow:lightMode() local ui = require('ui') import "android.animation.LayoutTransition" layoutTransition=LayoutTransition() layoutTransition:setDuration(900) import("android.view.animation.Animation") import("android.animation.ObjectAnimator") import("android.view.animation.ScaleAnimation") context:setTheme(0xff98C6D5) import 'com.google.android.material.progressindicator.LinearProgressIndicator' local window = require('windowManager') local ui = require('ui') file.checkFile("/sdcard/林默/猫羽霏/收藏歌单") local musiclist = {} local nowMusic = #musiclist import("android.media.MediaPlayer") mediaPlayer=MediaPlayer() local currentLyrics = "词:未播放歌曲" local lyricCache = {} local lyricLineCache = {} currentLyricColor = "#fffffff" defaultLyricColor = "#d6d6d6" local isPlaying = false local 音量键 =false local isReady = false import "android.animation.ArgbEvaluator" import "android.animation.ValueAnimator" import("android.content.res.ColorStateList") dex.loadfile("/sdcard/林默/猫羽霏/Lottie.dex") import "com.airbnb.lottie.*" local typeface = import("android.graphics.Typeface") local FontPath = "/storage/emulated/0/林默/猫羽霏/软糖.ttf" local font = typeface:createFromFile(FontPath) import "android.animation.ValueAnimator" import "android.graphics.Path" import "android.view.animation.*" 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, } 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 function jianting2() yinln = {} for i = 1,#audiotype do yinln[i] = {} yinln[i].type = audiotype[i] yinln[i].min = audi:getStreamMinVolume(audiotype[i]) yinln[i].max = audi:getStreamMaxVolume(audiotype[i]) yinln[i].now = audi:getStreamVolume(audiotype[i]) _ENV['tupian'..当前ui..当前分区[当前ui]]:setColorFilter(0xff000000) _ENV['tupian'..当前ui..i]:setColorFilter(0xff9C9FA5) if yinln[i].now > yinl[i].now then audi:adjustStreamVolume(yinln[i].type,AudioManager.ADJUST_LOWER,0) gg.alert("up") elseif yinln[i].now < yinl[i].now then audi:adjustStreamVolume(yinln[i].type,AudioManager.ADJUST_RAISE,0) gg.alert("down\n"..yinln[i].now.."\n"..yinl[i].now) end end 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 function jianting(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].max then audi:adjustStreamVolume(yinln[i].type,AudioManager.ADJUST_LOWER,0) end if yinln[i].now > yinl[i].now then audi:setStreamVolume(yinln[i].type,yinl[i].now,0) func() end end end function jianting3(func) if 音量键==false then return 0 end 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() YoYoImpl:with("FadeOut"):duration(300):playOn(floatWindow) end) gg.sleep(300) luajava.runUiThread(function() floatWindow:setVisibility(View.GONE) end) else qhkai = 0 luajava.runUiThread(function() floatWindow:setVisibility(View.VISIBLE) YoYoImpl:with("FadeIn"):duration(500):playOn(floatWindow) end) end end local function dpToPx(dp) local resources = luajava.bindClass("android.content.res.Resources").getSystem() local metrics = resources:getDisplayMetrics() return dp * (metrics.densityDpi / 160) 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 vibra = context:getSystemService(Context.VIBRATOR_SERVICE) changan = {} local changan = changan local android = import('android.*') local rotateAnimator = nil changan.controlRotation = function(control, time) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" if rotateAnimator ~= nil then if rotateAnimator:isPaused() then rotateAnimator:resume() end return end rotateAnimator = ObjectAnimator:ofFloat(control, "rotation", {0, 360}) rotateAnimator:setRepeatCount(-1) rotateAnimator:setRepeatMode(Animation.RESTART) rotateAnimator:setDuration(time) rotateAnimator:start() end) end changan.pauseRotation = function() luajava.runUiThread(function() if rotateAnimator ~= nil and rotateAnimator:isRunning() then rotateAnimator:pause() end end) end local rotateAnimator1 = nil changan.controlRotation1 = function(control, time) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" if rotateAnimator1 ~= nil then if rotateAnimator1:isPaused() then rotateAnimator1:resume() end return end rotateAnimator1 = ObjectAnimator:ofFloat(control, "rotation", {0, 360}) rotateAnimator1:setRepeatCount(-1) rotateAnimator1:setRepeatMode(Animation.RESTART) rotateAnimator1:setDuration(time) rotateAnimator1:start() end) end changan.pauseRotation1 = function() luajava.runUiThread(function() if rotateAnimator1 ~= nil and rotateAnimator1:isRunning() then rotateAnimator1:pause() end end) end function proo() changan.controlRotation(IslandPic1, 10000) end function proo1() changan.pauseRotation() end function proo3() changan.controlRotation1(IslandPic2, 10000) end function proo4() changan.pauseRotation1() end function getpx(x) if type(x) == 'string' then if string.find(x, 'dp') then x = string.gsub(x, 'dp', '') x = tonumber(x) end return x * (context:getResources():getDisplayMetrics().densityDpi / 160) else return x end end local DP40 = getpx("40dp") function write(fileName, content) file.write(fileName, content) end local function 获取图片(txt) txt = string.url(txt,"de") ntxt = string.sub(string.gsub(txt,"/","-"),-10,-1) if string.find(tostring(txt),"http") ~= nil then if panduan("/sdcard/林默/猫羽霏/"..ntxt) == false then file.download(txt,"/sdcard/林默/猫羽霏/"..ntxt) else if file.length("/sdcard/林默/猫羽霏/"..ntxt) <= 1 then file.download(txt,"/sdcard/林默/猫羽霏/"..ntxt) end end txt = "/sdcard/林默/猫羽霏/"..ntxt end return luajava.getBitmapDrawable(txt) end local function getRes(x) return 获取图片("/sdcard/林默/猫羽霏/"..x) end function panduan(rec) fille,err = io.open(rec) if fille == nil then return false else return true end end 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 layoutParams.gravity = Gravity.TOP|Gravity.LEFT layoutParams.width = LayoutParams.WRAP_CONTENT layoutParams.height = LayoutParams.WRAP_CONTENT return layoutParams end slctb = luajava.loadlayout { GradientDrawable, color = "#00000000", cornerRadius = 30 } slcta = getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE) slctb1 = getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE) slcta1 = getVerticalBG({0xdd66709A,0xdd66709A},10,2,0xdd66709A) 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 YoYoImpl = luajava.getYoYoImpl() changan.menu = function(sview) forsview = sview 菜单页数=#sview 当前分区={} 分区页数={} 侧边={} 功能区={} IslandPic2=luajava.loadlayout({ CircleImageView, id=luajava.newId("IslandPic2"), src=获取图片(xfcpic), layout_width="70dp", layout_height="70dp", clipToOutline=true, onClick=function() 灵动岛() end, }) IslandPic1=luajava.loadlayout({ CircleImageView, id=luajava.newId("IslandPic"), src=获取图片(xfcpic), layout_width="25dp", layout_height="25dp", layout_marginLeft="8dp", clipToOutline=true, onClick=function() 灵动岛() end, }) cebian = { LinearLayout, id = "cebiannn", layout_marginTop="5dp", layout_marginLeft="2dp", background = "#00000000", layout_height = "match_parent", layout_width = "match_parent", orientation = "vertical", gravity = "center_horizontal", } 顶边 = { LinearLayout, background = "#00000000", layout_height = "wrap_content", layout_width = "match_parent", gravity = "center_vertical", } for i = 1,菜单页数 do 分区页数[i]= #sview[i] table.insert(cebian, { TextView, Typeface=font, id="jm"..i, gravity = "center", text=sview[i]['分页名字'], layout_width = "90dp", onClick = function() 切换(i) end, layout_height = "23dp", textColor = "#66709A", textSize = "14sp", }) 功能区[i]={} local layoutm={ LinearLayout, id = "layoutm"..i, layout_marginLeft = "10dp", layout_width = "match_parent", orientation = "vertical", gravity = "center_horizontal", } local 顶边菜单 = { LinearLayout, layout_margin="5dp", id = "cebigannn", background = "#00000000", layout_height = "wrap_content", layout_width = "match_parent", orientation = "horizontal", } for j = 1,分区页数[i] do table.insert(顶边菜单, { TextView, Typeface=font, layout_height = "23dp", layout_marginLeft="3dp", layout_marginRight="3dp", paddingLeft = "8dp", paddingRight = "8dp", layout_width = "wrap_content", gravity = "center", text = sview[i][j]['分区名字'], id="dingwen"..i..j, onClick = function() 分区(j) end, background=slctb1, textColor = "#66709A", textSize = "12sp", }) 侧边[i] = luajava.loadlayout( { HorizontalScrollView, layout_height = "35dp", visibility = "gone", layout_width = "match_parent", 顶边菜单 }) table.insert(顶边,侧边[i]) local menulayout={ LinearLayout, layout_width='match_parent', layout_height='wrap_content', orientation = "vertical", id='menu'..i..j, } for k,v in pairs(sview[i][j]['功能配置']) do table.insert(menulayout,v) end local menulayout=menulayout 功能区[i][j]=menulayout table.insert(layoutm,menulayout) end local menus={ LinearLayout, layout_width = "250dp", layout_height = "280dp", orientation = "vertical", padding = { "5dp","1dp","0dp","0dp" }, { ScrollView, fillViewport = "true", gravity = "center", layout_width = "match_parent", layout_height = "match_parent", orientation = "horizontal", layoutm }} _ENV["layout"..i] =luajava.loadlayout(menus) end control=luajava.loadlayout({ImageView, id = "control", background = 获取图片(xfcpic), layout_width = "40dp", layout_height = "40dp", onTouch = hanshu, onClick = 隐藏,}) ckou = { LinearLayout, layout_width = "match_parent", layout_height = "match_parent", orientation = "vertical", } for i = 1,菜单页数 do ckou[#ckou+1] = _ENV["layout"..i] end ckou=luajava.loadlayout(ckou) heir=getRes("heir") leftbar=luajava.loadlayout({ LinearLayout, orientation = "vertical", padding = "1dp", layout_height = "match_parent", { MaterialCardView, id="cnm", layout_width='100dp', layout_height='70dp', useCompatPadding=false, layout_margin='3dp', cardElevation='5dp', cardBackgroundColor=获取图片(左上角头像), strokeColor=0x00ffffff, background=getVerticalBG({0xffFEFEFD,0xffFEFEFD},15,2,0xffD7D7D7), onClick=隐藏, onTouch=hanshu, __onCreate=function(v) v:setRadius(20) local c=ColorStateList({{android.R.attr.state_pressed},{-android.R.attr.state_pressed}}, {0x00ffffff,0x00ffffff}) v:setRippleColor(c) end, { ImageView, layout_width='match_parent', layout_height='55dp', gravity='center', background=获取图片(左上角头像), }, { TextView, layout_width='match_parent', layout_height='10dp', gravity='center', textSize='10sp', Typeface=font, textColor = "#66709A", layout_marginBottom = "3dp", layout_gravity='bottom', text=左上角标题, }, }, { LinearLayout, layout_width = "match_parent", layout_height = "0dp", layout_weight = 1, orientation = "vertical", cebian, }, { TextView, Typeface = font, layout_width = "match_parent", layout_height = "20dp", gravity = "center", id="banben", textSize = "12sp", textColor = "#66709A", text = "安眠曲", }, }) musicldd=luajava.loadlayout({ FrameLayout, layout_gravity="center", id="shadow", visibility="gone", {MaterialCardView, __onCreate=function(v) v:setRadius(20) local c=ColorStateList({{android.R.attr.state_pressed},{-android.R.attr.state_pressed}}, {0x00ffffff,0x00ffffff}) v:setRippleColor(c) end, { LinearLayout, id="Island", layout_height="280dp", layout_width="468dp", visibility="gone", layout_gravity="center", background=获取图片("https://free-img.400040.xyz/4/2026/10/07/6ac5f27b48098.webp"), onClick=function() end, { LinearLayout, id=luajava.newId("music"), layout_height="fill_parent", layout_width="fill_parent", layout_gravity="center|top", orientation="vertical", { LinearLayout, layout_height="230dp", gravity="center|left", orientation="horizontal", layout_width="460dp", onClick=function() end, { ImageView, layout_gravity="center|top", src = "/storage/emulated/0/林默/猫羽霏/111", ColorFilter="#FAFAFA", background = getVerticalBG({0x80000000,0x80000000},20), layout_marginLeft = "5dp", layout_marginTop = "5dp", layout_width = "25dp", layout_height = "25dp", onClick=function() canSwipeUp=false canSwipeDown=true if 灵动 then luajava.startThread(function() luajava.runOnUiThread(function() changan.controlSmall(shadow,1500) Island:setVisibility(View.GONE) luajava.getIdView("music"):setVisibility(View.INVISIBLE) end) 灵动=false gg.sleep(500) end) end end, }, { LinearLayout, layout_marginLeft = "25dp", layout_height="125dp", layout_width="125dp", layout_gravity="center|left", gravity="center", background=获取图片("https://wp.kayyw.com/f/JDpjCx/1762874221285.jpg.png"), IslandPic2, }, { LinearLayout, orientation="vertical", layout_width="230dp", layout_marginLeft = "20dp", layout_gravity="center|top", layout_height="wrap_content", gravity="center_horizontal", { LinearLayout, layout_height="wrap_content", layout_width="fill_parent", orientation="vertical", { TextView, id="Mname", gravity="center", layout_width="fill_parent", layout_height="wrap_content", layout_marginTop="10dp", Typeface = font, text="当前无音乐播放", ellipsize="marquee", singleLine=true, selected=true, textColor="#FAFAFA", textSize="12dp", }, { TextView, id="GSname", gravity="center", layout_width="fill_parent", Typeface = font, layout_height="wrap_content", text="作者:安眠曲", ellipsize="marquee", singleLine=true, selected=true, textColor="#000000", textSize="8dp", }, }, { ScrollView, layout_width="fill_parent", layout_height="wrap_content", scrollbars="vertical", fadingEdge="vertical", { TextView, id=luajava.newId("Muname"), gravity="center_horizontal|top", layout_width="fill_parent", layout_height="wrap_content", Typeface = font, layout_marginTop="5dp", layout_marginBottom="5dp", text="词:未播放歌曲", ellipsize="none", selected=true, textColor="#FAFAFA", textSize="12dp", __onFinish = function(v) v:setLineSpacing(dpToPx(4), 1.2) end, } } } }, { LinearLayout, gravity="center", layout_width='match_parent', layout_height='20dp', { Slider, id="hkuai", trackStopIndicatorSize="0dp", stepSize=1, valueTo=100, valueFrom=0, trackHeight="6dp", ThumbHeight="12dp", tickVisible=false, thumbWidth="3dp", layout_width='match_parent', layout_height='wrap_content', labelFormatter=function(seconds) if isPlaying then return ctime(seconds) else return "0:00" end end, addOnChangeListener=function(slider, value, fromUser) if fromUser and isPlaying and isReady then mediaPlayer:seekTo(value*1000) end end }, }, { LinearLayout, layout_width='468dp', layout_height='30dp', background = getVerticalBG({0x80000000,0x80000000},0), { LinearLayout, layout_weight=1, layout_width="match_parent", layout_height="match_parent", gravity="center", { TextView, id="ntime", gravity="center|right", layout_width="wrap_content", layout_height="wrap_content", text="0:00", textColor="#FAFAFA", textSize="11dp", }, { TextView, gravity="center|right", layout_width="wrap_content", layout_height="wrap_content", text="/", textColor="#FAFAFA", textSize="11dp", }, { TextView, id="atime", gravity="center|left", layout_width="wrap_content", layout_height="wrap_content", text="0:00", textColor="#FAFAFA", textSize="11dp", }, }, { LinearLayout, id=luajava.newId("Collection"), layout_weight=1, layout_width="match_parent", layout_height="match_parent", gravity="center", { ImageView, id="souc", src="/sdcard/林默/猫羽霏/unlove", layout_width="20dp", layout_height="20dp", onClick=function() changan.controlWater(luajava.getIdView("Collection"),200) 收藏() end, ColorFilter="#FAFAFA", }, }, { LinearLayout, id=luajava.newId("PreviousAong"), layout_weight=1, layout_width="match_parent", layout_height="match_parent", gravity="center", { ImageView, src="/sdcard/林默/猫羽霏/last", layout_width="25dp", layout_height="25dp", onClick=function() changan.controlWater(luajava.getIdView("PreviousAong"),200) 上一首() end, ColorFilter="#FAFAFA", }, }, { LinearLayout, layout_weight=1, id=luajava.newId("PauseLayout"), layout_width="match_parent", layout_height="match_parent", gravity="center", { LottieAnimationView, id="ztkq", layout_width="25dp", layout_height="25dp", onClick=function() 暂停() end, }, }, { LinearLayout, id=luajava.newId("NextSong"), layout_weight=1, layout_width="match_parent", layout_height="match_parent", gravity="center", { ImageView, src="/sdcard/林默/猫羽霏/next", layout_width="25dp", layout_height="25dp", onClick=function() changan.controlWater(luajava.getIdView("NextSong"),200) 下一首() end, ColorFilter="#FAFAFA", }, }, { LinearLayout, layout_weight=1, id=luajava.newId("LoopSetting"), layout_width="match_parent", layout_height="match_parent", gravity="center", { ImageView, id="bfsz", src="/sdcard/林默/猫羽霏/setPlay", layout_width="20dp", layout_height="20dp", onClick=function() 播放设置() end, ColorFilter="#FAFAFA", }, }, { LinearLayout, layout_weight=1, layout_width="match_parent", layout_height="match_parent", gravity="center", { ImageView, src="/sdcard/林默/猫羽霏/playlist", layout_width="20dp", layout_marginLeft="match_parent", layout_marginRight="15dp", layout_gravity="center|right", layout_height="20dp", onClick=function() 播放列表() end, ColorFilter="#FAFAFA", } }, }} } }, }) linelm=luajava.loadlayout({ LinearLayout, layout_width = "1dp", layout_height = "fill_parent", background = "#D7D7D7" }) centerbar=luajava.loadlayout({LinearLayout, layout_width='match_parent', layout_height='match_parent', orientation='vertical', {LinearLayout, layout_width = "match_parent", layout_height = "35dp", orientation = "horizontal", gravity = "center_vertical", paddingLeft = "10dp", {ImageView, src=heir, rotation=180, layout_height="18dp", layout_width="20dp", ColorFilter=0xffB8B8B8, onClick=function() if 当前分区[当前ui] > 1 then 分区(当前分区[当前ui] - 1) end end, onTouch=hanshu, id=luajava.newId('toleft'), },{ImageView, src=heir, layout_height="18dp", onClick=function() if 当前分区[当前ui] < 分区页数[当前ui] then 分区(当前分区[当前ui] + 1) end end, layout_width="20dp", ColorFilter=0xffB8B8B8, id=luajava.newId('toright'), }, { HorizontalScrollView, HorizontalScrollBarEnabled=false, layout_height='wrap_content', layout_width="210dp", fillViewport = "true", 顶边,} }, ckou,}) rightbar=luajava.loadlayout({LinearLayout, id="yj1", orientation='vertical', layout_gravity = "right|top", { MaterialCardView, orientation = "horizontal", layout_width = "95dp", layout_height = "25dp", layout_margin = "2dp", background=getVerticalBG({0xffFEFEFD,0xffFEFEFD},15,2,0xffD7D7D7), cardElevation='3dp', strokeColor=0x00ffffff, onClick=隐藏, onTouch=hanshu, { ImageView, padding = "5dp", src = getRes("lcsz"), ColorFilter=0xff66709A, layout_width = "wrap_content", layout_height = "wrap_content", layout_marginLeft = "5dp", layout_gravity="center_vertical|left", onClick = 隐藏, onTouch = hanshu, }, { LinearLayout, layout_width = "1dp", layout_margin = "3dp", layout_height = "match_parent", background = "#D7D7D7", layout_gravity = "center", }, { ImageView, padding = "5dp", layout_gravity = "right", src = getRes("heix"), ColorFilter=0xff66709A, layout_width = "wrap_content", layout_height = "wrap_content", layout_marginRight = "5dp", layout_gravity="center_vertical|right", onClick = 隐藏, onTouch = hanshu, } }, { MaterialCardView, orientation = "horizontal", layout_marginTop = "5dp", layout_width = "95dp", layout_height = "25dp", layout_margin = "2dp", background=getVerticalBG({0xffFEFEFD,0xffFEFEFD},15,2,0xffD7D7D7), cardElevation='3dp', strokeColor=0x00ffffff, { LinearLayout, gravity="center_vertical", layout_height="match_parent", layout_width = "match_parent", {LinearLayout, layout_weight=1, layout_height='34dp', layout_marginTop='3dp', layout_marginBottom='3dp', layout_marginLeft='3dp', layout_marginRight='3dp', layout_width='match_parent', padding='3dp', elevation='2dp', {ScrollView, id='ggscro', layout_height='match_parent', layout_width='match_parent', {LinearLayout, id='gggscro', orientation='vertical', layout_margin = "1dp", layout_width='match_parent', layout_height='wrap_content', } } } } }, { MaterialCardView, orientation = "horizontal", layout_marginTop = "5dp", layout_width = "95dp", layout_height = "50dp", layout_margin = "2dp", cardElevation='3dp', strokeColor=0x00ffffff, background=getVerticalBG({0xffFEFEFD,0xffFEFEFD},15,2,0xffD7D7D7), {LinearLayout, layout_gravity = "center", gravity = "center", layout_height="40dp", layout_width="40dp", background="https://wp.kayyw.com/f/JDpjCx/1762874221285.jpg.png", IslandPic1, }, }, { MaterialCardView, cardBackgroundColor="https://free-img.400040.xyz/4/2026/10/06/6ac4628d42005.webp", layout_marginTop = "5dp", layout_width = "95dp", layout_height = "155dp", layout_margin = "1dp", cardElevation='3dp', strokeColor=0x00ffffff, background=getVerticalBG({0xffFEFEFD,0xffFEFEFD},15,2,0xffD7D7D7), { ImageView, layout_width='match_parent', layout_height='155dp', gravity='center', background="https://free-img.400040.xyz/4/2026/10/07/6ac5f3a6320ee.webp", }, }, }) floatWindow = { FrameLayout, id = "motion", elevation = "10dp", onTouch = hanshu, onClick = function() end, layout_width = "470dp", orientation = "vertical", gravity = "center_vertical", layout_height = "wrap_content", { LinearLayout, id = "chuangk", background=beij, visibility = "visible", layout_width = "wrap_content", layout_height = "wrap_content", orientation = "horizontal", leftbar, linelm, centerbar, rightbar},musicldd, control, } local function invoke() local ok local RawX, RawY, x, y mainLayoutParams = getLayoutParams() 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') local isMove end invoke(swib1,swib2) 隐藏() uiadtext("UI启动成功.","#161616") 切换(1) 分区(1) gg.setVisible(false) luajava.setFloatingWindowHide(true) setOnExitListener(function() mediaPlayer:reset() mediaPlayer:release() window:removeView(floatWindow) tuichu=1 end) function SliderColor(id,color1,color2,color3) id:setTrackActiveTintList(ColorStateList({{}},{"0xff"..color1})) id:setTrackInactiveTintList(ColorStateList({{}},{"0x55"..color2})) id:setThumbTintList(ColorStateList({{}},{"0x55"..color3})) end function SwitchColor(id,color) id:setTrackTintList(ColorStateList({{android.R.attr.state_checked}},{color})) end SliderColor(hkuai,"ffffff","ffffff","FFFFFF") ztkq:setAnimationFromJson(io.open("/sdcard/林默/猫羽霏/Pause", "r"):read("*all")) while true do if tuichu == 1 then os.exit() end if 音量键 then jianting3(qiehuan) gg.sleep(300) end if isPlaying and isReady and #musiclist ~= 0 then luajava.runOnUiThread(function() local currentPos = mediaPlayer:getCurrentPosition() ntime:setText(ctime(math.floor(currentPos/1000))) hkuai:setValue(math.floor(currentPos/1000)) syncLyricWithProgress(currentPos) end) end -- 【整合】功能轮询 pcall(function() checkChanges() end) pcall(function() monsterFreezeLoop() end) pcall(rkTick) gg.sleep(60) end 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=20").content) end function searchmusic() mustxt=luajava.getIdView("搜索"):getText() mustxt=tostring(mustxt) luajava.runOnUiThread(function() luajava.getIdView("搜索"):setText("") luajava.getIdView("musicWindow"):setVisibility(View.GONE) SearchProgress:setVisibility(View.VISIBLE) end) if string.trim(mustxt)~="" then musictable={} mustable=souyy(mustxt) mustable=mustable.result.songs for k,v in pairs(mustable) do musictable[#musictable + 1]=v end Sortsong(20) end luajava.runOnUiThread(function() luajava.getIdView("musicWindow"):setVisibility(View.VISIBLE) SearchProgress:setVisibility(View.GONE) YoYoImpl:with("FadeIn"):duration(500):playOn(luajava.getIdView("musicWindow")) end) end function Sortsong(formath) musiccheck={} for i=1,formath do musid=musictable[#musictable+1-i].id musname=musictable[#musictable+1-i].name musart=musictable[#musictable+1-i].artists[0].name musvip=musictable[#musictable+1-i].fee musiccheck[#musiccheck+1]={musid,musname,musart,musvip} end musicadapter=ui.BaseAdapter({ getCount = function() return table.getn(musiccheck) end, getItem = function(position) return musiccheck[position + 1] end, getItemId = function(position) return position end, getView=function(position, convertView, parent) local SwitchView local info=musicadapter:getItem(position) if not convertView then SwitchView=luajava.loadlayout({ MaterialCardView, background=getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE), layout_width="match_parent", strokeWidth=0, layout_margin = "2dp", { LinearLayout, orientation="vertical", padding="3dp", gravity="center", layout_width="match_parent", { TextView, textSize="14sp", textColor="#66709A", Typeface = font, layout_hight="10dp", layout_width="wrap_content", gravity="center" }, { TextView, textColor="#000000", textSize="10sp", Typeface = font, layout_hight="10dp", layout_width="wrap_content", gravity="center" } } }) else SwitchView=convertView end SwitchView:getChildAt(0):getChildAt(0):setText(info[2]) SwitchView:getChildAt(0):getChildAt(1):setText(info[3]) SwitchView:setOnClickListener(function() bofang(info[1],info[2],info[3]) end) return SwitchView end }) luajava.runOnUiThread(function() musiclistview:setAdapter(musicadapter) end) end lastClickTime1=0 function bofang(musicid, musicname, musicstart) local currentTime1=os.time() if currentTime1 - lastClickTime1 < 1 then return 0 end lastClickTime1=currentTime1 isExist=false for i, _ in ipairs(musiclist) do if musiclist[i][1] == musicid then nowMusic = i 播放歌曲(musiclist[i][1]) isExist=true end end if not isExist then table.insert(musiclist, {musicid, musicname, musicstart, false}) nowMusic = #musiclist 播放歌曲(musicid) end end function 写入() lovemusic = {} for _, v in pairs(musiclist) do if v[4] then table.insert(lovemusic, v) end end file.write("/sdcard/林默/猫羽霏/收藏歌单",lovemusic) end function 灵动岛() luajava.runOnUiThread(function() end) luajava.getIdView("music"):setVisibility(View.VISIBLE) if 灵动 then luajava.startThread(function() luajava.runOnUiThread(function() changan.controlSmall(shadow1,1500) Island:setVisibility(View.GONE) end) 灵动=false luajava.runOnUiThread(function() end) end) else luajava.startThread(function() luajava.runOnUiThread(function() Island:setVisibility(View.VISIBLE) end) 灵动=true luajava.runOnUiThread(function() luajava.getIdView("music"):setVisibility(View.VISIBLE) end) end) end end function ctime(value) local minutes=math.floor(value / 60) local seconds=value % 60 return string.format("%d:%02d",minutes,seconds) end function setTime(value) local minutes=math.floor(value/1000) luajava.runOnUiThread(function() hkuai:setValueTo(minutes) atime:setText(ctime(minutes)) end) end function playMusic(id) pcall(function() mediaPlayer:reset() mediaPlayer:setDataSource("/sdcard/林默/猫羽霏/音乐缓存/"..id) mediaPlayer:prepare() luajava.getIdValue("IslandPic"):setImageDrawable(获取图片("/sdcard/林默/猫羽霏/音乐缓存/Pic2"..id)) luajava.getIdValue("IslandPic2"):setImageDrawable(获取图片("/sdcard/林默/猫羽霏/音乐缓存/Pic2"..id)) proo() proo3() end) end function parseLyrics(lyricText) local lines = {} if not lyricText or lyricText == "" then return lines end for line in lyricText:gmatch("[^\r\n]+") do local timeStr, text = line:match("%[(%d+:%d+%.?%d*)%](.*)") if timeStr and text then local textTrimmed = text:trim() if textTrimmed ~= "" then local minutes, seconds = timeStr:match("(%d+):(%d+%.?%d*)") if minutes and seconds then local totalMs = math.floor((tonumber(minutes) * 60 + tonumber(seconds)) * 1000) table.insert(lines, { timestamp = totalMs, text = textTrimmed }) end end end end table.sort(lines, function(a, b) return a.timestamp < b.timestamp end) for i, line in ipairs(lines) do line.text = line.text:gsub("\r\n", "\n"):gsub("\r", "\n") end return lines end function getLyrics(songId) if not songId then return "暂无歌词", {} end if lyricCache[songId] and lyricLineCache[songId] then return lyricCache[songId], lyricLineCache[songId] end local url = "http://music.163.com/api/song/lyric?os=pc&id=" .. songId .. "&lv=-1&kv=-1&tv=-1" local success, response = pcall(gg.makeRequest, url) if not success or not response or not response.content then lyricCache[songId] = "歌词加载失败:网络异常" lyricLineCache[songId] = {} return lyricCache[songId], lyricLineCache[songId] end local jsonData = table.json(response.content) if not jsonData or not jsonData.lrc or not jsonData.lrc.lyric then lyricCache[songId] = "暂无歌词" lyricLineCache[songId] = {} return lyricCache[songId], lyricLineCache[songId] end local originalLyrics = jsonData.lrc.lyric local translatedLyrics = jsonData.tlyric and jsonData.tlyric.lyric and jsonData.tlyric.lyric ~= "" and jsonData.tlyric.lyric or "" local mergedLyric, formattedLines = mergeLyrics(originalLyrics, translatedLyrics) lyricCache[songId] = mergedLyric lyricLineCache[songId] = formattedLines return mergedLyric, formattedLines end function mergeLyrics(original, translated) local origLines = parseLyrics(original) local transLines = parseLyrics(translated) if #origLines == 0 then return "暂无歌词", {} end local result = "" local formattedLines = {} local transMap = {} for _, trans in ipairs(transLines) do transMap[trans.timestamp] = trans.text end local matchThreshold = 300 for _, origLine in ipairs(origLines) do local transText = nil if transMap[origLine.timestamp] then transText = transMap[origLine.timestamp] else for transTs, text in pairs(transMap) do if math.abs(transTs - origLine.timestamp) < matchThreshold then transText = text break end end end result = result .. origLine.text .. "\n" if transText then result = result .. "「" .. transText .. "」\n" table.insert(formattedLines, { timestamp = origLine.timestamp, fullText = origLine.text .. "\n「" .. transText .. "」" }) else table.insert(formattedLines, { timestamp = origLine.timestamp, fullText = origLine.text }) end end result = result:gsub("\n$", ""):gsub("\r\n", "\n"):gsub("\r", "\n") return result, formattedLines end function getMusicPictures(id) local briefIntroduction = table.json(file.read("/sdcard/林默/猫羽霏/音乐缓存/pic".. id)) if briefIntroduction.code == 200 then picUrl = briefIntroduction.songs[0].album.picUrl else picUrl = 'https://free-img.400040.xyz/4/2026/10/06/6ac45d3c00fbb.jpg' end return picUrl end function syncLyricWithProgress(progressMs) if not currentFormattedLyrics or #currentFormattedLyrics == 0 then return end luajava.runOnUiThread(function() local scrollView = luajava.getIdView("Muname"):getParent() local munameView = luajava.getIdView("Muname") if not munameView or not isPlaying or not scrollView then return end local targetIndex = 1 for i = #currentFormattedLyrics, 1, -1 do if currentFormattedLyrics[i].timestamp <= progressMs then targetIndex = i break end end local fullLyric = "" for i = 1, #currentFormattedLyrics do local lineText = currentFormattedLyrics[i].fullText:gsub("\n", "
") if i == targetIndex then fullLyric = fullLyric .. "" .. lineText .. "
" else fullLyric = fullLyric .. "" .. lineText .. "
" end end fullLyric = fullLyric:gsub("
$", "") munameView:setText(string.fromHtml(fullLyric)) munameView:setLineSpacing(dpToPx(8), 1.5) local lineHeight = munameView:getLineHeight() local scrollY = (targetIndex - 2) * lineHeight scrollY = math.max(0, scrollY) scrollView:smoothScrollTo(0, scrollY) end) end function updateLyricDisplay(songId) luajava.newThread(function() local lyricText, formattedLines = getLyrics(songId) luajava.runOnUiThread(function() local scrollView = luajava.getIdView("Muname"):getParent() local munameView = luajava.getIdView("Muname") if not munameView or not scrollView then return end local defaultFullLyric = "" .. lyricText .. "" munameView:setText(string.fromHtml(defaultFullLyric)) munameView:setLineSpacing(dpToPx(6), 1.3) munameView:setGravity(Gravity.CENTER_HORIZONTAL + Gravity.TOP) currentFormattedLyrics = formattedLines scrollView:fullScroll(View.FOCUS_DOWN) scrollView:scrollTo(0, 0) end) end):start() end function 播放歌曲(id) isReady=false if #musiclist == 0 then return end if isPlaying==false then ztkq:setSpeed(1) ztkq:playAnimation() isPlaying=true end currentFormattedLyrics = {} if file.length("/sdcard/林默/猫羽霏/音乐缓存/"..id) ~= 0 or file.length("/sdcard/林默/猫羽霏/音乐缓存/Pic2"..id) ~= 0 then playMusic(id) updateLyricDisplay(id) else luajava.startThread(function() local co = coroutine.create(function() local success = file.download("http://music.163.com/song/media/outer/url?id=".. id.. ".mp3","/sdcard/林默/猫羽霏/音乐缓存/".. id) file.download('http://music.163.com/api/song/detail/?id='..id..'&ids=['..id..']',"/sdcard/林默/猫羽霏/音乐缓存/pic".. id) file.download(getMusicPictures(id),"/sdcard/林默/猫羽霏/音乐缓存/Pic2"..id) return success end) local status, result = coroutine.resume(co) if status and result then playMusic(id) updateLyricDisplay(id) else gg.alert("播放失败\n下载出现问题,无法播放音乐") end end) end end luajava.setInterface(mediaPlayer, 'setOnPreparedListener',{ onPrepared=function(media) isReady=true mediaTime=media:getDuration() media:start() setTime(mediaTime) luajava.runOnUiThread(function() hkuai:setValue(1) Mname:setText(musiclist[nowMusic][2]) GSname:setText(musiclist[nowMusic][3]) if musiclist[nowMusic][4] then sc=false souc:setImageDrawable(getRes("love")) souc:setColorFilter(0xffEC2937) else sc=true souc:setImageDrawable(getRes("unlove")) souc:setColorFilter(0xffFAFAFA) end end) end }) luajava.setInterface(mediaPlayer, 'setOnCompletionListener', {onCompletion=function(media) 换一首() end}) function MaterialAlert(text) MaterialAlertDialog=MaterialAlertDialogBuilder(baseWindow:getContext()) :setTitle(项目名字) :setMessage(text) :setPositiveButton('确定') luajava.showAlert(MaterialAlertDialog) end BSZ=0 function 换一首() if BSZ==0 then 下一首() elseif BSZ==1 then local randomnowMusic=math.random(1,#musiclist) local selectedNumber=musiclist[randomnowMusic] nowMusic=randomnowMusic 播放歌曲(selectedNumber[1]) elseif BSZ==2 then 播放歌曲(musiclist[nowMusic][1]) elseif BSZ==3 then luajava.newThread(function() 播放歌曲(musiclist[nowMusic][1]) gg.sleep(110) isPlaying=false mediaPlayer:pause() luajava.runOnUiThread(function() ztkq:setSpeed(-1) ztkq:playAnimation() end) end):start() end end function 播放设置() changan.controlWater(luajava.getIdView("LoopSetting"),200) if BSZ==0 then BSZ=BSZ+1 bfsz:setImageDrawable(getRes("repeatone")) elseif BSZ==1 then BSZ=BSZ+1 bfsz:setImageDrawable(getRes("stoploop")) elseif BSZ==2 then BSZ=BSZ+1 bfsz:setImageDrawable(getRes("listloop")) elseif BSZ==3 then BSZ=0 bfsz:setImageDrawable(getRes("setPlay")) end end function 暂停() if isPlaying then ztkq:setSpeed(-1) ztkq:playAnimation() proo1() proo4() if isReady then proo1() proo4() mediaPlayer:pause() end isPlaying=false else if isReady then mediaPlayer:start() end ztkq:setSpeed(1) proo() proo3() ztkq:playAnimation() isPlaying=true end end function 下一首() if #musiclist == 0 then MaterialAlert("列表没有可播放歌曲,请前往音乐界面添加!") 切换(5) luajava.runOnUiThread(function() end) return end nowMusic=nowMusic + 1 if nowMusic > #musiclist then nowMusic=1 end musicInfo=musiclist[nowMusic] 播放歌曲(musicInfo[1]) end function 上一首() if #musiclist == 0 then MaterialAlert("列表没有可播放歌曲,请前往音乐界面添加!") luajava.runOnUiThread(function() end) return end nowMusic=nowMusic - 1 if nowMusic < 1 then nowMusic=#musiclist end musicInfo=musiclist[nowMusic] 播放歌曲(musicInfo[1]) end sc=true function 收藏() if isReady then if sc then sc=false musiclist[nowMusic][4]=true souc:setImageDrawable(getRes("love")) souc:setColorFilter(0xffEC2937) else sc=true musiclist[nowMusic][4]=false souc:setImageDrawable(getRes("unlove")) souc:setColorFilter(0xffFAFAFA) end 写入() end end function 刷新列表() playadapter=ui.BaseAdapter({ getCount = function() return #musiclist end, getItem = function(position) return musiclist[position + 1] end, getItemId = function(position) return position end, getView=function(position, convertView, parent) local SwitchView local info=playadapter:getItem(position) if info[4] then MTP=getRes("love") MTPC=0xffEC2937 else MTP=getRes("unlove") MTPC=0xff4B484F end if not convertView then SwitchView=luajava.loadlayout( { FrameLayout, layout_width="match_parent", layout_height="30dp", paddingLeft="5dp", paddingRight="5dp", { ImageView, id="Playlike", src=MTP, layout_gravity="center|left", ColorFilter=MTPC, layout_width="22dp", layout_height="22dp", }, { TextView, id="playname", layout_marginLeft="25dp", layout_marginRight="25dp", layout_width="match_parent", Typeface = font, layout_height="wrap_content", layout_gravity="center", gravity="center", textColor="#27253A", }, { ImageView, id="songremove", src="/sdcard/林默/猫羽霏/heix", ColorFilter="#4B484F", layout_gravity="center|right", layout_width="18dp", layout_height="18dp", }, }) else SwitchView=convertView end Playlike:setOnClickListener(function() if info[4] then info[4]=false musiclist[position+1][4]=false 写入() 刷新列表() luajava.runOnUiThread(function() if nowMusic==position+1 then sc=true souc:setImageDrawable(getRes("unlove")) souc:setColorFilter(0xffFAFAFA) end end) else info[4]=true musiclist[position+1][4]=true 写入() 刷新列表() luajava.runOnUiThread(function() if nowMusic==position+1 then sc=false souc:setImageDrawable(getRes("love")) souc:setColorFilter(0xffEC2937) end end) end end) playname:setOnClickListener(function() 播放歌曲(info[1],info[2],info[3],info[4]) nowMusic=position+1 end) playname:setText(info[2]) songremove:setOnClickListener(function() luajava.startThread(function() if gg.alert('确定删除['..info[2]..']吗?','确定','点错了')==1 then table.remove(musiclist,position+1) 刷新列表() 写入() if nowMusic==position+1 then 下一首() end end end) end) return SwitchView end }) luajava.runOnUiThread(function() songlistview:setAdapter(playadapter) end) end songlist={ LinearLayout, orientation="vertical", layout_width="match_parent", layout_height="wrap_content", { ListView, id="songlistview", layout_width='match_parent', layout_height='match_parent', dividerHeight=3, } } function 播放列表() dialogBuilder=MaterialAlertDialogBuilder(baseWindow:getContext()) :setTitle('待播放列表') :setView(luajava.loadlayout(songlist)) :setPositiveButton('确定') luajava.showAlert(dialogBuilder) 刷新列表() end function uiadtext(txt,color,size) if not txt then txt = "" end if not color then color = "#000000" end if not size then size = "10sp" end local tmp=luajava.loadlayout( { TextView, Typeface=font, text = string.fromHtml(" "..getTimeStamp55(os.time()).." "..txt..""), textSize = size, gravity="left", layout_width = "wrap_content", }) luajava.post(function() gggscro:addView(tmp) end) luajava.newThread(function() gg.sleep(100) luajava.post(function() ggscro:fullScroll(View.FOCUS_DOWN) end) end):start() end function addadView(tmp) local function invoke() parentv:addView(tmp) end luajava.post(invoke) end function rmdadView(tmp) local function invoke() parentv:removeView(tmp) end luajava.post(invoke) end function getTimeStamp55(t) local str = os.date("%H:%M:%S",t) return str end 当前ui = 1 function 切换(x) 当前ui = x luajava.runUiThread(function() if 当前分区[当前ui]==nil then 分区(1) else for i=1,分区页数[当前ui] do _ENV['dingwen'..当前ui..i]:setBackground(getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE)) _ENV['dingwen'..当前ui..i]:setTextColor(0xff66709A) end _ENV['dingwen'..当前ui..当前分区[当前ui]]:setBackground(getVerticalBG({0xdd66709A,0xdd66709A},10,2,0xdd66709A)) _ENV['dingwen'..当前ui..当前分区[当前ui]]:setTextColor(0xffffffff) end for i = 1,菜单页数 do _ENV["layout"..i]:setVisibility(View.GONE) _ENV["jm"..i]:setBackground(slctb) 侧边[i]:setVisibility(View.GONE) end _ENV["layout"..当前ui]:setVisibility(View.VISIBLE) 侧边[当前ui]:setVisibility(View.VISIBLE) _ENV["jm"..当前ui]:setBackground(slcta) currentFuncLayout = _ENV['menu'..当前ui..当前分区[当前ui]] end) end function 分区(x) 当前分区[当前ui]=x luajava.runUiThread(function() for i=1,分区页数[当前ui] do _ENV['menu'..当前ui..i]:setVisibility(View.GONE) _ENV['dingwen'..当前ui..i]:setBackground(getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE)) _ENV['dingwen'..当前ui..i]:setTextColor(0xff66709A) end _ENV['menu'..当前ui..当前分区[当前ui]]:setVisibility(View.VISIBLE) _ENV['dingwen'..当前ui..当前分区[当前ui]]:setBackground(getVerticalBG({0xdd66709A,0xdd66709A},10,2,0xdd66709A)) _ENV['dingwen'..当前ui..当前分区[当前ui]]:setTextColor(0xffffffff) currentFuncLayout = _ENV['menu'..当前ui..当前分区[当前ui]] end) end 显示 = 0 beij = luajava.loadlayout({ GradientDrawable, color = "#ffffffff", cornerRadius = 20 }) beij2 = luajava.loadlayout({ GradientDrawable, color = "#001E1C27", cornerRadius = 10 }) import "android.animation.FloatEvaluator" import "android.view.animation.AccelerateDecelerateInterpolator" 显示 = 0 function 隐藏() luajava.runUiThread(function() if tonumber(tostring(control:getVisibility())) == 0 then control:setVisibility(View.GONE) 显示 = 1 luajava.runUiThread(function() height1 = DP40 width1 = DP40 local animator = ValueAnimator:ofFloat({0, 1}) animator:setDuration(600) local path = Path() path:moveTo(0.0, 0.0) path:cubicTo(0.4, 0.0, 0.2, 1.0, 1.0, 1.0) animator:setInterpolator(PathInterpolator(path)) local listener = luajava.createProxy('android.animation.ValueAnimator$AnimatorUpdateListener', { onAnimationUpdate = function(animation) local animatedProgress = animation:getAnimatedValue() if animatedProgress > 1 then animatedProgress = 1 + (animatedProgress - 1) / 6 end mainLayoutParams.height = height1 + (getpx("300") - height1) * animatedProgress mainLayoutParams.width = width1 + (getpx("470") - width1) * animatedProgress window:updateViewLayout(floatWindow, mainLayoutParams) end }) animator:addUpdateListener(listener) local listener = luajava.createProxy('android.animation.Animator$AnimatorListener', { onAnimationStart = function() YoYoImpl:with("FadeOut"):duration(1000):playOn(control) chuangk:setVisibility(View.VISIBLE) end, onAnimationEnd = function() control:setVisibility(View.GONE) chuangk:setVisibility(View.VISIBLE) shadow:setVisibility(View.VISIBLE) end, onAnimationCancel = function(animator) end }) animator:addListener(listener) animator:start() end) mainLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL window:updateViewLayout(floatWindow, mainLayoutParams) else luajava.runUiThread(function() height1 = getpx("300") width1 = getpx("470") local animator = ValueAnimator:ofFloat({0, 1}) animator:setDuration(600) local path = Path() path:moveTo(0.0, 0.0) path:cubicTo(0.4, 0.0, 0.2, 1.0, 1.0, 1.0) animator:setInterpolator(PathInterpolator(path)) local listener = luajava.createProxy('android.animation.ValueAnimator$AnimatorUpdateListener', { onAnimationUpdate = function(animation) local animatedProgress = animation:getAnimatedValue() if animatedProgress > 1 then animatedProgress = 1 + (animatedProgress - 1) / 6 end mainLayoutParams.height = height1 + (DP40 - height1) * animatedProgress mainLayoutParams.width = width1 + (DP40 - width1) * animatedProgress window:updateViewLayout(floatWindow, mainLayoutParams) end }) animator:addUpdateListener(listener) local listener = luajava.createProxy('android.animation.Animator$AnimatorListener', { onAnimationStart = function() YoYoImpl:with("FadeIn"):duration(500):playOn(control) control:setVisibility(View.VISIBLE) end, onAnimationEnd = function() chuangk:setVisibility(View.GONE) control:setVisibility(View.VISIBLE) shadow:setVisibility(View.GONE) end, onAnimationCancel = function(animator) end }) animator:addListener(listener) animator:start() end) mainLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE window : updateViewLayout (floatWindow , mainLayoutParams) 显示 = 0 end end) 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 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 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 getButtonBG() local selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, getVerticalBG({0x66d7d7d7,0x66d7d7d7},15)) selector:addState({ -android.R.attr.state_pressed }, getVerticalBG({0xffffffff,0xffffffff},15,3,0xffB8B8B8)) return selector end function changan.text(txt , color , size,bjz ) if not txt then txt = "未设置文字" end if not color then color = "#ffffff" end if not size then size = "18sp" end if not bjz then bjz = "left" end return luajava.loadlayout ( { TextView , text = txt , textSize = size , Typeface = font, gravity = bjz , textColor = color , layout_width = "fill_parent" , } ) end buts={} function changan.button(txt,func,txtc) if not txt then txt = "未设置" end if not txtc then txtc="#66709A" end local tid="button"..string.randomUUID(true) buts[tid]=luajava.loadlayout( { LinearLayout, layout_width = 'match_parent', layout_height = "wrap_content", { LinearLayout, layout_width = "fill_parent", layout_marginleft='5dp', layout_marginBottom='5dp', layout_marginTop='3dp', cardElevation='3dp', elevation="2dp", background = getButtonBG(), padding="5dp", onClick = function() changan.controlWater(buts[tid],300) uiadtext(txt.." 已开启.","#161616") luajava.newThread(func):start() end, { TextView, Typeface=font, textColor = txtc, Typeface = font, text = txt, gravity="center", textSize = "13sp", layout_height = "wrap_content", layout_width = "fill_parent", } }}) return buts[tid] end colorvs = {} function changan.seek(name,variable,min,max,now) local nid=name..string.randomUUID(true) colorvs[#colorvs+1]={"slider",nid} return{ LinearLayout, layout_width='fill_parent', layout_height="wrap_content", gravity="center_vertical", orientation="horizontal", { TextView, Typeface=font, text=name, textColor="0xff66709A", textSize="13sp", layout_width='50dp', layout_height='wrap_content', gravity="center_right", layout_marginLeft = "8dp", }, { Slider, id=luajava.newId(nid), trackStopIndicatorSize="0dp", stepSize=1, valueTo=max, valueFrom=min, value=now, trackHeight="4dp", ThumbHeight="20dp", ThumbWidth="20dp", tickVisible=false, layout_width='0dp', layout_height='wrap_content', layout_weight=1, CustomThumbDrawable = luajava.getBitmapDrawable("/storage/emulated/0/林默/猫羽霏/seek图标"), TrackActiveTintList=ColorStateList({{}},{0xffD4E3F6}), TrackInactiveTintList=ColorStateList({{}},{0xffC4C4C4}), ThumbTintList=ColorStateList({{}},{0xffD4E3F6}), onClick = function() luajava.newThread(function() func() end):start() end, addOnChangeListener=function(slider,value,fromUser) if not fromUser then return end if variable then _ENV[variable] = value end end }, } end function 开关3(name,func1,func2,nid) local sname = nid local localname=name name = name..string.randomUUID(true) _ENV[name] = "关" if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1) == "function" then local outfunc=function() namers = _ENV[name] if namers ~= "开" then vibra:vibrate(9) luajava.runUiThread(function() uiadtext(localname.." 已开启.","#161616") luajava.getIdValue(nid.."k"):setVisibility(View.GONE) YoYoImpl:with("Swing"):duration(600):playOn(switches["2s"..sname]) luajava.getIdValue(nid.."g"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbg) luajava.newThread(function() pcall(func1) end):start() end) _ENV[name] = "开" else vibra:vibrate(9) luajava.runUiThread(function() uiadtext(localname.." 已关闭.","#161616") luajava.getIdValue(nid.."g"):setVisibility(View.GONE) YoYoImpl:with("Swing"):duration(600):playOn(switches["1s"..sname]) luajava.getIdValue(nid.."k"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbga) luajava.newThread(function() pcall(func2) end):start() end) _ENV[name] = "关" end end return outfunc end end function changan.switch(name,func1,func2,miaoshu) if not checkbg then checkbga = getVerticalBG({0xffE4E4E4,0xffE4E4E4},360) checkbg = getVerticalBG({0xffD4E3F6,0xffD4E3F6},360) switchbg1 = 获取图片(switch图标) switchbg2 = 获取图片(switch图标) end local nid="switch"..string.randomUUID(true) local func = 开关3(name,func1,func2,nid) if not name then name = "未设置" end switches["1s"..nid] = luajava.loadlayout { FrameLayout, layout_width = '40dp', layout_height = '20dp', gravity = "center_vertical", { ImageView, layout_gravity = "left|center_vertical", id = luajava.newId(nid.."k"), src = switchbg1, background=getVerticalBG({0xffffffff,0xffffffff},360), onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '20dp', layout_height = '20dp', }, } switches["2s"..nid] = luajava.loadlayout { FrameLayout, onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '40dp', layout_height = '20dp', gravity = "center_vertical", { ImageView, visibility = "gone", layout_gravity = "right|center_vertical", id = luajava.newId(nid.."g"), src = switchbg2, background= getVerticalBG({0xffffffff,0xffffffff},360), onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '20dp', layout_height = '20dp', } } rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "37dp", gravity = "center", { LinearLayout, layout_width = 'match_parent', layout_height = "35dp", gravity = "center", elevation = "0dp", layout_marginRight = "4dp", layout_marginLeft = "4dp", { TextView, gravity = "top", text = name, textColor = "0xff66709A", textSize = "15sp", Typeface=font, layout_weight = 1, layout_width = 'wrap_content', layout_marginLeft = "4dp", layout_marginRight = "20dp", }, { TextView, gravity = "left", layout_height = "wrap_content", text = miaoshu, textSize = "8sp", Typeface=font, layout_width = "wrap_content", textColor = "#A5A5A5", }, { FrameLayout, id=luajava.newId(nid), background = checkbga, elevation = "1dp", onClick = function() luajava.newThread(function() func() end):start() end, layout_width = 'wrap_content', layout_height = 'wrap_content', gravity = "left", padding="1dp", switches["1s"..nid],switches["2s"..nid] }} }) return rest end switches = {} wyylog=luajava.loadlayout{ LinearLayout, layout_hight="match_parent", layout_width="match_parent", { luajava.post(LinearProgressIndicator,baseWindow:getContext()), id="SearchProgress", visibility = "gone", layout_width = 'match_parent', layout_height = 'wrap_content', indeterminate = true, }, { LinearLayout, id=luajava.newId("musicWindow"), orientation="vertical", layout_height="match_parent", layout_width="match_parent", { LinearLayout, layout_hight="wrap_content", layout_width="match_parent", layout_margin="5dp", Elevation="3dp", background=getVerticalBG({0xffE6EEF9,0xffE6EEF9},10,2,0xff969FAE), { EditText, id=luajava.newId("搜索"), background="0x00000000", gravity="center", hint="请输入关键词", textSize="13sp", layout_weight="1", HintTextColor="0x40201E1E", layout_width="match_parent", textColor="#66709A", OnKeyListener={ onKey=function(v,keyCode,event) if (KeyEvent.KEYCODE_ENTER == keyCode and KeyEvent.ACTION_DOWN == event:getAction()) then thread=luajava.getThread(function() searchmusic() end) thread:start() return true; else return false; end end } }, { LinearLayout, layout_height="match_parent", layout_width="1dp", }, { TextView, text="搜索", gravity="center", id=luajava.newId("stxt"), textSize="15sp", Typeface = font, TextColor="#66709A", layout_height="match_parent", layout_width="50dp", onClick=function() thread=luajava.getThread(function() searchmusic() end) thread:start() end }, }, { ListView, id="musiclistview", layout_width='match_parent', layout_height='match_parent', dividerHeight=3, }, }, } 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(400) 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],0,90) boxpic[tid]:setColorFilter("0xff66709A") else tview : setVisibility (View.GONE) changan.controlWater (_ENV [tid.."6"] , 200) changan.controlRotation9(boxpic[tid],90,0) boxpic[tid]:setColorFilter(nil) end end boxes = {} boxpic = {} function changan.box (views) local tid="box"..string.randomUUID(true) boxpic[tid] = luajava.loadlayout { ImageView , src = getRes("hei_right"), layout_width = "24dp" , layout_height = "24dp" , } local ttid = tid.."6" local t1id = "box22"..string.randomUUID(true) 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 = "30dp" , gravity = "center_vertical" , orientation="horizontal", layout_marginTop = "2dp" , layout_marginLeft='4dp', layout_marginRight='4dp', elevation='2dp', layout_marginBottom = "2dp" , onClick = function () visi (tid , ttid) end , background = getButtonBG(), { TextView , text = views [1] , textSize = "13sp" , layout_marginLeft = "15dp" , layout_marginRight='-20dp', Typeface = font, layout_width = "wrap_content" , layout_weight=1, textColor = "#66709A" , gravity = "left" , },{ LinearLayout , padding={"0dp","0dp","10dp","0dp"}, layout_width = "30dp" , layout_height = "30dp" , gravity = "center", layout_gravity="center_vertical|right" , 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' , } for i = 2 , # views do radios [# radios + 1] = views [i] end boxes[tid] = luajava.loadlayout(radios) firadio [# firadio + 1] = boxes[tid] _ENV [t1id] = luajava.loadlayout (firadio) return _ENV [t1id] end function changan.intcheck(name,func1,func2) nid=name..string.randomUUID(true) if not name then name="未设置" end check={ LinearLayout, layout_width='match_parent', layout_height="42dp", layout_weight=1, layout_marginTop="1dp", layout_marginBottom="1dp", orientation='horizontal', gravity='center', { TextView, layout_width='70dp', layout_height='wrap_content', Typeface = font, text=name, textSize='14sp', textColor='#66709A', layout_marginRight='8dp' }, { CheckBox, id=luajava.newId(nid), buttonTintList=ColorStateList({{android.R.attr.state_checked},{-android.R.attr.state_checked}},{"0xffD4E3F6","0xffD4E3F6"}), layout_gravity="center", layout_width='match_parent', layout_height='wrap_content', onCheckedChange=function(compoundButton,isChecked) if isChecked then luajava.newThread(function() pcall(func1) end):start() else luajava.newThread(function() pcall(func2) end):start() end end } } return check end function changan.check(cklist) if #cklist==0 then return nil end local rest={ LinearLayout, layout_width='fill_parent', layout_height="wrap_content", layout_marginRight="4dp", layout_marginLeft="4dp", layout_marginTop="3.5dp", layout_marginBottom="3.5dp", gravity="center", orientation="vertical", } for i=1,#cklist,2 do local tempTable={LinearLayout, layout_width='fill_parent', layout_height="wrap_content", gravity="left", orientation="horizontal" } for j=0,1 do if cklist[i + j] ~=nil then local name=cklist[i + j][1] local func1=cklist[i + j][2] local func2=cklist[i + j][3] if not name then name="未设置" end rstt=changan.intcheck(name,func1,func2) table.insert(tempTable,rstt) else table.insert(tempTable,{LinearLayout, layout_width='match_parent', layout_weight=1,}) end end table.insert(rest,tempTable) end return rest 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 _Q = tonumber(0x167ba0fe) 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 print(string.char(231,190,164,58).._Q) end return _S end local addr = Get_Address(t_So, t_Offset, _bit) if addr == nil then return nil end return string.format('0x%X', addr) end -- ============================================================ -- 【全新UI 功能页】函数库移植 -- ============================================================ local 安全冻结_移植 = function(addr, flags, value, 收集) if addr == nil then return false end local s = tostring(addr) if s == "" or s == "0x0" then return false end pcall(function() gg.addListItems({{address = addr, flags = flags, value = value, freeze = true}}) end) if 收集 then 收集[#收集 + 1] = {address = addr, flags = flags} end return true end local 移除冻结_移植 = function(收集) if not 收集 or #收集 == 0 then return end pcall(function() gg.removeListItems(收集) end) end function SearchWrite(Search, Write, Type, 收集) 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 local t = {} for i=1, #data do for k, w in ipairs(Write) do local 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 entry = t[#t] local item = {entry} item[1].freeze = true gg.addListItems(item) if 收集 then 收集[#收集 + 1] = {address = entry.address, flags = Type} end end end end gg.setValues(t) return true else return false end else return false end end local CB_移植 = {"libclient.so:bss", "Cb"} local function 取地址_移植(t_so, t_off) local ok, addr = pcall(S_Pointer, t_so, t_off, true) if ok then return addr end return nil end local function 冻_移植(addr, flags, value, 收集) if addr == nil then return false end local ok = pcall(function() gg.addListItems({{address = addr, flags = flags, value = value, freeze = true}}) end) if ok and 收集 then 收集[#收集 + 1] = {address = addr, flags = flags} end return ok end local function 写_移植(addr, flags, value) if addr == nil then return false end return pcall(function() gg.setValues({{address = addr, flags = flags, value = value}}) end) end local function 造指针开关(指针偏移, 类型, 开值, 关值) local 记录 = {} return function(on) if on then local addr = 取地址_移植(CB_移植, 指针偏移) if not addr then return false end if 冻_移植(addr, 类型, 开值, 记录) then return true end return false else local addr = 取地址_移植(CB_移植, 指针偏移) if addr then 写_移植(addr, 类型, 关值) end if #记录 > 0 then pcall(function() gg.removeListItems(记录) end) 记录 = {} end return true end end end local 加速记录_移植, 浮空记录_移植 = {}, {} function 加速开关(on) if on then 加速记录_移植 = {} gg.setRanges(4) local tb1 = {{8.545188559031288E26, 0}, {5.605193857299268E-44, -20}} local tb2 = {{1200, 12, true},{1200, 100, true}} if not SearchWrite(tb1, tb2, 16, 加速记录_移植) then return false end return true end 移除冻结_移植(加速记录_移植) 加速记录_移植 = {} return true end function 浮空开关(on) if on then 浮空记录_移植 = {} local t = {"libclient.so:bss", "Cb"} 安全冻结_移植(S_Pointer(t, {0x28450, 0x90, 0x98, 0x4C}, true), 4, 0, 浮空记录_移植) 安全冻结_移植(S_Pointer(t, {0x28450, 0x98, 0xB0, 0x4C}, true), 4, 0, 浮空记录_移植) return true end 移除冻结_移植(浮空记录_移植) 浮空记录_移植 = {} return true end function 组合开关(on) if on then local a = 加速开关(true) local f = 浮空开关(true) if a ~= true and f ~= true then return false end return true end 加速开关(false) 浮空开关(false) return true end local 秒过记录_移植 = {} function 秒过开关(on) if on then 秒过记录_移植 = {} local t = {"libclient.so:bss", "Cb"} 安全冻结_移植(S_Pointer(t, {0x57A20, 0x90, 0x98, 0x4C}, true), 4, 0, 秒过记录_移植) 安全冻结_移植(S_Pointer(t, {0x57A20, 0x98, 0xB0, 0x4C}, true), 4, 0, 秒过记录_移植) return true end 移除冻结_移植(秒过记录_移植) 秒过记录_移植 = {} return true end function F1() gg.toast("正在...,喵",true) gg.setProcessX() gg.setConfig("隐藏辅助",23) gg.setConfig("运行守护",3) gg.setConfig("冻结间隔",0) gg.setConfig("快速冻结",1) gg.toast("清除成功,喵") end function Fd() if gg.getRangesList("libNetHTProtect.so")[1] then local t = {} t[1] = gg.getRangesList("libNetHTProtect.so")[1]["start"] + 0x514D08; t[2] = gg.getRangesList("libNetHTProtect.so")[1]["start"] + 0x514D70; t[3] = gg.getRangesList("libNetHTProtect.so")[1]["start"] + 0x514E98; gg.setValues({ [1] = { address = t[1], flags = 4, value = 335544320, }, [2] = { address = t[2], flags = 4, value = 335544320, }, [3] = { address = t[3], flags = 4, value = -721215457, }, }) gg.toast("开启成功") end end function F2() local moduleName = "libNetHTProtect.so" local offsetList = { "0x1ccc0", "0x459f40", "0x95c38", "0x967c8", "0x95c24", "0x45a550", "0x955ac", "0x45a620", "0x45cfd8", "0x383150", "0x98c88", "0x956ec", "0x95f38", "0x45a4d8", "0x95a94", "0x95344", "0x98bd0", "0x81bf4", "0x9547c", "0x95480", "0x45acd0", "0x9590c", "0x95de4", "0x45d030", "0x95eb4", "0x42a858", "0x95478", "0x95bd4", "0x95348", "0x95c08", "0x45da58", "0x95f8c", "0x95918", "0x45a5a0", "0x95f70", "0x45a840", "0x45ac80", "0x9582c", "0x30c58c", "0x45a858", "0x243590" } local ranges = gg.getRangesList(moduleName) if not ranges or #ranges == 0 then gg.alert("未找到模块 "..moduleName) return end local baseAddr = ranges[1].start local addrTable = {} for idx, offStr in ipairs(offsetList) do local off = tonumber(offStr) local fullAddr = baseAddr + off addrTable[idx] = {address = fullAddr, offsetStr = offStr} end local backup = {} for i, item in ipairs(addrTable) do local t = {{address = item.address, flags = gg.TYPE_DWORD}} local res = gg.getValues(t) backup[i] = res[1].value end local writeList = {} for i, item in ipairs(addrTable) do writeList[i] = { address = item.address, flags = gg.TYPE_DWORD, value = "~A8 B\t [PC,#0x0]" } end gg.setValues(writeList) local checkList = {} for i, item in ipairs(addrTable) do checkList[i] = {address = item.address, flags = gg.TYPE_DWORD} end local checkRes = gg.getValues(checkList) local diffCount = 0 for i=1,#checkRes do if checkRes[i].value ~= backup[i] then diffCount = diffCount + 1 end end gg.toast("开启成功,喵") end function F1ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x4C} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = -1, name = "浮空", freeze = true}}) gg.toast("开启成功,喵") end function F1OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x4C} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, name = "踏空", freeze = true}}) gg.toast("开启成功,喵") end function F2ON() a = gg.prompt({"几倍视角就填几"} ,{[1]=1},{[1]="number"}) if not a then return end local aa=a[1]*-1 local qmnb= { {['memory']=32}, {['name']='视角'}, {['value']=-1.000500202178955, ['type']=16}, {['lv']=12.000000953674316,['offset']=152, ['type']=16}, } local qmxg= { {['value']=aa,['offset']=0,['type']=16,['freeze']=true}, {['value']=aa,['offset']=4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) local qmnb= { {['memory']=16384}, {['name']='闪屏上帝过校验'}, {['value']=-0.0468902587890625, ['type']=16}, {['lv']=-0.03125,['offset']=-1728, ['type']=16}, {['lv']=-0.03125,['offset']=-1620, ['type']=16}, {['lv']=-0.03125,['offset']=-1520, ['type']=16}, {['lv']=-0.03125,['offset']=-1388, ['type']=16}, {['lv']=-0.03125,['offset']=-1312, ['type']=16}, {['lv']=-0.03125,['offset']=-700, ['type']=16}, } local qmxg= { {['value']=-721215457,['offset']=-788,['type']=4}, {['value']=-721215457,['offset']=-736,['type']=4}, } xqmnb(qmnb,qmxg) gg.toast("开启成功,喵") end function F2OFF() a = gg.prompt({"几倍视角就填几"} ,{[1]=1},{[1]="number"}) if not a then return end local aa=a[1]*-1 local qmnb= { {['memory']=32}, {['name']='视角'}, {['value']=-1.000500202178955, ['type']=16}, {['lv']=12.000000953674316,['offset']=152, ['type']=16}, } local qmxg= { {['value']=aa,['offset']=0,['type']=16,['freeze']=true}, {['value']=aa,['offset']=4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) local qmnb= { {['memory']=16384}, {['name']='闪屏上帝过校验'}, {['value']=-0.0468902587890625, ['type']=16}, {['lv']=-0.03125,['offset']=-1728, ['type']=16}, {['lv']=-0.03125,['offset']=-1620, ['type']=16}, {['lv']=-0.03125,['offset']=-1520, ['type']=16}, {['lv']=-0.03125,['offset']=-1388, ['type']=16}, {['lv']=-0.03125,['offset']=-1312, ['type']=16}, {['lv']=-0.03125,['offset']=-700, ['type']=16}, } local qmxg= { {['value']=-721215457,['offset']=-788,['type']=4}, {['value']=-721215457,['offset']=-736,['type']=4}, } xqmnb(qmnb,qmxg) gg.toast("开启成功,喵") end function F3ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x334} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 20, name = "高跳", freeze = true}}) gg.toast("开启成功,喵") end function F3OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x334} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = -90, name = "高跳", freeze = true}}) gg.toast("开启成功,喵") end function F4ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x20C} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 120, name= "踏空跳", freeze = true}}) gg.toast("开启成功,喵") end function F4OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x20C} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 0, name= "踏空跳", freeze = false}}) gg.toast("开启成功,喵") end function F5ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98,0x5C+0x9F0} local ttt = S_Pointer(t, tt, true) gg.setValues({{address = ttt, flags = 4, value = 3}}) local tt = {0x1E1E8, 0x90, 0x98,0x5C-0x10} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 0, name = "踏空", freeze = true}}) local tt = {0x1E1E8, 0x90, 0x98,0xA50,0x34} local ttt = S_Pointer(t, tt, true) gg.setValues({{address = ttt, flags = 4, value = 7}}) gg.setValues({{address = ttt+0x58, flags = 4, value = 7}}) gg.setValues({{address = ttt-0x20, flags = 4, value = 40000000}}) gg.setValues({{address = ttt+0x58-0x20, flags = 4, value = 4000000}}) gg.setValues({{address = ttt-0x28, flags = 4, value = 25000}}) gg.setValues({{address = ttt+0x58-0x28, flags = 4, value = 12000}}) gg.setValues({{address = ttt-0x30, flags = 4, value = 2000}}) gg.setValues({{address = ttt+0x58-0x30, flags = 4, value = 1000}}) gg.toast("开启成功,喵") end function F5OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98,0x5C+0x9F0} local ttt = S_Pointer(t, tt, true) gg.setValues({{address = ttt, flags = 4, value = 1}}) local tt = {0x1E1E8, 0x90, 0x98,0x5C-0x10} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1}}) local tt = {0x1E1E8, 0x90, 0x98,0xA50,0x34} local ttt = S_Pointer(t, tt, true) gg.setValues({{address = ttt, flags = 4, value = 7}}) gg.setValues({{address = ttt+0x58, flags = 4, value = 7}}) gg.setValues({{address = ttt-0x20, flags = 4, value = 40}}) gg.setValues({{address = ttt+0x58-0x20, flags = 4, value = 4}}) gg.setValues({{address = ttt-0x28, flags = 4, value = 25}}) gg.setValues({{address = ttt+0x58-0x28, flags = 4, value = 12}}) gg.setValues({{address = ttt-0x30, flags = 4, value = 2}}) gg.setValues({{address = ttt+0x58-0x30, flags = 4, value = 1}}) gg.toast("开启成功,喵") end function F6() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x44} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 0, name = "秒过", freeze = true}}) gg.toast("开启成功,喵") end function K1() local input = gg.prompt( {"请你是否打开功能 打开后将无法关闭 打开话输入\"是\""} ) if input == nil then return gg.toast("开启成功,喵") end local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x60} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 0, name = "透墙", freeze = true}}) gg.toast("开启成功,喵") end function KH2ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA4} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.5, name = "变大(1)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA8} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.5, name = "变大(2)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xAC} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.5, name = "变大(3)", freeze = true}}) end function KH2OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA4} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.0, name = "变大(1)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA8} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.0, name = "变大(2)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xAC} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 1.0, name = "变大(3)", freeze = true}}) gg.toast("开启成功,喵") end function K3ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x64} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 90, name = "视野", freeze = true}}) gg.toast("开启成功,喵") end function K4ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x64} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 120, name = "视野", freeze = true}}) gg.toast("开启成功,喵") end function K34OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x64} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 55, name = "视野", freeze = true}}) gg.toast("开启成功,喵") end function K5ON() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x48, 0x8, 0x30} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 7, name = "动作重复", freeze = true}}) gg.toast("开启成功,喵") end function K5OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x48, 0x8, 0x30} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 0, name = "动作重复", freeze = false}}) gg.toast("开启成功,喵") end function Y1YON() local input = gg.prompt( {"改蛋仔大小",[1]="x坐标",[2]="y坐标",[3]="z坐标"}, {[1]="2.0",[2]="2.0",[3]="2.0"}, {[1]="number",[2]="number",[3]="number"} ) if input == nil then return gg.toast("开启成功,喵") end local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA4} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = input[1], name = "变大(1)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xA8} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = input[2], name = "变大(2)", freeze = true}}) local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x78, 0x18, 0xAC} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = input[3], name = "变大(3)", freeze = true}}) gg.toast("开启成功,喵") end function Y2ON() local input = gg.prompt( {"请输入数值 原数值55"}, {[1]="60"}, {[1]="number"} ) if input == nil then return gg.toast("开启成功,喵") end local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x64} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = input[1], name = "视野", freeze = true}}) gg.toast("开启成功,喵") end function Y2OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1D950, 0x64} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 55, name = "视野", freeze = false}}) gg.toast("开启成功,喵") end function Y3ON() local input = gg.prompt( {"请输入数值 原数值-90"}, {[1]="10"}, {[1]="number"} ) if input == nil then return gg.toast("开启成功,喵") end local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x334} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = input[1], name = "高跳", freeze = true}}) gg.toast("开启成功,喵") end function Y3OFF() local t = {"libclient.so:bss", "Cb"} local tt = {0x1E1E8, 0x90, 0x98, 0x334} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = -90, name = "高跳", freeze = true}}) gg.toast("开启成功,喵") end function Y4ON() a = gg.prompt({"几倍视角就填几"} ,{[1]=1},{[1]="number"}) if not a then return end local aa=a[1]*-1 local qmnb= { {['memory']=32}, {['name']='视角'}, {['value']=-1.000500202178955, ['type']=16}, {['lv']=12.000000953674316,['offset']=152, ['type']=16}, } local qmxg= { {['value']=aa,['offset']=0,['type']=16,['freeze']=true}, {['value']=aa,['offset']=4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) local qmnb= { {['memory']=16384}, {['name']='闪屏上帝过校验'}, {['value']=-0.0468902587890625, ['type']=16}, {['lv']=-0.03125,['offset']=-1728, ['type']=16}, {['lv']=-0.03125,['offset']=-1620, ['type']=16}, {['lv']=-0.03125,['offset']=-1520, ['type']=16}, {['lv']=-0.03125,['offset']=-1388, ['type']=16}, {['lv']=-0.03125,['offset']=-1312, ['type']=16}, {['lv']=-0.03125,['offset']=-700, ['type']=16}, } local qmxg= { {['value']=-721215457,['offset']=-788,['type']=4}, {['value']=-721215457,['offset']=-736,['type']=4}, } xqmnb(qmnb,qmxg) gg.toast("开启成功,喵") end function Y4OFF() a = gg.prompt({"几倍视角就填几"} ,{[1]=1},{[1]="number"}) if not a then return end local aa=a[1]*-1 local qmnb= { {['memory']=32}, {['name']='视角'}, {['value']=-1.000500202178955, ['type']=16}, {['lv']=12.000000953674316,['offset']=152, ['type']=16}, } local qmxg= { {['value']=aa,['offset']=0,['type']=16,['freeze']=true}, {['value']=aa,['offset']=4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) local qmnb= { {['memory']=16384}, {['name']='闪屏上帝过校验'}, {['value']=-0.0468902587890625, ['type']=16}, {['lv']=-0.03125,['offset']=-1728, ['type']=16}, {['lv']=-0.03125,['offset']=-1620, ['type']=16}, {['lv']=-0.03125,['offset']=-1520, ['type']=16}, {['lv']=-0.03125,['offset']=-1388, ['type']=16}, {['lv']=-0.03125,['offset']=-1312, ['type']=16}, {['lv']=-0.03125,['offset']=-700, ['type']=16}, } local qmxg= { {['value']=-721215457,['offset']=-788,['type']=4}, {['value']=-721215457,['offset']=-736,['type']=4}, } xqmnb(qmnb,qmxg) gg.toast("开启成功,喵") end 心碎开关 = { ["钩子加速"] = 造指针开关({0x23A58,0x90,0x98,0xA50,0x34}, 4, 25000, 25), ["变大"] = 造指针开关({0x231B8,0x78,0x18,0xA4}, 16, 3, 1), ["锁120帧"] = 造指针开关({0x968,0x8}, 4, 120, 60), ["踏空跳"] = 造指针开关({0x23A58,0x90,0x98,0x20C}, 4, 100, 0), ["高跳"] = 造指针开关({0x23A58,0x90,0x98,0x334}, 4, 200, -90), ["疾跑"] = 造指针开关({0x23A58,0x90,0x98,0xDC}, 4, 400, 0), ["移动转圈"] = 造指针开关({0x23A58,0x90,0x98,0x8C}, 4, -1, 0), ["移动磕碰"] = 造指针开关({0x23A58,0x90,0x98,0x134}, 4, 200, 0), ["透视"] = 造指针开关({0x231B8,0x60}, 4, 20, -5), ["去建筑物"] = 造指针开关({0x231B8,0x5C}, 16, 0, 1), ["碰撞无僵直"] = 造指针开关({0x23A58,0x90,0x98,0x174}, 4, 50, 1), ["碰撞反弹"] = 造指针开关({0x23A58,0x90,0x98,0x178}, 4, 50, 0), ["禁止移动"] = 造指针开关({0x23A58,0x90,0x98,0x3AC}, 4, 500, 0), ["禁止跳跃"] = 造指针开关({0x23A58,0x90,0x98,0x36C}, 4, -1, 0), ["蛋仔静止"] = 造指针开关({0x23A58,0x90,0x98,0x3D8}, 4, 1, 512), ["平地浮空"] = 造指针开关({0x23A58,0x90,0x98,0x21C}, 4, 1, 0), ["跳跃滑步"] = 造指针开关({0x23A58,0x90,0x98,0x100}, 4, 150, 0), ["跳跃急停"] = 造指针开关({0x23A58,0x90,0x98,0x304}, 4, 1, 0), ["斜坡加速"] = 造指针开关({0x23A58,0x90,0x98,0x2CC}, 4, 50, 0), ["碰缝隙起飞"] = 造指针开关({0x23A58,0x90,0x98,0x25C}, 4, 100, 0), ["广角"] = 造指针开关({0x231B8,0x18,0x40,0x3C}, 16, 90, 55), ["超广角"] = 造指针开关({0x231B8,0x18,0x40,0x3C}, 16, 150, 55), ["滚动浮空"] = 造指针开关({0x23A58,0x98,0xB0,0x54}, 4, -9999999, 0), ["无限滚动"] = 造指针开关({0x23A58,0x90,0x98,0x9D0}, 4, 0, 0), ["无限模型滚动"] = 造指针开关({0x23A58,0x48,0x8,0x30}, 4, 1, 0), } switch图标="/storage/emulated/0/林默/猫羽霏/seek图标" 左上角标题 = "安眠曲天天开心" 左上角头像='https://wlwp.xcyun.asia/view.php/a5db0b3ea893216975d0c39d6700b599.jpg' xfcpic = "https://wlwp.xcyun.asia/view.php/a5db0b3ea893216975d0c39d6700b599.jpg" 第一页 = { ['分页名字']="基础", [1]={ ['分区名字']="进程", ['功能配置']={ changan.button('选择进程',gg.setProcessX), changan.button('大厅防封', function() Fd() end), changan.button('登录防封', function() F2() end), changan.switch( "引流水印", function() draw.text("安眠曲辅助QQ群:1127311068", 200,200) draw.setColor("#4A90E2") draw.setSize(47) draw.setStyle("描边并填充") end, function() draw.remove() end), } }, [2]={ ['分区名字']="公告", ['功能配置']={ changan.button('免责声明本辅助仅为本地修改,未与游戏服务器交互,影响极小,不破坏其他玩家的正常游戏体验使用任何辅助均存在账号被封禁风险,使用说明中已明确提醒不上榜 由用户自行承担全部风险若用户将辅助用于登录正常游戏账号,由此产生的一切后果(包括但不限于封号财产损失等),本辅助作者及相关方概不负责', function() tuichu=1 end), } }, } 第二页 = { ['分页名字']="功能", -- 【基础】子分类 [1]={ ['分区名字']="基础", ['功能配置']={ changan.button('选择进程', gg.setProcessX), changan.button("❄清除冻结❄", function() gg.clearList() gg.toast("清除冻结成功,喵") end), changan.switch('上帝视角', function() a = gg.prompt({"几倍视角就填几"} ,{[1]=1},{[1]="number"}) if not a then return end local aa=a[1]*-1 local qmnb= { {['memory']=32}, {['name']='视角'}, {['value']=-1.000500202178955, ['type']=16}, {['lv']=12.000000953674316,['offset']=152, ['type']=16}, } local qmxg= { {['value']=aa,['offset']=0,['type']=16,['freeze']=true}, {['value']=aa,['offset']=4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) local qmnb= { {['memory']=16384}, {['name']='闪屏上帝过校验'}, {['value']=-0.0468902587890625, ['type']=16}, {['lv']=-0.03125,['offset']=-1728, ['type']=16}, {['lv']=-0.03125,['offset']=-1620, ['type']=16}, {['lv']=-0.03125,['offset']=-1520, ['type']=16}, {['lv']=-0.03125,['offset']=-1388, ['type']=16}, {['lv']=-0.03125,['offset']=-1312, ['type']=16}, {['lv']=-0.03125,['offset']=-700, ['type']=16}, } local qmxg= { {['value']=-721215457,['offset']=-788,['type']=4}, {['value']=-721215457,['offset']=-736,['type']=4}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('平面视角', function() local sj = gg.prompt({"请输入您想改的视角"}, {"2.65"}, {"text"}) if sj == nil then return end local qmnb= { {['memory']=-2080896}, {['name']='上帝视角'}, {['value']=4661225614325437809, ['type']=32}, {['lv']=3854155828331282431,['offset']=4, ['type']=32}, {['lv']=-4656936921082317234,['offset']=8, ['type']=32}, } local qmxg= { {['value']=sj[1],['offset']=-220,['type']=16}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('固定视角', function() local qmnb= { {['memory']=32}, {['name']='固定视角'}, {['value']=80, ['type']=16}, {['lv']=5,['offset']=-60, ['type']=16}, {['lv']=4,['offset']=-56, ['type']=16}, } local qmxg= { {['value']=-999,['offset']=-56,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='固定视角'}, {['value']=80, ['type']=16}, {['lv']=5,['offset']=-60, ['type']=16}, {['lv']=4,['offset']=-56, ['type']=16}, } local qmxg= { {['value']=4,['offset']=-56,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('全局亮透', function() local qmnb= { {['memory']=32}, {['name']='全局亮透'}, {['value']=4689147931159298070, ['type']=32}, {['lv']=4689147931159298070,['offset']=0, ['type']=32}, } local qmxg= { {['value']=999,['offset']=52,['type']=16,['freeze']=true}, {['value']=0.0,['offset']=148,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='全局亮透'}, {['value']=4689147931159298070, ['type']=32}, {['lv']=4689147931159298070,['offset']=0, ['type']=32}, } local qmxg= { {['value']=7,['offset']=52,['type']=16,['freeze']=true}, {['value']=1,['offset']=148,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('灵魂透视', function() local qmnb= { {['memory']=32}, {['name']='透视灵魂'}, {['value']=1108344832, ['type']=4}, {['lv']=1103101952,['offset']=4, ['type']=4}, {['lv']=1081109,['offset']=980, ['type']=4}, } local qmxg= { {['value']=1081111,['offset']=980,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='透视灵魂'}, {['value']=1108344832, ['type']=4}, {['lv']=1103101952,['offset']=4, ['type']=4}, {['lv']=1081109,['offset']=980, ['type']=4}, } local qmxg= { {['value']=1081109,['offset']=980,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('自改加速', function() local a = gg.alert('人物加速','关闭','开启') if a == nil then return end if a == 1 then local Search_array = { [1] = { 4.880000114440918, 16, 32 }, [2] = { 0.20000000298023224, 8, 16 }, [3] = { 0.4000000059604645, 12, 16 }, } local Modifythe_array = { [1] = { 1, 24, 16, true }, } fastsearch(Search_array, Modifythe_array) elseif a == 2 then local g = gg.prompt({"请输入加速倍数"}, {"10"}, {"text"}) if g == nil then return end local Search_array = { [1] = { 4.880000114440918, 16, 32 }, [2] = { 0.20000000298023224, 8, 16 }, [3] = { 0.4000000059604645, 12, 16 }, } local Modifythe_array = { [1] = { g[1], 24, 16, true }, } fastsearch(Search_array, Modifythe_array) end end, function() end), changan.switch('去除雪花', function() local qmnb= { {['memory']=8}, {['name']='去除雪花'}, {['value']=9738829955072, ['type']=32}, {['lv']=9738829955072,['offset']=0, ['type']=32}, } local qmxg= { {['value']=0.0,['offset']=-4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=8}, {['name']='去除雪花'}, {['value']=9738829955072, ['type']=32}, {['lv']=9738829955072,['offset']=0, ['type']=32}, } local qmxg= { {['value']=1,['offset']=-4,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('狙击移动', function() local qmnb= { {['memory']=32}, {['name']='狙击移动'}, {['value']=550001, ['type']=32}, {['lv']=8589938887767297,['offset']=-8, ['type']=32}, {['lv']=2362236309767297,['offset']=-4, ['type']=32}, } local qmxg= { {['value']=207,['offset']=80,['type']=4,['freeze']=true}, {['value']=20,['offset']=84,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('解锁模式', function() local qmnb= { {['memory']=32}, {['name']='解锁模式'}, {['value']=550001, ['type']=4}, {['lv']=781001,['offset']=4, ['type']=4}, {['lv']=781001,['offset']=8, ['type']=4}, {['lv']=260001,['offset']=32, ['type']=4}, {['lv']=270001,['offset']=36, ['type']=4}, {['lv']=760001,['offset']=40, ['type']=4}, } local qmxg= { {['value']=9999,['offset']=-292,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='解锁模式'}, {['value']=550001, ['type']=4}, {['lv']=781001,['offset']=4, ['type']=4}, {['lv']=781001,['offset']=8, ['type']=4}, {['lv']=260001,['offset']=32, ['type']=4}, {['lv']=270001,['offset']=36, ['type']=4}, {['lv']=760001,['offset']=40, ['type']=4}, } local qmxg= { {['value']=0,['offset']=-292,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), } }, -- 【玩法】子分类 [2]={ ['分区名字']="娱乐玩法", ['功能配置']={ changan.switch('全图可飞', function() local qmnb= { {['memory']=32}, {['name']='全图可飞'}, {['value']=94489280517, ['type']=32}, {['lv']=0,['offset']=-1112, ['type']=32}, {['lv']=21474836486,['offset']=-4, ['type']=32}, {['lv']=94489280517,['offset']=0, ['type']=32}, } local qmxg= { {['value']=600.0,['offset']=-36,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {]{['name']='全图可飞'}, {['value']=94489280517, ['type']=32}, {['lv']=0,['offset']=-1112, ['type']=32}, {['lv']=21474836486,['offset']=-4, ['type']=32}, {['lv']=94489280517,['offset']=0, ['type']=32}, } local qmxg= { {['value']=999.0,['offset']=-36,['type']=16,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('单局穿墙', function() local qmnb= { {['memory']=32}, {['name']='人物穿墙'}, {['value']=2362236309767297, ['type']=32}, {['lv']=8589938887767297,['offset']=-4, ['type']=32}, {['lv']=550001,['offset']=4, ['type']=32}, {['lv']=4294967296,['offset']=796, ['type']=32}, } local qmxg= { {['value']=0,['offset']=-76,['type']=4}, {['value']=0,['offset']=100,['type']=4}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='人物穿墙'}, {['value']=2362236309767297, ['type']=32}, {['lv']=8589938887767297,['offset']=-4, ['type']=32}, {['lv']=550001,['offset']=4, ['type']=32}, {['lv']=4294967296,['offset']=796, ['type']=32}, } local qmxg= { {['value']=550001,['offset']=-76,['type']=4}, {['value']=1,['offset']=100,['type']=4}, } xqmnb(qmnb,qmxg) end), changan.switch('无视通讯', function() local qmnb= { {['memory']=32}, {['name']='无视通讯'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=0,['offset']=-280,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='无视通讯'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=0,['offset']=-280,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('使用常亮', function() local qmnb= { {['memory']=32}, {['name']='使用常亮'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=1,['offset']=-1112,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='使用常亮'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=0,['offset']=-1112,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('秒做任务', function() local qmnb= { {['memory']=32}, {['name']='秒做任务'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=911,['offset']=-1048,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='秒做任务'}, {['value']=4618873763247685632, ['type']=32}, {['lv']=12885756586491905,['offset']=372, ['type']=32}, } local qmxg= { {['value']=911,['offset']=-1048,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('伪太空号', function() local searchValue = gg.prompt({"请输入您的太空号","请输入您想改的太空号"}, {}, {"text","text"}) if searchValue == nil then return end local offset = -0x28 local valType = gg.TYPE_DWORD local minSameCount = 2 local function searchAndStat(value, saveToList) gg.clearResults() gg.searchNumber(tostring(value), valType) local cnt = gg.getResultCount() if cnt == 0 then gg.alert("没有搜索到值:" .. value) return nil end local results = gg.getResults(cnt) local readTask={} local addrMap={} for _,v in ipairs(results)do local addr=v.address+offset table.insert(readTask,{address=addr,flags=valType}) addrMap[addr]=v.address end local readRes=gg.getValues(readTask) local valid={} local countMap={} for _,item in ipairs(readRes)do local origAddr=addrMap[item.address] local offVal=item.value valid[#valid+1]={offsetAddress=item.address,offsetValue=offVal,origAddress=origAddr} local k=tostring(offVal) countMap[k]=(countMap[k] or 0)+1 end if #valid == 0 then gg.alert("无有效值") return nil end local maxCount=0 local maxValues={} for strVal,c in pairs(countMap)do if c>maxCount then maxCount=c maxValues={strVal} elseif c==maxCount then maxValues[#maxValues+1]=strVal end end if saveToList and maxCount >= minSameCount then local saveList={} for _,item in ipairs(valid)do for _,mv in ipairs(maxValues)do if tostring(item.offsetValue)==mv then saveList[#saveList+1]={address=item.offsetAddress,flags=valType,value=item.offsetValue,name="偏移值_"..mv,selected=true} break end end end if #saveList>0 then gg.addListItems(saveList) end end return {maxValues=maxValues,maxCount=maxCount,valid=valid} end local r1 = searchAndStat(searchValue[1], true) if not r1 then return end local firstMaxValues = r1.maxValues local firstMaxCount = r1.maxCount local X = tonumber(firstMaxValues[1]) gg.alert("读取成功") local r2 = searchAndStat(searchValue[2], true) if not r2 then return end local secondMaxValues = r2.maxValues local secondMaxCount = r2.maxCount local Y = tonumber(secondMaxValues[1]) gg.alert("读取成功") if not X then gg.alert("第一步值X无效") return end if not Y then gg.alert("第二步值Y无效") return end gg.removeListItems(gg.getListItems()) gg.toast("已清空旧保存列表") gg.clearResults() gg.searchNumber(tostring(X), valType) local finalCount = gg.getResultCount() if finalCount == 0 then gg.alert("第三步搜索 " .. X .. " 没有结果") return end local newResults = gg.getResults(finalCount) local editList = {} for _, v in ipairs(newResults) do editList[#editList + 1] = {address = v.address,flags = valType,value = Y,freeze = false} end gg.setValues(editList) local saveList = {} for _, v in ipairs(newResults) do saveList[#saveList + 1] = {address = v.address,flags= valType,value= Y,name = "第三步_" .. Y,selected = true} end gg.addListItems(saveList) end, function() end), changan.switch('无限签名', function() local qmnb= { {['memory']=32}, {['name']='无线签名'}, {['value']=1031, ['type']=4}, {['lv']=80,['offset']=80, ['type']=4}, } local qmxg= { {['value']=114528,['offset']=80,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='无线签名'}, {['value']=1031, ['type']=4}, {['lv']=80,['offset']=80, ['type']=4}, } local qmxg= { {['value']=50,['offset']=80,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('派对打人', function() local qmnb= { {['memory']=32}, {['name']='派对打人'}, {['value']=16842753, ['type']=4}, {['lv']=1073741824,['offset']=-216, ['type']=4}, {['lv']=1056964608,['offset']=-108, ['type']=4}, {['lv']=65792,['offset']=-4, ['type']=4}, } local qmxg= { {['value']=0,['offset']=-136,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='派对打人'}, {['value']=16842753, ['type']=4}, {['lv']=1073741824,['offset']=-216, ['type']=4}, {['lv']=1056964608,['offset']=-108, ['type']=4}, {['lv']=65792,['offset']=-4, ['type']=4}, } local qmxg= { {['value']=1,['offset']=-136,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('躲猫猫透蓝队', function() local qmnb= { {['memory']=32}, {['name']='透视蓝队'}, {['value']=1087373312, ['type']=4}, {['lv']=1073741824,['offset']=4, ['type']=4}, } local qmxg= { {['value']=1,['offset']=-88,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='透视蓝队'}, {['value']=1087373312, ['type']=4}, {['lv']=1073741824,['offset']=4, ['type']=4}, } local qmxg= { {['value']=0,['offset']=-88,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('躲猫猫透红队', function() local qmnb= { {['memory']=32}, {['name']='透视红队'}, {['value']=1087373312, ['type']=4}, {['lv']=1073741824,['offset']=4, ['type']=4}, } local qmxg= { {['value']=2,['offset']=-88,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end, function() local qmnb= { {['memory']=32}, {['name']='透视蓝队'}, {['value']=1087373312, ['type']=4}, {['lv']=1073741824,['offset']=4, ['type']=4}, } local qmxg= { {['value']=0,['offset']=-88,['type']=4,['freeze']=true}, } xqmnb(qmnb,qmxg) end), changan.switch('收债全图范围', function() local qmnb= { {['memory']=32}, {['name']='收债范围'}, {['value']=909098547675136, ['type']=32}, {['lv']=211666,['offset']=4, ['type']=32}, {['lv']=2.3125,['offset']=16, ['type']=16}, } local qmxg= { {['value']=999,['offset']=16,['type']=16}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('怪盗全图范围', function() local qmnb= { {['memory']=32}, {['name']='怪盗范围'}, {['value']=211596, ['type']=4}, {['lv']=-858993459,['offset']=8, ['type']=4}, } local qmxg= { {['value']=999,['offset']=12,['type']=16}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('驯兽全图范围', function() local qmnb= { {['memory']=32}, {['name']='驯兽范围'}, {['value']=905203012337664, ['type']=32}, {['lv']=64424509440,['offset']=-16, ['type']=32}, {['lv']=210759,['offset']=4, ['type']=32}, } local qmxg= { {['value']=999,['offset']=16,['type']=16}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('蜜蜂全图范围', function() local qmnb= { {['memory']=32}, {['name']='蜜蜂范围'}, {['value']=211597, ['type']=4}, {['lv']=-858993459,['offset']=8, ['type']=4}, } local qmxg= { {['value']=999,['offset']=12,['type']=16}, } xqmnb(qmnb,qmxg) end, function() end), changan.switch('无视龙洞', function() local t = {"libunity.so:bss", "Cb"} local tt = {0x963C0, 0xF8, 0x90, 0x28, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x963C0, 0xF8, 0xF0, 0x60, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96400, 0xA8, 0x90, 0x28, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96400, 0xA8, 0xF0, 0x60, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96440, 0x58, 0x90, 0x28, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96440, 0x58, 0xF0, 0x60, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96818, 0x8, 0x90, 0x28, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) local t = {"libunity.so:bss", "Cb"} local tt = {0x96818, 0x8, 0xF0, 0x60, 0x28, 0xD0} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 4, value = 1, freeze = true}}) end, function() end), changan.switch('监听远程刀初始化', function() pcall(function() if not STATE.isInitialized then initialize() else gg.toast("已初始化过,共 "..#STATE.players.." 名玩家") end end) end, function() pcall(function() STATE.isListening=false end) end), changan.switch('开启监听', function() pcall(function() if not STATE.isListening then toggleListen() end end) end, function() pcall(function() if STATE.isListening then toggleListen() end end) end), changan.switch('查看日志', function() pcall(viewLog) end, function() -- 无操作 end), changan.switch('新版远程刀', function() pcall(rkMenuSingle) end, function() pcall(function() if RK.mode ~= "idle" then rkStop("开关关闭,已恢复") end end) end), changan.switch('新版怪物黏人', function() pcall(monsterSetup) end, function() pcall(function() MONSTER.enabled=false MONSTER.frozen=false MONSTER.detected=false gg.clearList() end) end), changan.switch('新版传送', function() pcall(function() teleportToPlayer() end) end, function() pcall(function() gg.clearList() end) end), changan.switch("不要动", function() end, function() end), } }, } -- ============================================================ -- 【整合模块】来自 安眠曲5.0旧版本.lua 移植 -- 含:通用工具 / CONFIG / STATE / LISTEN / MONSTER / 远程刀RK模块 -- 监听 / 怪兽吸附 / 新版传送(tp模块另见下方) -- ============================================================ function lsp(add) local ti = gg.getTargetInfo() if ti.x64 == true then return gg.getValues({{address = add, flags = 32}})[1].value else return gg.getValues({{address = add, flags = 4}})[1].value & 0xFFFFFFFF end end function getDword(add) return gg.getValues({{address = add, flags = 4}})[1].value end function UTF16ToString(startAddress) local str = '' local length = getDword(startAddress - 4) if length <= 0 or length > 256 then return "未知玩家" end for i = 1, length do str = str .. utf8.char(gg.getValues({{address = startAddress + 0x2 * (i - 1), flags = 2}})[1].value & 0xFFFF) end return str end CONFIG = { pipeOffset = 0x228, eatOffset = 0x22C, chameleonOffset = 0x458, deathOffset = 0x234, curseOffset = 0x1F8, spyOffset = 0x2A8, legOffset = 0x10C, posXOffset = 0x3C0, posZOffset = 0x3C4, posYOffset = 0x3C8, listenInterval = 300, monsterEps = 0.0001, } STATE = { isListening = false, isInitialized = false, baseAddr = 0, playerCount = 0, players = {}, logText = "", menuLabel = "开始监听", heartbeat = 0, } LISTEN = { addresses = {}, addresses2 = {}, addresses3 = {}, addresses4 = {}, addresses5 = {}, addresses6 = {}, addresses8 = {}, posX = {}, posZ = {}, posY = {}, names = {}, oldVals = {}, oldVals2 = {}, oldVals3 = {}, oldVals4 = {}, oldVals5 = {}, oldVals6 = {}, oldVals8 = {}, isFirstCheck = true, } MONSTER = { enabled = false, addresses = {}, baselineValues = {}, detected = false, selfIndex = -1, targetIndex = -1, frozen = false, } -- ============================================================ -- 【远程刀模块】RK_1 换目标刀人 / RK_2 怪兽模式 -- ============================================================ RK = { base = 0, myName = nil, mode = "idle", selfP = nil, selfAddr = nil, oldVal = nil, lastWrite = nil, targetP = nil, endTime = 0, rot = 0, nameCache = {}, } RK_DEATH = 5.856 RK_MONSTER = 4.39200019836 RK_EPS = 1e-4 function rkUtf16(a, maxLen) local out, n = {}, 0 local lim = maxLen or 64 local req = {} for k = 0, lim - 1 do req[k + 1] = { address = a + k * 2, flags = gg.TYPE_WORD } end local ok, vals = pcall(gg.getValues, req) if not ok or type(vals) ~= "table" then vals = {} end while n < lim do local v = vals[n + 1] and vals[n + 1].value if not v then local one = gg.getValues({{address = a + n * 2, flags = gg.TYPE_WORD}}) v = one and one[1] and one[1].value end if not v or v == 0 then break end local c = v % 0x10000 if c < 0x80 then out[#out + 1] = string.char(c) elseif c < 0x800 then local b2 = c % 0x40 local b1 = math.floor(c / 0x40) out[#out + 1] = string.char(0xC0 + b1, 0x80 + b2) else local b3 = c % 0x40 local b2 = math.floor(c / 0x40) % 0x40 local b1 = math.floor(c / 0x1000) out[#out + 1] = string.char(0xE0 + b1, 0x80 + b2, 0x80 + b3) end n = n + 1 end return table.concat(out) end function rkInit(silent) local oldRanges = gg.getRanges() local oldCount = gg.getResultsCount() local oldResults = nil if oldCount > 0 and oldCount <= 2000 then pcall(function() oldResults = gg.getResults(oldCount) end) end gg.setRanges(gg.REGION_ANONYMOUS) gg.clearResults() RK.nameCache = {} gg.searchNumber(":PlayerActor[]", gg.TYPE_BYTE, false, gg.SIGN_EQUAL, 0, -1, 0) gg.searchPointer(0) gg.searchPointer(0x10) local r = gg.getResults(gg.getResultsCount()) gg.clearResults() RK.base = 0 if oldRanges then pcall(gg.setRanges, oldRanges) end if oldResults then pcall(gg.loadResults, oldResults) end if not r or #r == 0 then addLog("[远程刀] 初始化失败:无结果") if not silent then gg.toast("远程刀初始化失败:无结果") end return false end local q = {} for i, v in ipairs(r) do q[i] = { address = v.address + 0x18, flags = gg.TYPE_DWORD } end local vals = gg.getValues(q) for i, v in ipairs(vals) do if v.value == 8 or v.value == 16 then RK.base = r[i].address break end end if RK.base == 0 then addLog("[远程刀] 初始化失败:未找到基址") if not silent then gg.toast("远程刀初始化失败:未找到基址") end return false end addLog("[远程刀] 基址 0x" .. string.format("%X", RK.base)) return true end function rkReadCC(p) local req = {} for j = 0, 3 do req[j + 1] = { address = p + 0xCC + j * 4, flags = gg.TYPE_FLOAT } end local vals = gg.getValues(req) local out = {} for i, v in ipairs(vals) do out[i] = v.value end return out end function rkIsDead(p) for _, v in ipairs(rkReadCC(p)) do if math.abs(v - RK_DEATH) < RK_EPS then return true end end return false end function rkIsMonster(p) for _, v in ipairs(rkReadCC(p)) do if math.abs(v - RK_MONSTER) < RK_EPS then return true end end return false end function rkPlayerAlive(p) if not p or p == 0 then return false end local v = gg.getValues({{ address = p + 0xA0, flags = gg.TYPE_QWORD }})[1].value return v ~= nil and v ~= 0 end function rkNameOf(namePtr) local key = tostring(namePtr) local c = RK.nameCache[key] if c then return c end local s = rkUtf16(namePtr + 0x14) RK.nameCache[key] = s return s end function rkCollectPlayers() local list = {} if RK.base == 0 then return list end local ptReq = {} for i = 0, 499 do ptReq[i + 1] = { address = RK.base + 0x20 + i * 8, flags = gg.TYPE_QWORD } end local pts = gg.getValues(ptReq) local ptrs = {} for i = 1, #pts do local p = pts[i].value if not p or p == 0 then break end ptrs[#ptrs + 1] = p end if #ptrs == 0 then return list end local req = {} for i, p in ipairs(ptrs) do req[#req + 1] = { address = p + 0xA0, flags = gg.TYPE_QWORD } req[#req + 1] = { address = p + 0x20, flags = gg.TYPE_DWORD } end local vals = gg.getValues(req) local ccReq = {} for i, p in ipairs(ptrs) do for j = 0, 3 do ccReq[#ccReq + 1] = { address = p + 0xCC + j * 4, flags = gg.TYPE_FLOAT } end end local ccVals = gg.getValues(ccReq) for i, p in ipairs(ptrs) do local p2 = vals[(i - 1) * 2 + 1].value local f4 = vals[(i - 1) * 2 + 2].value if p2 and p2 ~= 0 then local dead = false for j = 0, 3 do local v = ccVals[(i - 1) * 4 + j + 1].value if v and math.abs(v - RK_DEATH) < RK_EPS then dead = true break end end list[#list + 1] = { p = p, name = rkNameOf(p2), f4 = f4, dead = dead } end end return list end function rkPickSelf(list) if RK.myName then for _, it in ipairs(list) do if it.name == RK.myName then return it end end gg.toast("远程刀:名字表里没找到 " .. RK.myName .. ",请手动选") addLog("[远程刀] 未匹配到名字 " .. RK.myName .. ",转为手动选择") end local t = {} for i, it in ipairs(list) do t[i] = i .. ". " .. it.name .. (it.dead and " [死]" or "") end local s = gg.choice(t, nil, "远程刀:选择你自己") if not s then return nil end return list[s] end function rkStop(msg) if RK.selfAddr and RK.selfAddr ~= 0 and RK.oldVal ~= nil then local cur = gg.getValues({{ address = RK.selfAddr, flags = gg.TYPE_DWORD }})[1].value if RK.lastWrite == nil or cur == RK.lastWrite then pcall(gg.setValues, {{ address = RK.selfAddr, flags = gg.TYPE_DWORD, value = RK.oldVal }}) end end RK.mode, RK.selfP, RK.selfAddr, RK.oldVal = "idle", nil, nil, nil RK.targetP, RK.endTime, RK.rot, RK.lastWrite = nil, 0, 0, nil if msg then addLog("[远程刀] " .. msg) end end function rkReady() if RK.base == 0 and not rkInit() then return false end if not RK.myName then local r = gg.prompt({"请输入你的名字\n自建房写主页名字\n实战写局内名字\n留空 = 每次手动选自己"}, {""}, {"text"}) if r and r[1] and r[1] ~= "" then RK.myName = r[1] gg.toast("远程刀:已记录名字 " .. RK.myName) end end return true end function rkStartSingle() if not rkReady() then return end local list = rkCollectPlayers() if #list == 0 then gg.toast("远程刀:无玩家数据(请确认在对局内)") return end local self = rkPickSelf(list) if not self then gg.toast("远程刀:未选自己") return end local t, map = {}, {} for _, it in ipairs(list) do if it.p ~= self.p then t[#t + 1] = it.name .. (it.dead and " [死]" or "") map[#map + 1] = it end end if #t == 0 then gg.toast("远程刀:没有其他玩家") return end local o = gg.choice(t, nil, "远程刀:选择要顶替的目标") if not o then return end local target = map[o] RK.selfP = self.p RK.selfAddr = self.p + 0x20 RK.oldVal = self.f4 RK.targetP = target.p RK.endTime = os.time() + 5 RK.lastWrite = target.f4 RK.mode = "single" gg.setValues({{ address = RK.selfAddr, flags = gg.TYPE_DWORD, value = target.f4 }}) gg.toast("远程刀:已写 " .. target.name .. " → " .. self.name .. "(5秒后恢复)") addLog("[远程刀] 换目标 " .. target.name .. " → " .. self.name .. "(5秒)") end function rkStartMonster() if not rkReady() then return end local list = rkCollectPlayers() if #list == 0 then gg.toast("远程刀:无玩家数据(请确认在对局内)") return end local self = rkPickSelf(list) if not self then gg.toast("远程刀:未选自己") return end RK.selfP = self.p RK.selfAddr = self.p + 0x20 RK.oldVal = self.f4 RK.targetP = nil RK.rot = 0 RK.mode = "monster" gg.toast("远程刀:怪兽模式已开启") addLog("[远程刀] 怪兽模式开启,自己: " .. self.name) end function rkMenuSingle() if RK.mode == "single" then rkStop("单次刀已手动恢复") gg.toast("远程刀:已恢复") return end if RK.mode ~= "idle" then rkStop("切换功能,已恢复") end rkStartSingle() end function rkMenuMonster() if RK.mode == "monster" then rkStop("怪兽模式已停止") gg.toast("远程刀:怪兽模式已停止") return end if RK.mode ~= "idle" then rkStop("切换功能,已恢复") end rkStartMonster() end function rkPickNextTarget() local list = rkCollectPlayers() local alive = {} for _, it in ipairs(list) do if it.p ~= RK.selfP and not it.dead then alive[#alive + 1] = it end end if #alive == 0 then RK.targetP = nil return end RK.rot = RK.rot % #alive + 1 RK.targetP = alive[RK.rot].p addLog("[远程刀] 切换目标 → " .. alive[RK.rot].name) end function rkTick() if RK.mode == "idle" then return end if not rkPlayerAlive(RK.selfP) then rkStop("对局结束") RK.base = 0 RK.nameCache = {} return end if RK.mode == "single" then if RK.targetP and rkIsDead(RK.targetP) then rkStop("目标已死亡,已恢复") return end if os.time() >= RK.endTime then rkStop("5秒已到,已恢复") end return end if RK.mode == "monster" then if not rkIsMonster(RK.selfP) then return end local needPick = false if not RK.targetP then needPick = true elseif not rkPlayerAlive(RK.targetP) then needPick = true elseif rkIsDead(RK.targetP) then needPick = true end if needPick then rkPickNextTarget() end if RK.targetP and RK.selfAddr then local f4 = gg.getValues({{ address = RK.targetP + 0x20, flags = gg.TYPE_DWORD }})[1].value if f4 then gg.setValues({{ address = RK.selfAddr, flags = gg.TYPE_DWORD, value = f4 }}) RK.lastWrite = f4 end end end end -- ============================================================ -- 【监听模块】initialize / prepareListenData / toggleListen / checkChanges -- ============================================================ function initialize() gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4.88", gg.TYPE_FLOAT) local results = gg.getResults(gg.getResultsCount()) if #results == 0 then gg.alert("搜索失败") return end STATE.players = {} for i, v in ipairs(results) do local playerAddr = v.address local offset8C = playerAddr - 0xCC local check450 = gg.getValues({{address = offset8C + 0x234, flags = gg.TYPE_DWORD}})[1].value if check450 == 1 then local namePtr = lsp(offset8C + 0xA0) local name = "未知玩家" if namePtr ~= 0 then name = UTF16ToString(namePtr + 0x14) or "未知玩家" end if name ~= "未知玩家" then table.insert(STATE.players, { addr = playerAddr, offset8C = offset8C, name = name, }) end end end if #STATE.players == 0 then gg.alert("未找到有效玩家") STATE.isInitialized = false return end STATE.isInitialized = true STATE.playerCount = #STATE.players gg.toast("初始化完成,共 " .. #STATE.players .. " 名玩家") prepareListenData() end function prepareListenData() if not STATE.isInitialized or not STATE.players or #STATE.players == 0 then gg.toast("请先初始化") return end LISTEN.addresses, LISTEN.addresses2, LISTEN.addresses3 = {}, {}, {} LISTEN.addresses4, LISTEN.addresses5, LISTEN.addresses6, LISTEN.addresses8 = {}, {}, {}, {} LISTEN.posX, LISTEN.posZ, LISTEN.posY, LISTEN.names = {}, {}, {}, {} LISTEN.oldVals, LISTEN.oldVals2, LISTEN.oldVals3, LISTEN.oldVals4 = {}, {}, {}, {} LISTEN.oldVals5, LISTEN.oldVals6, LISTEN.oldVals8 = {}, {}, {} LISTEN.isFirstCheck = true for i, p in ipairs(STATE.players) do local base = p.offset8C LISTEN.names[i] = p.name LISTEN.addresses[i] = { address = base + CONFIG.pipeOffset, flags = 4 } LISTEN.addresses2[i] = { address = base + CONFIG.eatOffset, flags = 4 } LISTEN.addresses3[i] = { address = base + CONFIG.chameleonOffset, flags = 4 } LISTEN.addresses4[i] = { address = base + CONFIG.deathOffset, flags = 4 } LISTEN.addresses5[i] = { address = base + CONFIG.curseOffset, flags = 4 } LISTEN.addresses6[i] = { address = base + CONFIG.spyOffset, flags = 4 } LISTEN.addresses8[i] = { address = base + CONFIG.legOffset, flags = 4 } LISTEN.posX[i] = { address = base + CONFIG.posXOffset, flags = 16 } LISTEN.posZ[i] = { address = base + CONFIG.posZOffset, flags = 16 } LISTEN.posY[i] = { address = base + CONFIG.posYOffset, flags = 16 } end LISTEN.oldVals = gg.getValues(LISTEN.addresses) LISTEN.oldVals2 = gg.getValues(LISTEN.addresses2) LISTEN.oldVals3 = gg.getValues(LISTEN.addresses3) LISTEN.oldVals4 = gg.getValues(LISTEN.addresses4) LISTEN.oldVals5 = gg.getValues(LISTEN.addresses5) LISTEN.oldVals6 = gg.getValues(LISTEN.addresses6) LISTEN.oldVals8 = gg.getValues(LISTEN.addresses8) end function toggleListen() if not STATE.isInitialized then gg.toast("请先初始化") return end if STATE.isListening then STATE.isListening = false STATE.menuLabel = "开始监听" gg.toast("监听 → 关闭") else STATE.isListening = true STATE.menuLabel = "取消监听" gg.toast("监听 → 开启(管道/狙击 + 大胃王 + 隐身 + 死亡 + 诅咒 + 间谍 + 鸡腿)") LISTEN.oldVals = gg.getValues(LISTEN.addresses) LISTEN.oldVals2 = gg.getValues(LISTEN.addresses2) LISTEN.oldVals3 = gg.getValues(LISTEN.addresses3) LISTEN.oldVals4 = gg.getValues(LISTEN.addresses4) LISTEN.oldVals5 = gg.getValues(LISTEN.addresses5) LISTEN.oldVals6 = gg.getValues(LISTEN.addresses6) LISTEN.oldVals8 = gg.getValues(LISTEN.addresses8) LISTEN.isFirstCheck = true STATE.heartbeat = 0 end end function findNearestPlayer(deadIndex) local n = #LISTEN.posX if n == 0 then return nil end local batch = {} for i = 1, n do batch[i] = LISTEN.posX[i] batch[n + i] = LISTEN.posZ[i] batch[2 * n + i] = LISTEN.posY[i] batch[3 * n + i] = LISTEN.addresses4[i] end local ok, all = pcall(gg.getValues, batch) if not ok or not all then return nil end local deadX = all[deadIndex].value local deadZ = all[n + deadIndex].value local deadY = all[2 * n + deadIndex].value local minDist, nearestIdx = math.huge, nil for i = 1, n do if i ~= deadIndex then local alive = all[3 * n + i] and all[3 * n + i].value or 0 if alive == 1 then local dx = all[i].value - deadX local dz = all[n + i].value - deadZ local dy = all[2 * n + i].value - deadY local dist = dx * dx + dz * dz + dy * dy if dist < minDist then minDist, nearestIdx = dist, i end end end end if not nearestIdx then minDist = math.huge for i = 1, n do if i ~= deadIndex then local dx = all[i].value - deadX local dz = all[n + i].value - deadZ local dy = all[2 * n + i].value - deadY local dist = dx * dx + dz * dz + dy * dy if dist < minDist then minDist, nearestIdx = dist, i end end end end return nearestIdx end function format_coordinates(x, y, z) return string.format("[%.1f,%.1f,%.1f]", x, y, z) end function getPlayerLocation(idx) if not idx or idx < 1 or not LISTEN.posX[idx] then return "" end local ok, vals = pcall(gg.getValues, { LISTEN.posX[idx], LISTEN.posZ[idx], LISTEN.posY[idx], }) if not ok or not vals then return "" end local px, pz, py = vals[1].value, vals[2].value, vals[3].value return format_coordinates(px, pz, py) end function findNearestAliveTarget() if not STATE.players or #STATE.players == 0 then return -1 end local selfIdx = MONSTER.selfIndex if selfIdx < 1 then return -1 end local n = #LISTEN.posX if n == 0 then return -1 end local batch = {} for i = 1, n do batch[i] = LISTEN.posX[i] batch[n + i] = LISTEN.posZ[i] batch[2 * n + i] = LISTEN.posY[i] batch[3 * n + i] = LISTEN.addresses4[i] end local all = gg.getValues(batch) if not all then return -1 end local baseX = all[selfIdx].value local baseZ = all[n + selfIdx].value local baseY = all[2 * n + selfIdx].value local minDist, nearestIdx = math.huge, -1 for i = 1, n do if i ~= selfIdx and all[3 * n + i].value == 1 then local dx = all[i].value - baseX local dz = all[n + i].value - baseZ local dy = all[2 * n + i].value - baseY local dist = dx * dx + dz * dz + dy * dy if dist < minDist then minDist, nearestIdx = dist, i end end end return nearestIdx end function monsterSetup() if not STATE.isInitialized then gg.toast("请先初始化") return end if #LISTEN.names == 0 then gg.toast("玩家数据为空,请重新初始化") return end local items = {} for i = 1, #LISTEN.names do items[#items + 1] = "[" .. i .. "] " .. (LISTEN.names[i] or ("玩家" .. i)) end local choice = gg.choice(items, nil, "请点击你自己的名字") if not choice then return end MONSTER.enabled = false MONSTER.addresses = {} MONSTER.baselineValues = {} MONSTER.detected = false MONSTER.targetIndex = -1 MONSTER.selfIndex = choice MONSTER.frozen = false gg.clearResults() gg.setRanges(32) gg.searchNumber("4.88", 16) local count = gg.getResultCount() if count <= 0 then gg.alert("未找到 4.88 数据\n请确认:\n1. 已进入游戏对局\n2. 功能在游戏里已开启") gg.clearResults() MONSTER.selfIndex = -1 return end local results = gg.getResults(count) for i, v in ipairs(results) do MONSTER.addresses[i] = { address = v.address, flags = 16 } MONSTER.baselineValues[i] = v.value end MONSTER.enabled = true MONSTER.detected = false MONSTER.targetIndex = -1 gg.clearResults() gg.toast("已找到 " .. count .. " 个地址,开始监听") addLog("[怪兽吸附] 已选自己: " .. (LISTEN.names[choice] or ("玩家" .. choice))) end function isMonsterActive() if not MONSTER.enabled then return false end if #MONSTER.addresses == 0 then return false end local current = gg.getValues(MONSTER.addresses) for i, v in ipairs(current) do if v.value < MONSTER.baselineValues[i] - CONFIG.monsterEps then return true end end return false end function freezeCoords(targetIdx) local selfIdx = MONSTER.selfIndex if targetIdx <= 0 then return false end if selfIdx < 1 or selfIdx > #LISTEN.posX then return false end local coords = gg.getValues({ LISTEN.posX[targetIdx], LISTEN.posZ[targetIdx], LISTEN.posY[targetIdx] }) if not coords or #coords < 3 then return false end local tx, tz, ty = coords[1].value, coords[2].value, coords[3].value if MONSTER.frozen then gg.clearList() MONSTER.frozen = false end local ok = gg.addListItems({ { address = LISTEN.posX[selfIdx].address, flags = 16, value = tx, freeze = true, freezeType = gg.FREEZE_NORMAL, name = "MonsterSelfX" }, { address = LISTEN.posZ[selfIdx].address, flags = 16, value = tz, freeze = true, freezeType = gg.FREEZE_NORMAL, name = "MonsterSelfZ" }, { address = LISTEN.posY[selfIdx].address, flags = 16, value = ty, freeze = true, freezeType = gg.FREEZE_NORMAL, name = "MonsterSelfY" }, }) if ok == false then addLog("[怪兽吸附] 冻结添加失败") return false end MONSTER.frozen = true return true end function monsterFreezeLoop() if not MONSTER.enabled then return end if not STATE.isInitialized then return end if not isMonsterActive() then if MONSTER.detected then MONSTER.detected = false MONSTER.targetIndex = -1 if MONSTER.frozen then gg.clearList() MONSTER.frozen = false end addLog("[怪兽吸附] 怪兽状态结束,冻结解除") end return end if not MONSTER.detected then MONSTER.detected = true gg.toast("检测到变身怪兽") addLog("[怪兽吸附] 检测到变身怪兽,进入冻结吸附") end local targetIdx = findNearestAliveTarget() if targetIdx > 0 then MONSTER.targetIndex = targetIdx freezeCoords(targetIdx) end end function checkChanges() if not STATE.isListening or not STATE.isInitialized then return end local n = #LISTEN.addresses if n == 0 then return end local batch = {} for i = 1, n do batch[i] = LISTEN.addresses[i] batch[n + i] = LISTEN.addresses2[i] batch[2*n + i] = LISTEN.addresses3[i] batch[3*n + i] = LISTEN.addresses4[i] batch[4*n + i] = LISTEN.addresses5[i] batch[5*n + i] = LISTEN.addresses6[i] batch[6*n + i] = LISTEN.addresses8[i] end local ok, all = pcall(gg.getValues, batch) if not ok or not all then return end local function slice(off) local t = {} for i = 1, n do t[i] = all[off + i] end return t end local currentVals = slice(0) local currentVals2 = slice(n) local currentVals3 = slice(2 * n) local currentVals4 = slice(3 * n) local currentVals5 = slice(4 * n) local currentVals6 = slice(5 * n) local currentVals8 = slice(6 * n) if LISTEN.isFirstCheck then LISTEN.isFirstCheck = false LISTEN.oldVals, LISTEN.oldVals2, LISTEN.oldVals3, LISTEN.oldVals4 = currentVals, currentVals2, currentVals3, currentVals4 LISTEN.oldVals5, LISTEN.oldVals6, LISTEN.oldVals8 = currentVals5, currentVals6, currentVals8 return end local nearestCache = {} local locCache = {} local function nearest(i) if nearestCache[i] == nil then nearestCache[i] = findNearestPlayer(i) or false end return nearestCache[i] or nil end local function loc(i) if locCache[i] == nil then locCache[i] = getPlayerLocation(i) or "" end return locCache[i] end for i = 1, n do local ov, cv = LISTEN.oldVals[i], currentVals[i] if ov and cv then local playerName = LISTEN.names[i] or ("玩家" .. i) local myLoc = loc(i) if cv.value ~= ov.value then addLog(playerName .. " [管道/狙击] " .. myLoc) end if currentVals2[i].value ~= LISTEN.oldVals2[i].value then addLog(playerName .. " [大胃王/饮料] " .. myLoc) end if currentVals3[i].value ~= LISTEN.oldVals3[i].value then local v = currentVals3[i].value if v == 16777216 then local ni = nearest(i) if ni and LISTEN.names[ni] then addLog(playerName .. " [小蜜蜂附身] " .. myLoc .. " 最近: " .. LISTEN.names[ni] .. " " .. loc(ni)) else addLog(playerName .. " [小蜜蜂附身] " .. myLoc) end elseif v == 65536 then local ni = nearest(i) if ni and LISTEN.names[ni] then addLog(playerName .. " [隐身] " .. myLoc .. " 最近: " .. LISTEN.names[ni] .. " " .. loc(ni)) else addLog(playerName .. " [隐身] " .. myLoc) end elseif v == 0 then addLog(playerName .. " [显形] " .. myLoc) end end if currentVals4[i].value ~= LISTEN.oldVals4[i].value then local newAlive = currentVals4[i].value local oldAlive = LISTEN.oldVals4[i].value if newAlive == 0 or (oldAlive == 1 and newAlive ~= 1) then local ni = nearest(i) if ni and LISTEN.names[ni] then addLog(playerName .. " [死亡] " .. myLoc .. " 可能凶手: " .. LISTEN.names[ni] .. " " .. loc(ni)) else addLog(playerName .. " [死亡] " .. myLoc) end elseif newAlive == 1 or (oldAlive ~= 1 and newAlive == 1) then addLog(playerName .. " [复活] " .. myLoc) else addLog(playerName .. " [存活变化:" .. tostring(oldAlive) .. "→" .. tostring(newAlive) .. "] " .. myLoc) end end if currentVals5[i].value ~= LISTEN.oldVals5[i].value then local ni = nearest(i) if ni and LISTEN.names[ni] then addLog(playerName .. " [被控] " .. myLoc .. " 最近: " .. LISTEN.names[ni] .. " " .. loc(ni)) else addLog(playerName .. " [被控] " .. myLoc) end end if currentVals6[i].value ~= LISTEN.oldVals6[i].value then addLog(playerName .. " [间谍变身] " .. myLoc) end local oldV, newV = LISTEN.oldVals8[i].value, currentVals8[i].value if oldV == 0 and newV ~= 0 then addLog(playerName .. " [拖鸡腿] " .. myLoc) elseif oldV ~= 0 and newV == 0 then addLog(playerName .. " [放下鸡腿] " .. myLoc) end end end LISTEN.oldVals, LISTEN.oldVals2, LISTEN.oldVals3, LISTEN.oldVals4 = currentVals, currentVals2, currentVals3, currentVals4 LISTEN.oldVals5, LISTEN.oldVals6, LISTEN.oldVals8 = currentVals5, currentVals6, currentVals8 end function addLog(text) gg.toast(text) STATE.logText = STATE.logText .. text .. "\n" end function viewLog() if STATE.logText == "" then gg.alert("暂无日志") else gg.alert(STATE.logText) end end function clearLog() STATE.logText = "" gg.toast("日志已清除") end -- ============================================================ -- 【新版传送模块】基于 凤凰同款传送.lua 移植(tp/TP_ 前缀防冲突) -- ============================================================ TP_STATE = { isInitialized = false, players = {}, arrayHeadAddr = nil, selfIndex = nil } function tpGetQword(add) return gg.getValues({{address = add, flags = 32}})[1].value end function tpInitialize() if TP_STATE.arrayHeadAddr == nil then gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4.88", gg.TYPE_FLOAT) local count = gg.getResultsCount() if count == 0 then gg.alert("搜索失败") return end if count > 781391 then count = 781391 end local results = gg.getResults(count) local playerheads = {} for i, v in ipairs(results) do table.insert(playerheads, {address = v.address - 0xCC, flags = gg.TYPE_DWORD}) end gg.clearResults() gg.loadResults(playerheads) gg.searchPointer(0) local players = gg.getResults(gg.getResultsCount()) if #players == 0 then gg.alert("搜索失败") return end local checkList = {} for i, p in ipairs(players) do table.insert(checkList, {address = p.address - 0x8, flags = gg.TYPE_QWORD}) end local values = gg.getValues(checkList) local savedList = {} for i, v in ipairs(values) do if v.value == 16 or v.value == 32 then table.insert(savedList, v) end end if #savedList == 0 then gg.alert("未找到玩家") return end local adoptedAddr = nil for i, item in ipairs(savedList) do local checkAddr, expectedVal if item.value == 16 then checkAddr, expectedVal = item.address + 0x160, 16 else checkAddr, expectedVal = item.address + 0x130, 32 end local checkVal = gg.getValues({{address = checkAddr, flags = gg.TYPE_QWORD}})[1].value if checkVal == expectedVal then adoptedAddr = item.address break end end if adoptedAddr == nil then gg.alert("未找到玩家") return end TP_STATE.arrayHeadAddr = adoptedAddr - 0x18 end local playerOffsets = {0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90} TP_STATE.players = {} TP_STATE.selfIndex = nil local count = 0 for i, offset in ipairs(playerOffsets) do local slotValue = tpGetQword(TP_STATE.arrayHeadAddr + offset) if slotValue ~= 0 then local offsethead = tpGetQword(slotValue) if offsethead ~= 0 then local namePtr = lsp(slotValue + 0xA0) local name = "未知玩家" if namePtr ~= 0 then name = UTF16ToString(namePtr + 0x14) or "未知玩家" end if name ~= "未知玩家" then table.insert(TP_STATE.players, {slotValue = slotValue, name = name}) count = count + 1 end end end end if #TP_STATE.players == 0 then gg.alert("未找到玩家") TP_STATE.isInitialized = false return end TP_STATE.isInitialized = true gg.toast("传送初始化完成,共 " .. count .. " 名玩家") end function tpBuildChoices() local choices = {} for i, p in ipairs(TP_STATE.players) do local aliveVal = gg.getValues({{address = p.slotValue + 0x234, flags = gg.TYPE_DWORD}})[1].value choices[i] = p.name .. (aliveVal == 1 and " [存活]" or " [死亡]") end return choices end function teleportToPlayer() if not TP_STATE.isInitialized then tpInitialize() end if not TP_STATE.isInitialized then return end local choices = tpBuildChoices() local selfChoice = gg.choice(choices, nil, "传送:第一步 选择你自己") if not selfChoice then return end TP_STATE.selfIndex = selfChoice local selfPlayer = TP_STATE.players[selfChoice] gg.setVisible(false) choices = tpBuildChoices() local targetChoice = gg.choice(choices, nil, "传送:第二步 选择目标玩家") if not targetChoice then return end local targetPlayer = TP_STATE.players[targetChoice] local targetAlive = gg.getValues({{address = targetPlayer.slotValue + 0x234, flags = gg.TYPE_DWORD}})[1].value if targetAlive ~= 1 then gg.toast("目标已死亡,无法传送") return end local targetX = gg.getValues({{address = targetPlayer.slotValue + 0x3C0, flags = gg.TYPE_FLOAT}})[1].value local targetY = gg.getValues({{address = targetPlayer.slotValue + 0x3C4, flags = gg.TYPE_FLOAT}})[1].value local targetZ = gg.getValues({{address = targetPlayer.slotValue + 0x3C8, flags = gg.TYPE_FLOAT}})[1].value gg.toast("正在传送到: " .. targetPlayer.name) local freezeVals = { {address = selfPlayer.slotValue + 0x3C0, value = targetX, flags = gg.TYPE_FLOAT, freeze = true}, {address = selfPlayer.slotValue + 0x3C4, value = targetY, flags = gg.TYPE_FLOAT, freeze = true}, {address = selfPlayer.slotValue + 0x3C8, value = targetZ, flags = gg.TYPE_FLOAT, freeze = true}, } gg.setValues(freezeVals) gg.addListItems(freezeVals) gg.sleep(300) gg.clearList() gg.toast("传送完成 → " .. targetPlayer.name) end 第四页 = { ['分页名字']="美化", [1]={ ['分区名字']="人型美化", ['功能配置']={ changan.switch("约菲尔", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001914", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001913", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001912", gg.TYPE_DWORD) gg.toast("美化完成") end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("3001914", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001914", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200060", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3001913", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001913", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200059", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001912", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200058", gg.TYPE_DWORD) gg.toast("美化完成") end), changan.switch("九尾狐", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001373", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001372", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001371", gg.TYPE_DWORD) gg.toast("美化完成") end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("3001373", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001373", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200060", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3001372", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001372", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200059", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3001371", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3001371", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200058", gg.TYPE_DWORD) gg.toast("美化完成") end), changan.switch("赛罗奥特曼", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3006491", gg.TYPE_DWORD) end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("3006491", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3006491", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200060", gg.TYPE_DWORD) end), changan.switch("星辰领主", function() local time=os.clock() gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3102041", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3102042", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) sl=gg.editAll("3102043", gg.TYPE_DWORD) gg.toast("修改了"..sl.."条数据\n共耗时"..os.clock()-time) end, function() local time=os.clock() gg.clearResults() gg.setRanges(32) gg.searchNumber("3102041", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3102041", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200060", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3102042", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3102042", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200059", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3102043", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3102043", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) sl=gg.editAll("200060", gg.TYPE_DWORD) gg.toast("修改了"..sl.."条数据\n共耗时"..os.clock()-time) end), changan.switch("柯南", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200059", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3106331", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3106332", gg.TYPE_DWORD) end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("3106331", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3106331", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200059", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3106332", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3106332", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200058", gg.TYPE_DWORD) end), changan.switch("毛利兰(未添加)", function() end, function() end), changan.switch("灰原哀", function() gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200058", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3106372", gg.TYPE_DWORD) gg.clearResults() gg.setRanges(32) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("200060", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("3001914", gg.TYPE_DWORD) gg.clearResults() end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("3106371", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3106371", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200059", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("3106372", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("3106372", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("200058", gg.TYPE_DWORD) end), } }, [2]={ ['分区名字']="鲨型美化", ['功能配置']={ changan.switch("约菲尔", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200016", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200016", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019141", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200012", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200012", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019131", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200013", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200013", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019111", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200017", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200017", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019121", gg.TYPE_DWORD) gg.toast("美化完成") end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019141", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019141", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200016", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019131", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019131", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200012", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019111", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019111", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200013", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019121", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019121", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200017", gg.TYPE_DWORD) gg.toast("美化完成") end), changan.switch("路西法", function() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200016", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200016", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019231", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200012", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200012", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019221", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("100200017", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("100200017", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("30019211", gg.TYPE_DWORD) gg.toast("美化完成") end, function() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019231", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019231", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200016", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019221", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019221", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200012", gg.TYPE_DWORD) gg.clearResults() gg.clearResults() gg.setRanges(32) gg.searchNumber("30019211", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("30019211", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll("100200017", gg.TYPE_DWORD) gg.toast("美化完成") end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), changan.switch("未添加", function() end, function() end), } }, } 第五页 = { ['分页名字']="音乐", [1]={ ['分区名字']="搜索音乐", ['功能配置']={ wyylog, } }, } 第六页 = { ['分页名字']="设置", [1]={ ['分区名字']="设置", ['功能配置']={ changan.switch( "音量键隐藏UI", function() 音量键=true end, function() 音量键=false end ), changan.button('退出', function() tuichu=1 end), } }, } changan.menu({ 第一页, 第二页, 第四页, 第五页, 第六页, }) bloc = luajava.getBlock() bloc('join') end gg.alert(sG1) pcall(function()UImain()()()end)