local material3 = require 'material3' import('android.content.res.ColorStateList') local context=material3:getContext() vibra = context:getSystemService(Context.VIBRATOR_SERVICE) changan = {} local changan = changan local android = import('android.*') function write(fileName, content) file.write(fileName, content) end function panduan(rec) fille,err = io.open(rec) if fille == nil then return false else return true end end function read(fileName) f = assert(io.open(fileName, 'r')) content = f:read("*all") f:close() return content end function wtcf(lujing,neirong) write("/sdcard/UI/配置文件/"..lujing,neirong) end function rdcf(lujing) return read("/sdcard/UI/配置文件/"..lujing) end local function getBG(DrawableColor,Radius,StrokeWidth,StrokeColor) if type(DrawableColor)~='table' then DrawableColor={DrawableColor,DrawableColor} end local jianbians = luajava.loadlayout({ GradientDrawable, color = 0xff000000, gradientType = GradientDrawable.LINEAR_GRADIENT, orientation = GradientDrawable.Orientation.TOP_BOTTOM , }) jianbians:setColors(DrawableColor) jianbians:setStroke(StrokeWidth or 0,StrokeColor or 0xffffffff) if type(Radius)=='table' then jianbians:setCornerRadii({Radius[1],Radius[1],Radius[2],Radius[2],Radius[3],Radius[3],Radius[4],Radius[4]}) else jianbians:setCornerRadius(Radius or 0) end return jianbians end 开 = "开" 关 = "关" function checkimg(tmp) if panduan("/sdcard/UI/图片/"..tmp) ~= true then gg.toast("正在下载资源"..tmp.."\n请耐心等待") download("http://wss.wigwy.xyz/api/get/yjb/"..tmp,"/sdcard/UI/图片/"..tmp) end end ckimg = { '845', '844' } for i = 1,#ckimg do jindu = i checkimg(ckimg[i]) end 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/UI/图片/"..ntxt) == false then file.download(txt,"/sdcard/UI/图片/"..ntxt) else end txt = "/sdcard/UI/图片/"..ntxt end return luajava.getBitmapDrawable(txt) end function getRes(x) return 获取图片("/sdcard/UI/图片/"..x) end function getVerticalBG(gtvb1,gtvb3,gtvb4,gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5) return jianbians end function getCorner(gtvb1,gtvb3,gtvb4,gtvb5,g1,g2,g3,g4) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 jianbians:setCornerRadii({g1,g1,g2,g2,g3,g3,g4,g4}) return jianbians end function getHorizontalBG(gtvb1,gtvb3,gtvb4,gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 return jianbians 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_TOUCH_MODAL -- 焦点设置Finish layoutParams.gravity = Gravity.TOP|Gravity.LEFT -- 重力设置 layoutParams.width = LayoutParams.WRAP_CONTENT -- 布局宽度 layoutParams.height = LayoutParams.WRAP_CONTENT -- 布局高度 return layoutParams end slctb = getVerticalBG({0xffA0D1FF,0xffA0D1FF},10) slcta = getHorizontalBG({0xffA0D1FF,0xffA0D1FF},10,4,0xffffffff) function getButtonBG() local selector = luajava.getStateListDrawable() selector:addState({ -android.R.attr.state_pressed }, getVerticalBG({0x55ffffff,0x55ffffff},20,2,0xaaA0D1FF)) selector:addState({ android.R.attr.state_pressed }, getVerticalBG({0x22A0D1FF,0x22A0D1FF},20,2,0xaaA0D1FF)) return selector end function getSelector() selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, slcta) -- 点击时候的背景 selector:addState({ -android.R.attr.state_pressed }, slctb) -- 没点击的背景 return selector end 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) 菜单页数=#sview 当前分区={} 分区页数={} 侧边={} 功能区={} 顶边={ LinearLayout, layout_height='match_parent', layout_width='match_parent', orientation='vertical', onClick=function() end, onTouch=hanshu, } beij=getBG('0xFFA0D1FF',25) dbback=getVerticalBG({0xffffffff,0xffffffff},90) for i = 1,菜单页数 do 分区页数[i]= #sview[i] table.insert(顶边,{ FrameLayout, orientation='vertical', layout_height='wrap_content', layout_width='match_parent', gravity='center_horizontal', { TextView, layout_height='wrap_content', layout_width='match_parent', padding={'25dp','4dp','15dp','4dp'}, text=sview[i]['分页名字'], textColor='#000000', textSize='10sp', gravity='center', __onCreate=function(v) _ENV['ding'..i]=v end, elevation='2dp', layout_margin='4dp', background=slctb, onClick=function() 切换(i) end, onTouch=hanshu, }, {ImageView, src=获取图片(sview[i]['侧边图标']), layout_gravity='center_vertical', layout_height='25dp', layout_width='25dp', elevation='4dp', }, {LinearLayout, layout_marginTop='25dp', layout_marginLeft='35dp', layout_width='27dp', layout_height='3dp', __onCreate=function(v) _ENV['dingbar'..i]=v end } }) 功能区[i]={} local layoutm={ LinearLayout, id = "layoutm"..i, padding='4dp', layout_width = "match_parent", orientation = "vertical", gravity = "center_horizontal", } local menulayout={ LinearLayout, layout_width='match_parent', layout_height='wrap_content', visibility = "gone", orientation = "vertical", id='menu'..i..1, } for k,v in pairs(sview[i]['功能配置']) do table.insert(menulayout,v) end local menulayout=luajava.loadlayout(menulayout) 功能区[i][1]=menulayout table.insert(layoutm,menulayout) local menus={ LinearLayout, layout_width = "270dp", layout_height = "270dp", visibility = "gone", orientation = "vertical", padding={'0dp','0dp','0dp','0dp'}, background=获取图片(背景图片), elevation='3dp', { ScrollView, fillViewport = "true", background=getBG({0x33ffffff,0x33ffffff},{0,0,25,25}), --padding = "10dp", gravity = "center", layout_width = "match_parent", layout_height = "match_parent", orientation = "horizontal", layoutm }} _ENV["layout"..i] = luajava.loadlayout(menus) end ckou = { LinearLayout, orientation='vertical', layout_width = "wrap_content", layout_height = "wrap_content", {--顶部栏 FrameLayout, orientation = "horizontal", padding = "2dp", layout_height='wrap_content', elevation='3dp', layout_width="fill_parent", background=getCorner({0xffffffff,0xffffffff},20,0,0xffFFE543,25,25,0,0), { TextView, layout_width='match_parent', layout_height='match_parent', gravity='center', layout_gravity='center_vertical', textSize='14sp', textColor='#000000', text=标题, }, { LinearLayout, layout_gravity="center_vertical|right", padding={"2dp","2dp","2dp","2dp"}, layout_marginLeft='2dp', layout_marginRight='2dp', layout_marginTop='2dp', layout_marginBottom='2dp', layout_width = "40dp", layout_height = "24dp", gravity = "center", onClick = 隐藏, onTouch = hanshu, {ImageView, layout_height='17dp', layout_width='17dp', src=获取图片('https://image.rlyun.fun/view.php/98e7a54b8e92f732b77a37a006152028.png'), colorFilter=0xffA0D1FF } } } } for i = 1,菜单页数 do ckou[#ckou+1] = _ENV["layout"..i] end headicon=luajava.loadlayout({ImageView, src=获取图片(悬浮窗图标), layout_height="42dp", layout_width="42dp", padding='1dp', }) ckou = luajava.loadlayout(ckou) floatWindow = { FrameLayout, id = "motion", elevation = "10dp", onTouch = hanshu, onClick = function() end, layout_width = "wrap_content", orientation = "vertical", gravity = "center_vertical", layout_height = "wrap_content", { LinearLayout, id = 'chuangk', visibility = 'gone', layout_height = 'wrap_content', { LinearLayout, layout_height = 'match_parent', layout_width = '80dp', onClick = function() end, onTouch = hanshu, orientation = 'vertical', { FrameLayout, id = 'canv', layout_marginLeft = '19dp', layout_marginTop = '10dp', layout_height = "42dp", layout_width = "42dp", gravity = 'center', onClick = 隐藏, onTouch = hanshu, headicon }, { LinearLayout, layout_width='match_parent', layout_weight = 1, layout_height='match_parent', elevation='3dp', background=getBG(0xffffffff,20), layout_margin='5dp', -- layout_marginRight='100dp', onClick=function() end, onTouch=hanshu, 顶边 } }, ckou, }, { ImageView, id = "control", background = 获取图片(悬浮窗图标), layout_width = "40dp", layout_height = "40dp", onTouch = hanshu, onClick = 隐藏, } } totouch=luajava.loadlayout({ LinearLayout, layout_height='42dp', layout_width='42dp', onClick=隐藏, onTouch=hanshu }) local function invoke() local ok local RawX, RawY, x, y mainLayoutParams = getLayoutParams() floatWindow = luajava.loadlayout(floatWindow) local function invoke2() 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) 切换(1) 分区(1) 隐藏() gg.setVisible(false) luajava.setFloatingWindowHide(true) qhkai = 0 qiehuan = function() if qhkai == 0 then qhkai = 1 draw.remove() luajava.runUiThread(function() changan.controlSmall(floatWindow,400) end) gg.sleep(400) luajava.runUiThread(function() floatWindow:setVisibility(View.GONE) end) else qhkai = 0 huiz() draw.text('.', -9200,-9200) luajava.runUiThread(function() floatWindow:setVisibility(View.VISIBLE) end) luajava.runUiThread(function() changan.controlBig(floatWindow,400) end) end end huiz() draw.text('.', -9200,-9200) while true do if tuichu == 1 then break end jianting3(qiehuan) gg.sleep(300) end luajava.setFloatingWindowHide(false) end 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 launch(appstart) local loadBox = getLoadingBox('正在启动游戏\n'..appstart) loadBox['显示']() if appstart ~= nil then gg.setProcess(appstart) gg.sleep(500) if tostring(gg.getTargetPackage()) == appstart then gg.toast("正在启动游戏") gg.processKill() tuichu=true luajava.setFloatingWindowHide(false) os.exit() end gg.toast("正在启动游戏...") app.startActivity(appstart) jci=0 --gg.sleep(5000) while true do gg.setProcess(appstart) gg.sleep(400) if tostring(gg.getTargetPackage()) == appstart then loadBox['关闭']() gg.alert("启动成功") else jci=jci+1 if jci==14 then loadBox['关闭']() gg.alert("自动获取进程失败\n请手动选择游戏进程") gg.setProcessX() break end end gg.sleep(100) end end end function card(cdv) logo=cdv[1] name=cdv[2] tags=cdv[3] func=cdv[4] if not x then x = 2 end tag = { LinearLayout, } for i = 1,#tags do tag[#tag+1] = { TextView, background = getHorizontalBG({0x00FF9700,0x00FF9700},45,2,0xffFF9700), layout_height = "20dp", padding = "2dp", textColor = 0xffFF9700, layout_marginLeft = "10dp", gravity = "center_vertical", text = " "..tags[i].." ", textSize = "9sp", } end tags = tag tmp = luajava.loadlayout( { FrameLayout, layout_height = "wrap_content", layout_width = "fill_parent", { LinearLayout, orientation = "vertical", layout_height = "100dp", layout_marginLeft = "4dp", layout_marginRight = "4dp", layout_marginTop = "2dp", layout_marginBottom = "2dp", layout_width = "match_parent", background=getVerticalBG({0xffffffff,0xffffffff},10,3,0xffe79268), { LinearLayout, layout_marginLeft = "10dp", layout_marginRight = "10dp", layout_marginTop = "10dp", layout_marginBottom = "10dp", layout_width = "match_parent", layout_height = "40dp", { ImageView, layout_width = "40dp", layout_height = "40dp", src = 获取图片(logo), }, { TextView, layout_height = "40dp", layout_marginLeft = "10dp", gravity = "center_vertical", text = name, textColor="#161616", textSize = "13sp", } }, tags }, { LinearLayout, onClick = function() luajava.newThread(function() 隐藏() func() end):start() end, background = getHorizontalBG({0xffe79268,0xffe79268},90), layout_height = "25dp", layout_width = "55dp", layout_gravity = "right", layout_marginRight = "10dp", layout_marginTop = "70dp", gravity = "center", { ImageView, layout_height = "20dp", layout_width = "15dp", src = getRes("rw1"), colorFilter=0xffffffff }, { TextView, textColor = "#ffffff", text = "启动", textSize = "10sp", layout_height = "20dp", gravity = "center", layout_width = "30dp", } } }) return tmp 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) else tview : setVisibility (View.GONE) changan.controlWater (_ENV [tid.."6"] , 200) changan.controlRotation9(boxpic[tid],90,0) end end boxes = {} boxpic = {} function changan.box (views) local tid = "box"..guid () boxpic[tid] = luajava.loadlayout { ImageView , background = getRes("hei_right"), layout_width = "24dp" , layout_height = "24dp" , } local ttid = tid.."6" local t1id = guid () firadio = { LinearLayout , layout_width = 'fill_parent' , layout_height = "wrap_content" , layout_marginTop = "2dp" , layout_marginBottom = "2dp" , orientation = "vertical" , } if type (views [1]) == "string" or type (views [1]) == "number" then firadio [# firadio + 1] = { LinearLayout , layout_width = 'fill_parent' , layout_height = "30dp" , gravity = "center_vertical" , 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', layout_width = "match_parent" , layout_weight=1, textColor = "#000000" , gravity = "center" , },{ LinearLayout , padding={"0dp","0dp","10dp","0dp"}, layout_width = "30dp" , layout_height = "30dp" , gravity = "center", boxpic[tid], } } else gg.alert ("changan.box的table内第一个元素必须是string") os.exit () end radios = { LinearLayout , layout_marginLeft = "0dp" , layout_marginRight = "0dp" , orientation = "vertical" , visibility = "gone" , id = luajava.newId (tid) , padding = "0dp" , layout_width = 'fill_parent' , } 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 corbk = true 当前ui = 1 function 分区(x) 当前分区[当前ui]=x luajava.runUiThread(function() for i=1,分区页数[当前ui] do _ENV['menu'..当前ui..i]:setVisibility(View.GONE) end _ENV['menu'..当前ui..当前分区[当前ui]]:setVisibility(View.VISIBLE) end) end function 切换(x) 当前ui = x luajava.runUiThread(function() if 当前分区[当前ui]==nil then 分区(1) end for i = 1,菜单页数 do _ENV["ding"..i]:setTextColor(0xff483C2E) _ENV['dingbar'..i]:setBackground(empty) _ENV['ding'..i]:setBackground(slctb) _ENV["layout"..i]:setVisibility(View.GONE) end _ENV["ding"..当前ui]:setTextColor(0xff000000) _ENV["layout"..当前ui]:setVisibility(View.VISIBLE) _ENV['ding'..当前ui]:setBackground(slcta) _ENV['dingbar'..当前ui]:setBackground(dbback) changan.controlWater(_ENV['ding'..当前ui],400) changan.controlBigX(_ENV['dingbar'..当前ui],700) end) end 显示 = 0 beij2 = luajava.loadlayout({ GradientDrawable, color = "#001E1C27", cornerRadius = 10 }) function changan.text(txt,color,size) if not txt then txt = "音量键控制悬浮窗" end if not color then color = "#545454" end if not size then size = "12sp" end return luajava.loadlayout( { TextView, text = txt, textSize = size, textColor = color, layout_width = "match_parent", padding={'10dp','0dp','0dp','0dp'} }) end 显示 = 0 function 隐藏() luajava.runUiThread(function() if tonumber(tostring(chuangk:getVisibility())) == 8.0 then control:setVisibility(View.GONE) 显示 = 1 chuangk:setVisibility(View.VISIBLE) _ENV["layout"..当前ui]:setVisibility(View.VISIBLE) changan.controlBigX(floatWindow,800) floatWindow:setBackground(beij) mainLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL window : updateViewLayout (floatWindow , mainLayoutParams) else luajava.startThread(function() luajava.runUiThread(function() YoYoImpl:with("FadeOut"):duration(300):playOn(floatWindow) end) gg.sleep(300) luajava.runUiThread(function() chuangk:setVisibility(View.GONE) floatWindow:setBackground(beij2) control:setVisibility(View.VISIBLE) 显示 = 0 _ENV["layout"..当前ui]:setVisibility(View.GONE) YoYoImpl:with("FadeIn"):duration(300):playOn(floatWindow) mainLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE window : updateViewLayout (floatWindow , mainLayoutParams) end) end) end end) end import("android.media.AudioManager") audi = context:getSystemService("audio") audiotype = { AudioManager.STREAM_ALARM, --手机闹铃的声音 AudioManager.STREAM_MUSIC, --手机音乐的声音 AudioManager.STREAM_NOTIFICATION, --系统提示的通知 AudioManager.STREAM_RING, --电话铃声的声音 AudioManager.STREAM_SYSTEM, --手机系统的声音 AudioManager.STREAM_VOICE_CALL, --语音电话的声音 AudioManager.STREAM_DTMF, --DTMF音调的声音 } 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]) 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 guid() seed = { 'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' } tb = {} for i = 1,32 do table.insert(tb,seed[math.random(1,16)]) end sid = table.concat(tb) return string.format('%s%s%s%s%s', string.sub(sid,1,8), string.sub(sid,10,12), string.sub(sid,21,22)) ..string.format('%s%s%s%s%s', string.sub(sid,1,6), string.sub(sid,21,25) ) end local function exit() tuichu = 1 luajava.setFloatingWindowHide(false) luajava.post(function() window:removeView(floatWindow) end) end setExitEvent(exit) 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 changan.controlBigX = function(control,time) luajava.runUiThread(function() import "android.animation.ObjectAnimator" ObjectAnimator():ofFloat(control,"scaleX", { 0, 0.4, 0.7, 1 }):setDuration(time):start() end) end buts={} heir=getRes("heir") function changan.button(txt,func,txtc) if not txt then txt = "音量键控制悬浮窗" end if not txtc then txtc="#000000" end local tid="Cbutton"..guid() buts[tid]=luajava.loadlayout( { LinearLayout, layout_width = 'match_parent', layout_height = "wrap_content", { LinearLayout, layout_height='30dp', layout_width = "fill_parent", gravity = "center_vertical", layout_margin='5dp', elevation='3dp', background = getButtonBG(), padding="3dp", onClick = function() changan.controlWater(buts[tid],300) luajava.newThread(func):start() end, { TextView, --id = luajava.newId(tid), textColor = txtc, text = txt, textSize = "13sp", gravity='center', layout_height = "wrap_content", layout_width = "fill_parent", layout_weight=1, } }}) return buts[tid] end checkbg1 = getRes("bbts_checkoff") checkbg2 = getRes("bbts_check") checkbg3 = getVerticalBG({0x00aaaaaa,0x00aaaaaa},360,7,0xff999999) checkbg4 = getVerticalBG({0x00000000,0x00000000},360,11,0xffe79268) radoff = getVerticalBG({0xaaBDC7CD,0xaaBDC7CD},360) radon = getRes("dz_check") radiog={} function changan.intradio(nid,name,func) return { LinearLayout , layout_width = 'match_parent' , layout_height = "wrap_content" , layout_weight=1, layout_marginLeft = "2dp" , layout_marginRight = "5dp" , layout_marginTop='2dp', layout_marginBottom='8dp', gravity = "center_vertical" , onClick = function () --changan.controlWater (_ENV [tid] , 200) func() end , { ImageView , id = luajava.newId (nid) , layout_width = '15dp' , layout_height = "15dp" , layout_marginLeft = "2dp" , layout_marginRight = "4dp" , src =radoff , padding='0dp', } , { TextView , gravity = "top" , text = name , textSize="12sp", textColor = '#000000' , layout_width = 'wrap_content' , layout_height = 'wrap_content' , } } end local RadTint=ColorStateList({ {android.R.attr.state_checked}, {-android.R.attr.state_checked}, {}, }, { 0xff5AA7FF, 0xff545454, 0xff545454 }) function changan.intcheck(name,func1,func2) local nid = name..guid() local func = 开关(name,func1,func2,nid) if not name then name = "未设置" end return { LinearLayout, layout_width = 'match_parent', layout_weight=1, layout_height = "42dp", layout_marginTop = "1dp", layout_marginBottom = "1dp", padding = "1dp", { LinearLayout, padding="3dp", layout_width = 'match_parent', layout_height = "wrap_content", gravity = "center_vertical", --background=getVerticalBG({0xffFFFDF2,0xddffffff,0xffFFFDF2},15,8,0xffFFDA71), { CheckBox, id=luajava.newId(nid.."t"), layout_width = '32dp', layout_height = '32dp', padding = "0dp", __onFinish=function(v) v:setButtonTintList(RadTint) end, onClick = function() luajava.newThread(function() func() end):start() end, },{ TextView, gravity = "left", text = name, textColor=0xff000000, textSize = "14sp", layout_width = 'match_parent', layout_weight=1, onClick = function() local v=luajava.getIdView(nid..'t') if v:isChecked() then v:setChecked(false) else v:setChecked(true) end luajava.newThread(function() func() end):start() end, }, } } end function 开关(name , func1 , func2 ) local localname=name local tname=name..guid() if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1 ) == "function" then return function() namers = _ENV [ tname ] if namers ~= "开" then _ENV [ tname ] = "开" pcall(func1 ) else _ENV [ tname ] = "关" pcall(func2 ) end end end end swfuncs,buts,sliders,boxes,textvs={},{},{},{},{} function changan.check(cklist) if #cklist==0 then return nil end local rest = { LinearLayout, layout_width = 'match_parent', layout_height = "wrap_content", gravity = "center", orientation="vertical", } for i = 1, #cklist,2 do local tempTable = {LinearLayout, layout_width = 'match_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 changan.radio(cklist) local rid=guid() radiog[rid]={} rest = { LinearLayout , layout_width = 'match_parent' , layout_height = "wrap_content" , layout_marginTop = "10dp" , } local restt={ LinearLayout , layout_width = 'match_parent' , layout_weight=1, layout_height = "wrap_content" , gravity = "left" , orientation='vertical', } for i = 1, #cklist,4 do local tempTable = {LinearLayout, layout_width = 'fill_parent', layout_height = "wrap_content", gravity = "left", orientation="horizontal" } for j = 0, 3 do if cklist[i + j] ~= nil then local nid = name..guid () local name = cklist[i + j][1] radiog[rid][nid]=false local func1 = radin(rid,nid,cklist[i + j][2],name) if not name then name = "未设置" end local rstt = changan.intradio(nid,name,func1) table.insert(tempTable, rstt) else table.insert(tempTable, {LinearLayout, layout_width = 'match_parent', layout_weight=1,}) end end table.insert(restt, tempTable) end rest [# rest + 1] = restt return luajava.loadlayout (rest) end switchs={} 标题='定制项目' 背景图片="/sdcard/UI/图片/845" 悬浮窗图标 = "/sdcard/UI/图片/844" function huiz()---绘制必须放在这里面 end --配置区 local musicList = {} local currentIndex = 1 local loopPlay = false _G.MP = nil local qiTanState = false -- AK47 function qx1() gg.setRanges(32) gg.toast("切换到AK47,不要开枪") gg.sleep(3000) gg.searchNumber("4.20389539e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("将子弹数量设置为25发") gg.toast("你有13秒时间,请记住当前子弹数") gg.sleep(8000) gg.searchNumber("3.50324616e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("切换到空手,不要开枪") gg.sleep(5000) gg.searchNumber("3.50324616e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100000) gg.toast("请稍候...") gg.sleep(2500) local results = gg.getResults(10) if #results == 0 then gg.clearResults() gg.toast("未找到数据") return end local LT = results[1].address gg.setValues({{ address = LT + 0x1c, flags = 4, value = 9999 }}) gg.clearResults() gg.toast("AK47子弹修改完成") end -- M4A1 function qx2() gg.setRanges(32) gg.toast("切换到M4,不要开枪") gg.sleep(3000) gg.searchNumber("4.20389539e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("将子弹数量设置为25发") gg.toast("你有13秒时间,请记住当前子弹数") gg.sleep(8000) gg.searchNumber("3.50324616e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("切换到空手,不要开枪") gg.sleep(4500) gg.searchNumber("3.50324616e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.sleep(2500) local results = gg.getResults(10) if #results == 0 then gg.clearResults() gg.toast("未找到数据") return end local LT = results[1].address gg.setValues({{ address = LT + 0x1c, flags = 4, value = 9999 }}) gg.clearResults() gg.toast("M4子弹修改完成") end -- FAMAS function qx3() gg.setRanges(32) gg.toast("切换到FAMAS,不要开枪") gg.sleep(3000) gg.searchNumber("3.50324616e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("将子弹数量设置为20发") gg.toast("你有13秒时间,请记住当前子弹数") gg.sleep(8000) gg.searchNumber("2.80259693e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("切换到空手,不要开枪") gg.sleep(5000) gg.searchNumber("2.80259693e-44", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100000) gg.toast("请稍候...") gg.sleep(2500) local results = gg.getResults(10) if #results == 0 then gg.clearResults() gg.toast("未找到数据") return end local LT = results[1].address gg.setValues({{ address = LT + 0x1c, flags = 4, value = 9999 }}) gg.clearResults() gg.toast("FAMAS子弹修改完成") end -- AWP function qx4() gg.setRanges(32) gg.toast("切换到AWP,不要开枪") gg.sleep(3000) gg.searchNumber("7.00649232e-45", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("将子弹数量设置为3发") gg.toast("你有13秒时间,请记住当前子弹数") gg.sleep(8000) gg.searchNumber("4.20389539e-45", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(90000) gg.alert("切换空手,不要开枪") gg.sleep(5000) gg.searchNumber("4.20389539e-45", 16, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100000) gg.toast("请稍候...") gg.sleep(2500) local results = gg.getResults(10) if #results == 0 then gg.clearResults() gg.toast("未找到数据") return end local LT = results[1].address gg.setValues({{ address = LT + 0x1c, flags = 4, value = 999 }}) gg.clearResults() gg.toast("AWP子弹修改完成") end 第一页 = { ["分页名字"] = "主功能", ["侧边图标"] = "/sdcard/UI/图片/844", ["功能配置"] = { changan.button("选择进程", gg.setProcessX), changan.box({ "范围", changan.check({ { "范围:普通", function() local SIGNATURE_VEHICLE = "1040187392" local SIGNATURE_CHECK_QWORD = 1035489772 local OFFSET_CHECK_QWORD = 0x20 gg.toast("正在扫描范围基址...") gg.clearResults() gg.searchNumber(SIGNATURE_VEHICLE, gg.TYPE_QWORD) local sigResults = gg.getResults(100000) gg.clearResults() if #sigResults == 0 then gg.alert("未找到范围基址,请检查游戏是否加载完成") return end local vehicleBases = {} for _, res in ipairs(sigResults) do local base = res.address local check_val = gg.getValues({ {address = base + OFFSET_CHECK_QWORD, flags = gg.TYPE_QWORD} })[1].value if check_val == SIGNATURE_CHECK_QWORD then table.insert(vehicleBases, base) end end if #vehicleBases == 0 then gg.alert("未找到有效基址") string.toMusic("范围开启失败") return end local edits = {} for _, base in ipairs(vehicleBases) do table.insert(edits, { address = base, flags = gg.TYPE_FLOAT, value = 30 }) end if #edits > 0 then gg.setValues(edits) gg.toast("范围已开启") string.toMusic("范围开启成功") end end, }, { "范围:激进", function() local SIGNATURE_VEHICLE = "1040187392" local SIGNATURE_CHECK_QWORD = 1035489772 local OFFSET_CHECK_QWORD = 0x20 gg.toast("扫描中...") gg.clearResults() gg.searchNumber(SIGNATURE_VEHICLE, gg.TYPE_QWORD) local sigResults = gg.getResults(1000000) gg.clearResults() if #sigResults == 0 then gg.alert("未找到基址") return end local vehicleBases = {} for _, res in ipairs(sigResults) do local base = res.address local check_val = gg.getValues({ {address = base + OFFSET_CHECK_QWORD, flags = gg.TYPE_QWORD} })[1].value if check_val == SIGNATURE_CHECK_QWORD then table.insert(vehicleBases, base) end end if #vehicleBases == 0 then gg.alert("无有效范围") string.toMusic("范围开启失败") return end local edits = {} for _, base in ipairs(vehicleBases) do table.insert(edits, { address = base, flags = gg.TYPE_FLOAT, value = 999999 }) end if #edits > 0 then gg.setValues(edits) gg.toast("最大范围已开启") string.toMusic("范围开启成功") end end, }, }), }), changan.box({ "微加速", changan.check({ { "开启", function() file.cpp(("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"):base64("de"):unzip()) gg.toast("微加速已开启") string.toMusic("微加速已开启") end, }, { "关闭", function() file.cpp(("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"):base64("de"):unzip()) gg.toast("微加速已关闭") string.toMusic("微加速已关闭") end } }) }), changan.button("无后座", function() gg.toast("正在开启无后座...") gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("2.2", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(850) gg.editAll("0", gg.TYPE_FLOAT) gg.clearResults() gg.toast("无后座已开启") string.toMusic("无后座开启成功") end), changan.box({ "控车", changan.check({ { "25", function() gg.toast("正在初始化控车...") string.toMusic("正在开启") tuichu = 0 local NF_CONFIG = { HORIZONTAL_GAIN = 25.0, VERTICAL_GAIN = 1.8, MAX_LIFT = 25.0, MIN_LIFT = -25.0, PITCH_DEADZONE = 1.0, CENTRIPETAL_GAIN = 8.8, MIN_DISTANCE = 3.0, MAX_DISTANCE = 150.0, CAMERA_QVALUE = "4575657222472213797", VEHICLE_DVALUE = "-2097152000", CHARACTER_PATTERNS= { [4435549367697198285]=true, [4435549389172034765]=true, [4435549410646871245]=true, }, CAMERA_OFFSETS = { VALIDATION_1=0x28, VALIDATION_2=0x2C }, VEHICLE_OFFSETS = { BASE_CHECK = -0x4, RANGE_MIN = 99, RANGE_MAX = 199, CHAR_CHECK = 0x98, FLOAT_CHECK= 0xA4, }, CAMERA_POS_OFFSETS= { X=0x14, Y=0x18, Z=0x1C }, VEHICLE_POS_OFFSETS={ X=0x3C, Y=0x40, Z=0x44 }, UPDATE_INTERVAL = 50, } local function filterInstances(pattern, params) gg.clearResults() gg.setRanges(32) gg.searchNumber(pattern, params.searchType) local cand = gg.getResults(8000) local valid = {} for _, inst in ipairs(cand) do local ok = false if params.mode=="camera" then local v1 = gg.getValues({{address=inst.address+params.offset1,flags=gg.TYPE_DWORD}})[1].value local v2 = gg.getValues({{address=inst.address+params.offset2,flags=gg.TYPE_DWORD}})[1].value ok = (v1~=v2) else local base = inst.address + params.baseOffset local bval = gg.getValues({{address=base,flags=gg.TYPE_DWORD}})[1].value if bval>=params.rangeMin and bval<=params.rangeMax then local r = gg.getValues({ {address=base+params.charOffset,flags=gg.TYPE_QWORD}, {address=base+params.floatOffset,flags=gg.TYPE_FLOAT} }) local r2=gg.getValues({ {address=base+0x68,flags=gg.TYPE_FLOAT}, {address=base+0x8C,flags=gg.TYPE_FLOAT} }) ok = (not params.charPatterns[r[1].value]) and r[2].value~=0 and r[2].value~=1 and r2[1].value>0.13 and r2[1].value<0.17 end inst.address = base end if ok then table.insert(valid, params.process(inst.address)) end end if #valid==0 then gg.alert("未找到载具/摄像机") return end return valid end local function initCamera() return filterInstances(NF_CONFIG.CAMERA_QVALUE, { searchType=gg.TYPE_QWORD, mode="camera", offset1=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_1, offset2=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_2, process=function(base) return { x=base+0x24,y=base+0x28,z=base+0x2C,w=base+0x30, posX=base+NF_CONFIG.CAMERA_POS_OFFSETS.X, posY=base+NF_CONFIG.CAMERA_POS_OFFSETS.Y, posZ=base+NF_CONFIG.CAMERA_POS_OFFSETS.Z } end })[1] end local function initVehicles() return filterInstances(NF_CONFIG.VEHICLE_DVALUE, { searchType=gg.TYPE_DWORD, mode="vehicle", baseOffset=NF_CONFIG.VEHICLE_OFFSETS.BASE_CHECK, rangeMin=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MIN, rangeMax=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MAX, charOffset=NF_CONFIG.VEHICLE_OFFSETS.CHAR_CHECK, floatOffset=NF_CONFIG.VEHICLE_OFFSETS.FLOAT_CHECK, charPatterns=NF_CONFIG.CHARACTER_PATTERNS, process=function(base) return { X=base+0x6C,Y=base+0x70,Z=base+0x74, posX=base+NF_CONFIG.VEHICLE_POS_OFFSETS.X, posY=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Y, posZ=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Z, EC=base+0x114 } end }) end local function quaternionToEuler(q) local len = math.sqrt(q.x^2+q.y^2+q.z^2+q.w^2) if len<0.001 then return {x=0,z=1,pitch=0} end q.x,q.y,q.z,q.w = q.x/len,q.y/len,q.z/len,q.w/len local fx=2*(q.x*q.z+q.w*q.y) local fy=2*(q.y*q.z-q.w*q.x) local fz=1-2*(q.x^2+q.y^2) return {x=fx,z=fz,pitch=math.deg(math.asin(fy))} end local function calculateVertical(p) if math.abs(p)NF_CONFIG.MAX_DISTANCE then return 0,0,0 end local decay=1-(dist/NF_CONFIG.MAX_DISTANCE)^2 local f=NF_CONFIG.CENTRIPETAL_GAIN*decay/dist return dx*f,dy*f,dz*f end local camera, vehicles = nil, nil local function initNewFeature() camera = initCamera() vehicles = initVehicles() gg.toast("控车初始化完成") string.toMusic("控车已开启") end local function updateNewFeature() if tuichu == 1 then return end local vals = gg.getValues({ {address=camera.x, flags=gg.TYPE_FLOAT}, {address=camera.y, flags=gg.TYPE_FLOAT}, {address=camera.z, flags=gg.TYPE_FLOAT}, {address=camera.w, flags=gg.TYPE_FLOAT}, {address=camera.posX, flags=gg.TYPE_FLOAT}, {address=camera.posY, flags=gg.TYPE_FLOAT}, {address=camera.posZ, flags=gg.TYPE_FLOAT}, }) local camPos = {x=vals[5].value,y=vals[6].value,z=vals[7].value} local quat = {x=vals[1].value,y=vals[2].value,z=vals[3].value,w=vals[4].value} local reqs={} for _,v in ipairs(vehicles) do table.insert(reqs,{address=v.posX,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posY,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posZ,flags=gg.TYPE_FLOAT}) end local pres = gg.getValues(reqs) local vehPosList = {} for i=1,#vehicles do local idx=(i-1)*3+1 vehPosList[i]={x=pres[idx].value,y=pres[idx+1].value,z=pres[idx+2].value} end local euler = quaternionToEuler(quat) local yMom = calculateVertical(euler.pitch) local baseX = euler.x * NF_CONFIG.HORIZONTAL_GAIN local baseZ = euler.z * NF_CONFIG.HORIZONTAL_GAIN local updates={} for i,v in ipairs(vehicles) do local cx,cy,cz = calculateCentripetal(camPos,vehPosList[i]) local fx = baseX + cx local fy = yMom + cy local fz = baseZ + cz table.insert(updates,{address=v.X, flags=gg.TYPE_FLOAT, value=fx}) table.insert(updates,{address=v.Y, flags=gg.TYPE_FLOAT, value=fy}) table.insert(updates,{address=v.Z, flags=gg.TYPE_FLOAT, value=fz}) table.insert(updates,{address=v.EC, flags=gg.TYPE_DWORD, value=0}) end pcall(gg.setValues, updates) end initNewFeature() while tuichu ~= 1 do updateNewFeature() gg.sleep(50) end gg.toast("控车已停止") string.toMusic("控车已关闭") end, }, { "50", function() gg.toast("正在初始化控车...") string.toMusic("正在开启") tuichu = 0 local NF_CONFIG = { HORIZONTAL_GAIN = 50.0, VERTICAL_GAIN = 1.8, MAX_LIFT = 25.0, MIN_LIFT = -25.0, PITCH_DEADZONE = 1.0, CENTRIPETAL_GAIN = 8.8, MIN_DISTANCE = 3.0, MAX_DISTANCE = 150.0, CAMERA_QVALUE = "4575657222472213797", VEHICLE_DVALUE = "-2097152000", CHARACTER_PATTERNS= { [4435549367697198285]=true, [4435549389172034765]=true, [4435549410646871245]=true, }, CAMERA_OFFSETS = { VALIDATION_1=0x28, VALIDATION_2=0x2C }, VEHICLE_OFFSETS = { BASE_CHECK = -0x4, RANGE_MIN = 99, RANGE_MAX = 199, CHAR_CHECK = 0x98, FLOAT_CHECK= 0xA4, }, CAMERA_POS_OFFSETS= { X=0x14, Y=0x18, Z=0x1C }, VEHICLE_POS_OFFSETS={ X=0x3C, Y=0x40, Z=0x44 }, UPDATE_INTERVAL = 50, } local function filterInstances(pattern, params) gg.clearResults() gg.setRanges(32) gg.searchNumber(pattern, params.searchType) local cand = gg.getResults(8000) local valid = {} for _, inst in ipairs(cand) do local ok = false if params.mode=="camera" then local v1 = gg.getValues({{address=inst.address+params.offset1,flags=gg.TYPE_DWORD}})[1].value local v2 = gg.getValues({{address=inst.address+params.offset2,flags=gg.TYPE_DWORD}})[1].value ok = (v1~=v2) else local base = inst.address + params.baseOffset local bval = gg.getValues({{address=base,flags=gg.TYPE_DWORD}})[1].value if bval>=params.rangeMin and bval<=params.rangeMax then local r = gg.getValues({ {address=base+params.charOffset,flags=gg.TYPE_QWORD}, {address=base+params.floatOffset,flags=gg.TYPE_FLOAT} }) local r2=gg.getValues({ {address=base+0x68,flags=gg.TYPE_FLOAT}, {address=base+0x8C,flags=gg.TYPE_FLOAT} }) ok = (not params.charPatterns[r[1].value]) and r[2].value~=0 and r[2].value~=1 and r2[1].value>0.13 and r2[1].value<0.17 end inst.address = base end if ok then table.insert(valid, params.process(inst.address)) end end if #valid==0 then gg.alert("未找到载具/摄像机") return end return valid end local function initCamera() return filterInstances(NF_CONFIG.CAMERA_QVALUE, { searchType=gg.TYPE_QWORD, mode="camera", offset1=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_1, offset2=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_2, process=function(base) return { x=base+0x24,y=base+0x28,z=base+0x2C,w=base+0x30, posX=base+NF_CONFIG.CAMERA_POS_OFFSETS.X, posY=base+NF_CONFIG.CAMERA_POS_OFFSETS.Y, posZ=base+NF_CONFIG.CAMERA_POS_OFFSETS.Z } end })[1] end local function initVehicles() return filterInstances(NF_CONFIG.VEHICLE_DVALUE, { searchType=gg.TYPE_DWORD, mode="vehicle", baseOffset=NF_CONFIG.VEHICLE_OFFSETS.BASE_CHECK, rangeMin=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MIN, rangeMax=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MAX, charOffset=NF_CONFIG.VEHICLE_OFFSETS.CHAR_CHECK, floatOffset=NF_CONFIG.VEHICLE_OFFSETS.FLOAT_CHECK, charPatterns=NF_CONFIG.CHARACTER_PATTERNS, process=function(base) return { X=base+0x6C,Y=base+0x70,Z=base+0x74, posX=base+NF_CONFIG.VEHICLE_POS_OFFSETS.X, posY=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Y, posZ=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Z, EC=base+0x114 } end }) end local function quaternionToEuler(q) local len = math.sqrt(q.x^2+q.y^2+q.z^2+q.w^2) if len<0.001 then return {x=0,z=1,pitch=0} end q.x,q.y,q.z,q.w = q.x/len,q.y/len,q.z/len,q.w/len local fx=2*(q.x*q.z+q.w*q.y) local fy=2*(q.y*q.z-q.w*q.x) local fz=1-2*(q.x^2+q.y^2) return {x=fx,z=fz,pitch=math.deg(math.asin(fy))} end local function calculateVertical(p) if math.abs(p)NF_CONFIG.MAX_DISTANCE then return 0,0,0 end local decay=1-(dist/NF_CONFIG.MAX_DISTANCE)^2 local f=NF_CONFIG.CENTRIPETAL_GAIN*decay/dist return dx*f,dy*f,dz*f end local camera, vehicles = nil, nil local function initNewFeature() camera = initCamera() vehicles = initVehicles() gg.toast("控车初始化完成") string.toMusic("控车已开启") end local function updateNewFeature() if tuichu == 1 then return end local vals = gg.getValues({ {address=camera.x, flags=gg.TYPE_FLOAT}, {address=camera.y, flags=gg.TYPE_FLOAT}, {address=camera.z, flags=gg.TYPE_FLOAT}, {address=camera.w, flags=gg.TYPE_FLOAT}, {address=camera.posX, flags=gg.TYPE_FLOAT}, {address=camera.posY, flags=gg.TYPE_FLOAT}, {address=camera.posZ, flags=gg.TYPE_FLOAT}, }) local camPos = {x=vals[5].value,y=vals[6].value,z=vals[7].value} local quat = {x=vals[1].value,y=vals[2].value,z=vals[3].value,w=vals[4].value} local reqs={} for _,v in ipairs(vehicles) do table.insert(reqs,{address=v.posX,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posY,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posZ,flags=gg.TYPE_FLOAT}) end local pres = gg.getValues(reqs) local vehPosList = {} for i=1,#vehicles do local idx=(i-1)*3+1 vehPosList[i]={x=pres[idx].value,y=pres[idx+1].value,z=pres[idx+2].value} end local euler = quaternionToEuler(quat) local yMom = calculateVertical(euler.pitch) local baseX = euler.x * NF_CONFIG.HORIZONTAL_GAIN local baseZ = euler.z * NF_CONFIG.HORIZONTAL_GAIN local updates={} for i,v in ipairs(vehicles) do local cx,cy,cz = calculateCentripetal(camPos,vehPosList[i]) local fx = baseX + cx local fy = yMom + cy local fz = baseZ + cz table.insert(updates,{address=v.X, flags=gg.TYPE_FLOAT, value=fx}) table.insert(updates,{address=v.Y, flags=gg.TYPE_FLOAT, value=fy}) table.insert(updates,{address=v.Z, flags=gg.TYPE_FLOAT, value=fz}) table.insert(updates,{address=v.EC, flags=gg.TYPE_DWORD, value=0}) end pcall(gg.setValues, updates) end initNewFeature() while tuichu ~= 1 do updateNewFeature() gg.sleep(50) end gg.toast("控车已停止") string.toMusic("控车已关闭") end, }, { "100", function() gg.toast("正在初始化控车...") string.toMusic("正在开启") tuichu = 0 local NF_CONFIG = { HORIZONTAL_GAIN = 100.0, VERTICAL_GAIN = 1.8, MAX_LIFT = 25.0, MIN_LIFT = -25.0, PITCH_DEADZONE = 1.0, CENTRIPETAL_GAIN = 8.8, MIN_DISTANCE = 3.0, MAX_DISTANCE = 150.0, CAMERA_QVALUE = "4575657222472213797", VEHICLE_DVALUE = "-2097152000", CHARACTER_PATTERNS= { [4435549367697198285]=true, [4435549389172034765]=true, [4435549410646871245]=true, }, CAMERA_OFFSETS = { VALIDATION_1=0x28, VALIDATION_2=0x2C }, VEHICLE_OFFSETS = { BASE_CHECK = -0x4, RANGE_MIN = 99, RANGE_MAX = 199, CHAR_CHECK = 0x98, FLOAT_CHECK= 0xA4, }, CAMERA_POS_OFFSETS= { X=0x14, Y=0x18, Z=0x1C }, VEHICLE_POS_OFFSETS={ X=0x3C, Y=0x40, Z=0x44 }, UPDATE_INTERVAL = 50, } local function filterInstances(pattern, params) gg.clearResults() gg.setRanges(32) gg.searchNumber(pattern, params.searchType) local cand = gg.getResults(8000) local valid = {} for _, inst in ipairs(cand) do local ok = false if params.mode=="camera" then local v1 = gg.getValues({{address=inst.address+params.offset1,flags=gg.TYPE_DWORD}})[1].value local v2 = gg.getValues({{address=inst.address+params.offset2,flags=gg.TYPE_DWORD}})[1].value ok = (v1~=v2) else local base = inst.address + params.baseOffset local bval = gg.getValues({{address=base,flags=gg.TYPE_DWORD}})[1].value if bval>=params.rangeMin and bval<=params.rangeMax then local r = gg.getValues({ {address=base+params.charOffset,flags=gg.TYPE_QWORD}, {address=base+params.floatOffset,flags=gg.TYPE_FLOAT} }) local r2=gg.getValues({ {address=base+0x68,flags=gg.TYPE_FLOAT}, {address=base+0x8C,flags=gg.TYPE_FLOAT} }) ok = (not params.charPatterns[r[1].value]) and r[2].value~=0 and r[2].value~=1 and r2[1].value>0.13 and r2[1].value<0.17 end inst.address = base end if ok then table.insert(valid, params.process(inst.address)) end end if #valid==0 then gg.alert("未找到载具/摄像机") return end return valid end local function initCamera() return filterInstances(NF_CONFIG.CAMERA_QVALUE, { searchType=gg.TYPE_QWORD, mode="camera", offset1=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_1, offset2=NF_CONFIG.CAMERA_OFFSETS.VALIDATION_2, process=function(base) return { x=base+0x24,y=base+0x28,z=base+0x2C,w=base+0x30, posX=base+NF_CONFIG.CAMERA_POS_OFFSETS.X, posY=base+NF_CONFIG.CAMERA_POS_OFFSETS.Y, posZ=base+NF_CONFIG.CAMERA_POS_OFFSETS.Z } end })[1] end local function initVehicles() return filterInstances(NF_CONFIG.VEHICLE_DVALUE, { searchType=gg.TYPE_DWORD, mode="vehicle", baseOffset=NF_CONFIG.VEHICLE_OFFSETS.BASE_CHECK, rangeMin=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MIN, rangeMax=NF_CONFIG.VEHICLE_OFFSETS.RANGE_MAX, charOffset=NF_CONFIG.VEHICLE_OFFSETS.CHAR_CHECK, floatOffset=NF_CONFIG.VEHICLE_OFFSETS.FLOAT_CHECK, charPatterns=NF_CONFIG.CHARACTER_PATTERNS, process=function(base) return { X=base+0x6C,Y=base+0x70,Z=base+0x74, posX=base+NF_CONFIG.VEHICLE_POS_OFFSETS.X, posY=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Y, posZ=base+NF_CONFIG.VEHICLE_POS_OFFSETS.Z, EC=base+0x114 } end }) end local function quaternionToEuler(q) local len = math.sqrt(q.x^2+q.y^2+q.z^2+q.w^2) if len<0.001 then return {x=0,z=1,pitch=0} end q.x,q.y,q.z,q.w = q.x/len,q.y/len,q.z/len,q.w/len local fx=2*(q.x*q.z+q.w*q.y) local fy=2*(q.y*q.z-q.w*q.x) local fz=1-2*(q.x^2+q.y^2) return {x=fx,z=fz,pitch=math.deg(math.asin(fy))} end local function calculateVertical(p) if math.abs(p)NF_CONFIG.MAX_DISTANCE then return 0,0,0 end local decay=1-(dist/NF_CONFIG.MAX_DISTANCE)^2 local f=NF_CONFIG.CENTRIPETAL_GAIN*decay/dist return dx*f,dy*f,dz*f end local camera, vehicles = nil, nil local function initNewFeature() camera = initCamera() vehicles = initVehicles() gg.toast("控车初始化完成") string.toMusic("控车已开启") end local function updateNewFeature() if tuichu == 1 then return end local vals = gg.getValues({ {address=camera.x, flags=gg.TYPE_FLOAT}, {address=camera.y, flags=gg.TYPE_FLOAT}, {address=camera.z, flags=gg.TYPE_FLOAT}, {address=camera.w, flags=gg.TYPE_FLOAT}, {address=camera.posX, flags=gg.TYPE_FLOAT}, {address=camera.posY, flags=gg.TYPE_FLOAT}, {address=camera.posZ, flags=gg.TYPE_FLOAT}, }) local camPos = {x=vals[5].value,y=vals[6].value,z=vals[7].value} local quat = {x=vals[1].value,y=vals[2].value,z=vals[3].value,w=vals[4].value} local reqs={} for _,v in ipairs(vehicles) do table.insert(reqs,{address=v.posX,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posY,flags=gg.TYPE_FLOAT}) table.insert(reqs,{address=v.posZ,flags=gg.TYPE_FLOAT}) end local pres = gg.getValues(reqs) local vehPosList = {} for i=1,#vehicles do local idx=(i-1)*3+1 vehPosList[i]={x=pres[idx].value,y=pres[idx+1].value,z=pres[idx+2].value} end local euler = quaternionToEuler(quat) local yMom = calculateVertical(euler.pitch) local baseX = euler.x * NF_CONFIG.HORIZONTAL_GAIN local baseZ = euler.z * NF_CONFIG.HORIZONTAL_GAIN local updates={} for i,v in ipairs(vehicles) do local cx,cy,cz = calculateCentripetal(camPos,vehPosList[i]) local fx = baseX + cx local fy = yMom + cy local fz = baseZ + cz table.insert(updates,{address=v.X, flags=gg.TYPE_FLOAT, value=fx}) table.insert(updates,{address=v.Y, flags=gg.TYPE_FLOAT, value=fy}) table.insert(updates,{address=v.Z, flags=gg.TYPE_FLOAT, value=fz}) table.insert(updates,{address=v.EC, flags=gg.TYPE_DWORD, value=0}) end pcall(gg.setValues, updates) end initNewFeature() while tuichu ~= 1 do updateNewFeature() gg.sleep(50) end gg.toast("控车已停止") string.toMusic("控车已关闭") end, } }) }) } } 第二页 = { ['分页名字'] = "子弹修改", ['侧边图标'] = "/sdcard/UI/图片/844", ['功能配置'] = { changan.button("AK47子弹修改", qx1), changan.button("M4A1子弹修改", qx2), changan.button("FAMAS子弹修改", qx3), changan.button("AWP子弹修改", qx4), } } 第四页 = { ["分页名字"] = "公告栏", ["侧边图标"] = "/sdcard/UI/图片/844", ["功能配置"] = { changan.button("查看公告", function() gg.alert([[ 公告栏 脚本说明: - 仅支持《火力全开2:城市狂热》使用 - 在线模式使用有封号风险,请谨慎操作 反馈建议: 如有bug或功能需求,请联系作者 ]], "关闭") end), changan.button("版本信息", function() gg.alert([[ 版本:1.0 更新时间:2026-07 ]], "确定") end), changan.button("使用须知", function() gg.alert([[ 使用须知: 1. 必须使用RLGG/云模块运行脚本 2. 请先挂游戏进程再运行脚本 3. 地址可能随游戏版本更新而失效 4. 本脚本仅供学习交流,请勿用于非法用途 ]], "我已阅读") end) } } 第三页 = { ["分页名字"] = "娱乐功能", ["侧边图标"] = "/sdcard/UI/图片/844", ["功能配置"] = { changan.button("车辆加速", (function() local state = false return function() gg.setRanges(16392) if not state then gg.searchNumber("3.5999999046325684", gg.TYPE_FLOAT) gg.getResults(100) gg.editAll("1.00000022E-39", gg.TYPE_FLOAT) gg.clearResults() gg.toast("车辆加速 已开启,再次点击关闭") state = true else gg.searchNumber("1.00000022E-39", gg.TYPE_FLOAT) gg.getResults(100) gg.editAll("9.5999999046325684", gg.TYPE_FLOAT) gg.clearResults() gg.toast("车辆加速 已关闭") state = false end end end)()), changan.button("枪械移动-开启", function() gg.setRanges(32) gg.searchNumber("4405601299473880842", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(1000) gg.editAll("4575657222473777152", gg.TYPE_QWORD) gg.clearResults() gg.toast("枪械移动已开启") end), changan.button("枪械移动-关闭", function() gg.setRanges(32) gg.searchNumber("4575657222473777152", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(1000) gg.editAll("4405601299473880842", gg.TYPE_QWORD) gg.clearResults() gg.toast("已经关闭了") end), } } changan.menu({ 第一页,--调用上边的分页配置 第二页, 第三页, 第四页, 第五页, 第六页, }) --定制待更新