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("@guanwang9178")
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("观望官方频道@guanwang9178", 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']=0.005,['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)