local material3 = elgg.import("material3") context = material3:getContext() context.setTheme(0x7f090069) import "android.os.*" import "android.view.*" import "android.widget.*" import "android.graphics.PixelFormat" import "android.graphics.Color" import "android.graphics.drawable.GradientDrawable" import "android.graphics.drawable.StateListDrawable" import "com.google.android.material.materialswitch.MaterialSwitch" import "android.graphics.Color" import "android.content.res.ColorStateList" import "android.animation.LayoutTransition" import 'com.google.android.material.slider.Slider' import "android.animation.ObjectAnimator" import "android.animation.AnimatorSet" import "android.view.animation.DecelerateInterpolator" import "android.animation.LayoutTransition" import "android.animation.ValueAnimator" import "android.view.animation.LinearInterpolator" import "android.renderscript.*" import "android.graphics.Bitmap" import "android.graphics.Canvas" import "android.os.Handler" import "android.os.Looper" elgg.import("HiddenApiBypass") elgg.import("toast") toast.setMode(1) elgg.import("内核读写") local lj = "/storage/emulated/0/樱泽墨资源" local window = activity.getSystemService("window") local changan = { } gg.setVisible(false ) local HotPoint = luajava.bindClass("android.ext.HotPoint") local HP = HotPoint.getMethod("d") HotPoint = HotPoint.instance HotPoint.f() local function getVerticalBG(gtvb1, gtvb3, gtvb4, gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local colors = luajava.new(GradientDrawable) colors.setColor(gtvb1) colors.setCornerRadius(gtvb3) colors.setGradientType(GradientDrawable.LINEAR_GRADIENT) colors.setStroke(gtvb4, gtvb5) return colors end function applyBestBlurEffect(view, radius) if Build.VERSION.SDK_INT >= 31 then view.setRenderEffect( nil ) end local animator = ValueAnimator.ofFloat(0, radius) animator.setDuration(400) animator.setInterpolator(DecelerateInterpolator()) animator.addUpdateListener( { onAnimationUpdate = function (animation) local currentRadius = animation.getAnimatedValue() if Build.VERSION.SDK_INT >= 31 then import "android.graphics.RenderEffect" import "android.graphics.Shader" local blurEffect = RenderEffect.createBlurEffect(currentRadius, currentRadius, Shader.TileMode.CLAMP) view.setRenderEffect(blurEffect) return end if Build.VERSION.SDK_INT >= 26 then local rootView = activity.getWindow().getDecorView().getRootView() local blurredBg = applyFullResBlur(rootView, currentRadius) view.setBackgroundDrawable(BitmapDrawable(activity.getResources(), blurredBg)) return end local alpha = math.floor(0x80 * (currentRadius / radius)) local drawable = GradientDrawable() drawable.setColor(alpha * 0x1000000) drawable.setCornerRadius(35) view.setBackgroundDrawable(drawable) end }) animator.addListener( { onAnimationEnd = function () if Build.VERSION.SDK_INT >= 31 then import "android.graphics.RenderEffect" import "android.graphics.Shader" local blurEffect = RenderEffect.createBlurEffect(radius, radius, Shader.TileMode.CLAMP) view.setRenderEffect(blurEffect) end end }) animator.start() view.setPivotX(view.getWidth() / 2) view.setPivotY(view.getHeight() / 2) local scaleAnimator = ObjectAnimator.ofFloat(view, "scaleX", 0.9, 1.05, 1.0) local scaleYAnimator = ObjectAnimator.ofFloat(view, "scaleY", 0.9, 1.05, 1.0) local animSet = AnimatorSet() animSet.playTogether(scaleAnimator, scaleYAnimator) animSet.setDuration(800) animSet.setInterpolator(DecelerateInterpolator()) animSet.start() return true end function createBlurDrawable() local BlurMaskFilter = luajava.bindClass("android.graphics.BlurMaskFilter") local Blur = luajava.bindClass("android.graphics.BlurMaskFilter$Blur") local RectShape = luajava.bindClass("android.graphics.drawable.shapes.RectShape") local ShapeDrawable = luajava.bindClass("android.graphics.drawable.ShapeDrawable") local Color = luajava.bindClass("android.graphics.Color") local blur = BlurMaskFilter(12000, Blur.NORMAL) local shape = luajava.new(RectShape) local shapeDrawable = luajava.new(ShapeDrawable, shape) local paint = shapeDrawable.getPaint() paint.setMaskFilter(blur) paint.setColor(Color.parseColor("#aaFFFFFF")) return shapeDrawable end changan.tup = function ( ... ) local skinList = { ... } if #skinList == 0 then return end local mainLayout = loadlayout( {LinearLayout, layout_width = "fill_parent", layout_height = "wrap_content", orientation = "vertical"}) local scrollView = loadlayout( { HorizontalScrollView, layout_width = "fill_parent", layout_height = "wrap_content", { LinearLayout, layout_width = "wrap_content", layout_height = "wrap_content", orientation = "vertical", id = "rows_container" } }) mainLayout.addView(scrollView) local colCount = 4 local currentRow = nil for i, skin in ipairs(skinList) do local name = skin[1] local imgPath = skin[2] or "" local openFunc = skin[3] or function () print("开启:" .. name) end if (i - 1) % colCount == 0 then currentRow = loadlayout( { LinearLayout, layout_width = "wrap_content", layout_height = "wrap_content", orientation = "horizontal", id = "row_" .. math.ceil(i / colCount) }) rows_container.addView(currentRow) end local skinCard = loadlayout( { LinearLayout, layout_width = "70dp", layout_height = "50dp", orientation = "vertical", gravity = "top|center", layout_margin = "3dp", background = miaobian(3, 6, 0xffD1E0F0, 0xff8AB4F8), padding = "2dp 2dp 0dp 2dp", tag = i, { FrameLayout, layout_width = "60dp", layout_height = "40dp", layout_gravity = "center", layout_marginBottom = "0dp", layout_marginTop = "-2dp", { ImageView, src = imgPath, layout_width = "match_parent", layout_height = "match_parent", scaleType = "fitCenter", scaleX = 1.0, scaleY = 1.1, pivotX = 0.5, pivotY = 0.5, adjustViewBounds = true, } }, { TextView, Typeface = font, text = name, textColor = 0xff5A7FA5, textSize = "8sp", gravity = "center", layout_width = "fill_parent", layout_height = "wrap_content", layout_marginTop = "-3dp", singleLine = true, ellipsize = "end", } }) skinCard.onClick = function () -- 点击瞬间改变颜色 skinCard.setBackground(miaobian(3, 6, 0xffA0C0E8, 0xff6A9DF0)) -- 直接在主线程上延迟执行恢复 skinCard.postDelayed( function () skinCard.setBackground(miaobian(3, 6, 0xffD1E0F0, 0xff8AB4F8)) end, 200) -- 执行开启函数 threadStart( {run = function () pcall(openFunc) end }) end currentRow.addView(skinCard) end return mainLayout end local function getVerticalBG(gtvb1, gtvb3, gtvb4, gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xff000000 end local colors = luajava.new(GradientDrawable) colors.setColor(gtvb1) colors.setCornerRadius(gtvb3) colors.setGradientType(GradientDrawable.LINEAR_GRADIENT) colors.setStroke(gtvb4, gtvb5) return colors end function zm_animation(view) view.setPivotX(view.getWidth() / 2) view.setPivotY(view.getHeight() / 2) local scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0.9, 1) local scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0.9, 1) local alpha = ObjectAnimator.ofFloat(view, "alpha", 0, 1) local translateY = ObjectAnimator.ofFloat(view, "translationY", 12, 0) local animatorSet = AnimatorSet() animatorSet.playTogether(scaleX, scaleY, alpha, translateY) animatorSet.setDuration(320) animatorSet.setInterpolator(DecelerateInterpolator()) view.post( function () animatorSet.start() end ) end function zoom_animation(view) if view.getWidth() == 0 or view.getHeight() == 0 then view.post( function () zoom_animation(view) end ) return end view.setPivotX(view.getWidth() / 2) view.setPivotY(view.getHeight() / 2) local scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0.9, 1) local scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0.9, 1) local alpha = ObjectAnimator.ofFloat(view, "alpha", 0, 1) local translateY = ObjectAnimator.ofFloat(view, "translationY", 10, 0) local animatorSet = AnimatorSet() animatorSet.playTogether(scaleX, scaleY, alpha, translateY) animatorSet.setDuration(300) animatorSet.setInterpolator(DecelerateInterpolator()) animatorSet.start() end function zom_animation(view) if view.getWidth() == 0 or view.getHeight() == 0 then view.post( function () zom_animation(view) end ) return end view.setPivotX(view.getWidth() / 2) view.setPivotY(view.getHeight() / 2) local scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.05, 0.9) local scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.05, 0.9) local alpha = ObjectAnimator.ofFloat(view, "alpha", 1, 0) local translateY = ObjectAnimator.ofFloat(view, "translationY", 0, 12) local animatorSet = AnimatorSet() animatorSet.playTogether(scaleX, scaleY, alpha, translateY) animatorSet.setDuration(320) animatorSet.setInterpolator(DecelerateInterpolator()) animatorSet.start() end function zoot_animation(view) if view.getWidth() == 0 or view.getHeight() == 0 then view.post( function () zoot_animation(view) end ) return end view.setPivotX(view.getWidth() / 2) view.setPivotY(view.getHeight() / 2) local scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0.9) local scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0.9) local alpha = ObjectAnimator.ofFloat(view, "alpha", 1, 0) local translateY = ObjectAnimator.ofFloat(view, "translationY", 0, 10) local animatorSet = AnimatorSet() animatorSet.playTogether(scaleX, scaleY, alpha, translateY) animatorSet.setDuration(300) animatorSet.setInterpolator(DecelerateInterpolator()) animatorSet.start() end function miaobian(d, r, t, y) local drawable = GradientDrawable() drawable.setShape(GradientDrawable.RECTANGLE) drawable.setColor(t) drawable.setCornerRadii( { r, r, r, r, r, r, r, r }) drawable.setStroke(d, y) return drawable end function getShepeBackground(color, radiu) local drawable = luajava.new(GradientDrawable) drawable.setShape(GradientDrawable.RECTANGLE) drawable.setColor(color) drawable.setCornerRadii( { radiu, radiu, radiu, radiu, radiu, radiu, radiu, radiu }) return drawable end local function getButtonBG() local selector = StateListDrawable() local state = android.R.attr.state_pressed selector.addState( {state}, getVerticalBG("0xffffffff", 25)) selector.addState( { -state}, getVerticalBG("0xffffffff", 25)) return selector end local function getLayoutParams() local LayoutParams = WindowManager.LayoutParams local layoutParams = luajava.new(LayoutParams) layoutParams.type = Build.VERSION.SDK_INT >= 26 and LayoutParams.TYPE_APPLICATION_OVERLAY or LayoutParams.TYPE_PHONE layoutParams.format = PixelFormat.RGBA_8888 layoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_ALT_FOCUSABLE_IM layoutParams.gravity = Gravity.CENTER layoutParams.width = LayoutParams.WRAP_CONTENT layoutParams.height = LayoutParams.WRAP_CONTENT return layoutParams end local function threadStart(runnable) local newRun = luajava.createProxy("java.lang.Runnable", runnable) local subThread = luajava.newInstance("java.lang.Thread", newRun) subThread:start() end local function log(text, color, size) local tmp = loadlayout { TextView, text = os.date("%m-%d %H:%M:%S ") .. text, textSize = size or '10sp', textColor = color, gravity = "left", layout_width = "wrap_content", } console_list.addView(tmp) console.fullScroll(View.FOCUS_DOWN) end local change_menu local background_list = {getShepeBackground("0xff161616", 15), } changan.switch = function (name, func1, func2) local sw sw = loadlayout( { MaterialSwitch; text = " " .. name; textColor = "0xffB5CFE4"; padding = "5dp"; layout_width = "match"; layout_height = "match"; trackTintList = (ColorStateList( { {android.R.attr.state_checked}, { } }, {0xffB5CFE4, 0x28FFFFFF})), thumbTintList = (ColorStateList( { {android.R.attr.state_checked}, { -android.R.attr.state_checked} }, {0xFFFFFFFF, 0xFF4B484F})), onClick = function () local func = sw.checked and func1 or func2 threadStart( {run = function () pcall(func) end }) end }) local tmp = loadlayout( { LinearLayout, background = getButtonBG(), elevation = "2dp", layout_width = 'fill_parent', layout_height = "40dp", layout_margin = "2dp", gravity = "center_vertical", padding = {"0dp", "0dp", "6dp", "0dp"}, }) local rest = loadlayout( { LinearLayout, layout_width = 'fill_parent', layout_height = "wrap_content", gravity = "center_vertical", }) tmp.addView(sw) rest.addView(tmp) return rest end changan.seek = function (name, bian, smin, smax, nows) local sw _ENV[bian] = nows smin = tonumber(smin) smax = tonumber(smax) if _ENV[bian] == nil then _ENV[bian] = 1.0 end if not name then name = "未设置" end sw = loadlayout( { Slider, thumbHeight = '23dp', trackHeight = '15dp', tickVisible = false, TrackActiveTintList = ColorStateList( { { } }, {"0xff" .. "000000"}), TrackInactiveTintList = ColorStateList( { { } }, {"0x55" .. "000000"}), ThumbTintList = ColorStateList( { { } }, {"0xff" .. "000000"}), layout_width = 'match_parent', id = luajava.newId(name .. "seekbar"), valueFrom = smin, valueTo = smax, value = nows, stepSize = 1.0, }) sw.addOnChangeListener( { onValueChange = function (slider, value, fromUser) _ENV[bian] = value end }) local tmp = loadlayout( { LinearLayout, background = getButtonBG(), layout_width = 'fill_parent', layout_height = "40dp", layout_marginLeft = '2dp', layout_marginRight = '2dp', layout_marginTop = '2dp', layout_marginBottom = '2dp', gravity = "center_vertical", padding = {"0dp", "0dp", "6dp", "0dp"}, { TextView, padding = {"5dp", "10dp", "0dp", "10dp", }, gravity = "top", textColor = '0xffB5CFE4', textSize = '13sp', text = name, id = luajava.newId(names), layout_width = 'wrap_content', layout_marginLeft = "5dp", } }) local rest = loadlayout( { LinearLayout, layout_width = 'fill_parent', layout_height = "wrap_content", gravity = "center_vertical", }) tmp.addView(sw) rest.addView(tmp) return rest end changan.text = function (txt, color, size) local tmp = { TextView, text = txt or "未设置文字", textSize = size or "18sp", textColor = color or "#545454", layout_width = "wrap_content", } return loadlayout(tmp) end layoutTransition = LayoutTransition() function visi(tid, ttid) local tview = luajava.getIdView(tid) local ttview = luajava.getIdView(ttid) if not tview then return 0 end if tonumber(tostring(tview:getVisibility())) == 8.0 then tview.setVisibility(View.VISIBLE) else tview.setVisibility(View.GONE) end end local colorvs = { } boxes = { } boxpic = { } function visi(tid, ttid) local tview = luajava.getIdView(tid) local arrowView = luajava.getIdView(tid .. "_arrow") if not tview then return 0 end if tonumber(tostring(tview:getVisibility())) == 8.0 then tview.setVisibility(View.VISIBLE) local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 0, 90) anim.setDuration(300) anim.start() else tview.setVisibility(View.GONE) local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 90, 0) anim.setDuration(300) anim.start() end end colorvs = { } boxes = { } boxpic = { } function visi(tid, ttid) local tview = luajava.getIdView(tid) local arrowView = luajava.getIdView(tid .. "_arrow") if not tview then return 0 end if tonumber(tostring(tview:getVisibility())) == 8.0 then tview.setVisibility(View.VISIBLE) local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 0, 90) anim.setDuration(300) anim.start() else tview.setVisibility(View.GONE) local anim = ObjectAnimator.ofFloat(arrowView, "rotation", 90, 0) anim.setDuration(300) anim.start() end end function changan.box(views) local tid = "box" .. string.randomUUID( true ) colorvs[ #colorvs + 1] = {"box", tid} local imgPath = nil local titleText = views[1] if type(views[1]) == "table" then imgPath = views[1].img or "/storage/emulated/0/樱泽墨资源/UI1/图片/default" titleText = views[2] end local arrowIcon = { ImageView, id = luajava.newId(tid .. "_arrow"), layout_width = "wrap_content", layout_height = "wrap_content", src = "/storage/emulated/0/樱泽墨资源/UI1/图片/box", ColorFilter = "0xff333333" } local ttid = tid .. "6" local firadio = { LinearLayout, layout_width = 'fill_parent', background = miaobian(1, 25, 0xfffffffff, 0xffF48FB1), elevation = "2dp", layout_height = "wrap_content", layout_margin = "4dp", orientation = "vertical", LayoutTransition = LayoutTransition() } if type(titleText) == "string" or type(titleText) == "number" then firadio[ #firadio + 1] = { LinearLayout, layout_width = 'fill_parent', layout_height = "40dp", gravity = "center_vertical", onClick = function () visi(tid, ttid) end, { LinearLayout, layout_width = 'fill_parent', layout_height = "36dp", layout_marginRight = "4dp", layout_marginLeft = "4dp", gravity = "center_vertical", elevation = "1dp", { ImageView, layout_width = "20dp", layout_height = "20dp", layout_marginLeft = "10dp", layout_marginRight = "8dp", src = imgPath or "/storage/emulated/0/樱泽墨资源/UI1/图片/default", scaleType = "fitCenter" }, { TextView, gravity = "center_vertical", text = titleText, textColor = "0xff333333", textSize = "12sp", layout_weight = 1, layout_marginRight = "20dp", layout_width = 'fill_parent', }, { LinearLayout, padding = {"0dp", "0dp", "15dp", "0dp"}, layout_width = "30dp", layout_height = "30dp", gravity = "center", arrowIcon } } } else gg.alert("changan.box 的 table 内第一个元素必须是 string 或包含 img 的 table") os.exit() end local contentLayout = { LinearLayout, layout_marginLeft = "10dp", layout_marginRight = "10dp", layout_marginBottom = "10dp", orientation = "vertical", visibility = "gone", id = luajava.newId(tid), layout_width = 'fill_parent', } for i = 2, #views do table.insert(contentLayout, views[i]) end local finalLayout = loadlayout(firadio) local contentView = loadlayout(contentLayout) finalLayout.addView(contentView) boxes[tid] = contentView return finalLayout end changan.gyx1box = function (views) if #views == 0 then return end local mainLayout = loadlayout( {LinearLayout, layout_width = 'fill_parent', layout_height = 'wrap_content', orientation = 'vertical'}) local scrollView = loadlayout( { HorizontalScrollView, layout_width = 'fill_parent', layout_height = 'wrap_content', { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'vertical', id = 'rows_container' } }) mainLayout.addView(scrollView) local buttonsPerRow = 4 local currentRow = nil local buttonsInCurrentRow = 0 for i, v in ipairs(views) do if buttonsInCurrentRow % buttonsPerRow == 0 then currentRow = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', id = 'row_' .. math.ceil(i / buttonsPerRow) }) rows_container.addView(currentRow) end local func1, func2 = v[2], v[3] local sw = loadlayout( { CheckBox; layout_width = 'match_parent', layout_height = '28dp', buttonTintList = ColorStateList( { {android.R.attr.state_checked}, { -android.R.attr.state_checked} }, {0xffB5CFE4, 0xffB5CFE4}, {0xffB5CFE4, 0xffB5CFE4}), onClick = function () local func = sw.checked and func1 or func2 if func then threadStart( {run = function () pcall(func) end }) end end }) local buju = loadlayout( { LinearLayout, layout_width = '70dp', layout_height = "70dp", { CardView; layout_width = 'match_parent', layout_height = "match_parent", layout_margin = "5dp", elevation = "2dp"; background = getVerticalBG(0xffffffff, 15, 5, 0xffffffff), { RelativeLayout, { ImageView, padding = "10dp", layout_margin = "2dp", layout_width = 'match_parent', layout_height = "match_parent", src = views[i]["图片"], }, { TextView, layout_width = "wrap", layout_height = "wrap", layout_alignParentBottom = "true", layout_alignParentRight = "true", text = v[1], textSize = "10sp", textColor = "0xffB5CFE4"; }, sw } } }) currentRow.addView(buju) buttonsInCurrentRow = buttonsInCurrentRow + 1 end return mainLayout end changan.gyx1box1 = function (views) if #views == 0 then return end local mainLayout = loadlayout( {LinearLayout, layout_width = 'fill_parent', layout_height = 'wrap_content', orientation = 'vertical'}) local scrollView = loadlayout( { HorizontalScrollView, layout_width = 'fill_parent', layout_height = 'wrap_content', { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'vertical', id = 'rows_container' } }) mainLayout.addView(scrollView) local buttonsPerRow = 3 local currentRow = nil local buttonsInCurrentRow = 0 for i, v in ipairs(views) do if buttonsInCurrentRow % buttonsPerRow == 0 then currentRow = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', id = 'row_' .. math.ceil(i / buttonsPerRow) }) rows_container.addView(currentRow) end local func1 = v[2] or function () end local func2 = v[3] or function () end local imgPath = v.img or "/storage/emulated/0/樱泽墨资源/UI1/图片/default" local sw = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', gravity = 'center_vertical', background = '#000000', layout_margin = '2dp', padding = {'1dp', '1dp', '1dp', '1dp'}, { LinearLayout, layout_width = 'fill_parent', layout_height = 'fill_parent', orientation = 'horizontal', gravity = 'center_vertical', background = '#FFFFFF', padding = {'5dp', '2dp', '5dp', '2dp'}, { ImageView, layout_width = '18dp', layout_height = '18dp', layout_marginRight = '5dp', src = imgPath, scaleType = 'fitCenter', ColorFilter = nil }, { TextView, text = v[1], textColor = '0xff333333', textSize = '9sp', gravity = 'center_vertical', layout_width = 'wrap_content', layout_height = '24dp' } } }) sw.onClick = function () threadStart( { run = function () local isChecked = not sw.getTag() sw.setTag(isChecked) if isChecked then pcall(func1) else pcall(func2) end end }) end local buju = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = "wrap_content", layout_margin = '3dp', sw }) currentRow.addView(buju) buttonsInCurrentRow = buttonsInCurrentRow + 1 end return mainLayout end function changan.image(text) local tmp = { LinearLayout, layout_height = "wrap_content", layout_width = "fill_parent", gravity = "center", { CardView, layout_height = "160dp", layout_width = "250dp", radius = "10dp", backgroundColor = "#FFFFFF", elevation = "2dp", { ImageView, src = text, layout_height = "match_parent", layout_width = "match_parent", scaleType = "fitCenter", adjustViewBounds = true }, }, } return loadlayout(tmp) end changan.button = function (name, func) local btn1 = { RelativeLayout, layout_width = "match", layout_height = "35dp", layout_margin = "2dp", layout_marginLeft = "3dp", layout_marginRight = "3dp", background = getButtonBG(), { TextView, text = name, textColor = "0xffB5CFE4", layout_margin = "5dp", layout_marginLeft = "14dp", layout_width = "wrap", layout_height = "match", gravity = "center", layout_alignParentLeft = true, }, { ImageView, layout_width = "20dp", layout_height = "20dp", layout_margin = "5dp", ColorFilter = "0xffB5CFE4", src = "/storage/emulated/0/樱泽墨资源/UI1/图片/qing", layout_alignParentRight = true, layout_centerVertical = true, }, } local btn1 = loadlayout(btn1) btn1.onClick = function () if eooeis == 1 then eooeis = 2 else threadStart( {run = function () pcall(func) end, }) end end return btn1 end changan.buttonMix = function (name, leftImgPath, func) local btn1 = { RelativeLayout, layout_width = "290dp", layout_height = "43dp", layout_margin = "3dp", layout_marginLeft = "3dp", layout_marginRight = "3dp", background = getShepeBackground(0xffffffff, 12), elevation = "1dp", { ImageView, layout_width = "21dp", layout_height = "21dp", layout_margin = "5dp", layout_marginLeft = "14dp", src = leftImgPath, layout_alignParentLeft = true, layout_centerVertical = true, }, { TextView, text = name, textColor = "0xff333333", textSize = "12sp", layout_margin = "5dp", layout_marginLeft = "41dp", layout_width = "wrap", layout_height = "match", gravity = "center_vertical", layout_alignParentLeft = true, }, { ImageView, layout_width = "11dp", layout_height = "17dp", layout_margin = "5dp", ColorFilter = "0xff333333", src = "/storage/emulated/0/樱泽墨资源/UI1/图片/箭头", layout_alignParentRight = true, layout_centerVertical = true, }, } local btn1 = loadlayout(btn1) btn1.onClick = function () if eooeis == 1 then eooeis = 2 else threadStart( {run = function () pcall(func) end, }) end end return btn1 end changan.menu = function (icon, title, menu) UI高度 = "270dp" UI宽度 = "350dp" local layout = { LinearLayout; layout_height = "wrap_content"; layout_width = UI宽度; orientation = "vertical"; id = "windowst"; { LinearLayout; layout_width = UI宽度; layout_height = "22dp"; background = getShepeBackground(0xFFFFB6C1, 0); gravity = "center_vertical"; padding = "0dp 8dp"; { ImageView; layout_width = "18dp"; layout_height = "18dp"; src = 顶部左侧图片, layout_marginRight = "6dp"; }; { TextView; layout_width = "wrap_content"; layout_height = "wrap_content"; text = 顶部标题, textColor = "0xFF333333"; textSize = "12sp"; layout_weight = "1"; }; { TextView; layout_width = "wrap_content"; layout_height = "wrap_content"; text = os.date("%Y年%m月%d日 %H:%M:%S"); textColor = "0xFF333333"; textSize = "11sp"; layout_marginRight = "8dp"; }; { ImageView; layout_width = "20dp"; layout_height = "20dp"; src = 顶部右侧图片, id = 'lessen'; layout_marginLeft = "8dp"; }; }; { CardView; layout_height = UI高度; layout_width = UI宽度; id = "windows"; elevation = "10dp"; radius = "0dp"; { RelativeLayout, layout_height = UI高度; layout_width = UI宽度; background = getShepeBackground(0xFFF7F2E9, 0), id = "ooo", { LinearLayout; layout_height = "match_parent"; layout_width = "75dp"; orientation = "vertical"; layout_margin = "0dp"; background = getShepeBackground(0xFFF7F2E9, 0), { ScrollView; layout_height = "match_parent"; layout_width = "match_parent"; { LinearLayout; layout_height = "wrap"; gravity = "center"; layout_width = "match_parent"; orientation = "vertical"; id = "menu_list"; }; }; }; { FrameLayout, layout_height = "match_parent"; layout_marginLeft = "75dp"; id = "main"; layout_width = "match_parent"; { ImageView; layout_width = "match_parent"; layout_height = "match_parent"; src = 背景图, scaleType = "centerCrop"; }, { LinearLayout; layout_width = "match_parent"; layout_height = "match_parent"; orientation = "vertical"; gravity = "center"; padding = "10dp"; }; }, }; }; }; local ball = { LinearLayout; layout_height = "fill"; layout_width = "fill"; { LinearLayout; layout_width = "58dp"; { ImageView, layout_width = "43dp"; id = "suspended_ball"; src = icon; layout_height = "43dp"; } } } ball = loadlayout(ball) local window_layout = loadlayout(layout) local menu_layout = { } local icon_list = { } for i, v in ipairs(menu) do local item = loadlayout { LinearLayout, layout_width = "match_parent", layout_margin = "3dp", layout_height = "40dp", gravity = "center", orientation = "vertical", onClick = function () change_menu(i) end, { LinearLayout, background = getShepeBackground(0xFF000000, 0), layout_width = "match_parent", layout_height = "match_parent", padding = "1dp", { LinearLayout, background = (i == 1) and getShepeBackground(0xFFFFB6C1, 0) or getShepeBackground(0xFFFFFFFF, 0), layout_width = "match_parent", layout_height = "match_parent", gravity = "center", orientation = "vertical", { ImageView, layout_width = "18dp"; layout_height = "18dp"; layout_marginBottom = "2dp"; src = v.图片 }, { TextView, text = v.name, textColor = "0xff010101", textSize = "9sp", } } } } local func_layout = { LinearLayout; layout_height = "match_parent"; layout_width = "match_parent"; orientation = "vertical"; { ScrollView; fillViewport = "true"; layout_width = "match_parent"; layout_height = "match_parent"; { LinearLayout; layout_width = "match_parent"; layout_marginLeft = "5dp"; id = "layout_func" .. i; layout_marginRight = "5dp"; gravity = "center_horizontal"; orientation = "vertical"; }; }; } table.insert(icon_list, item) menu_layout[i] = loadlayout(func_layout) menu_list.addView(item) for _, k in ipairs(v) do _ENV['layout_func' .. i].addView(k) end end windows.setBackground(background_list[1]) local mainLayoutParams = getLayoutParams() mainLayoutParams.gravity = Gravity.TOP + Gravity.LEFT mainLayoutParams.x = 20 mainLayoutParams.y = 20 do local last = 1 main.addView(menu_layout[1]) change_menu = function (i) if last == i then return end main.removeView(menu_layout[last]) icon_list[last]:getChildAt(0):getChildAt(0).background = getShepeBackground(0xFFFFFFFF, 0) icon_list[i]:getChildAt(0):getChildAt(0).background = getShepeBackground(0xFFFFB6C1, 0) last = i main.addView(menu_layout[i]) zm_animation(menu_layout[i]) gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/TOP.mp3") --切换 end end lessen.onClick = function () zom_animation(windows) zoot_animation(windowst) Handler().postDelayed( function () window.removeView(window_layout, mainLayoutParams) window.addView(ball, mainLayoutParams) gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/TOP.mp3") --关闭 end, 0) end local function expandUI() window.removeView(ball, mainLayoutParams) zoom_animation(windows) zoom_animation(windowst) windows.post( function () local viewRootImpl = windows.getViewRootImpl() windows.setBackgroundDrawable(HiddenApiBypass.getDeclaredMethod(ViewRootImpl, "createBackgroundBlurDrawable", { }).invoke(viewRootImpl, { }).setBlurRadius(50).setCornerRadius(0)) end ) window.addView(window_layout, mainLayoutParams) gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/TOP.mp3") --开启 end local ballDownX, ballDownY = 0, 0 suspended_ball.setOnTouchListener( function (v, event) local action = event.getAction() if action == MotionEvent.ACTION_DOWN then ballDownX = event.getRawX() ballDownY = event.getRawY() return true elseif action == MotionEvent.ACTION_MOVE then mainLayoutParams.x = mainLayoutParams.x + (event.getRawX() - ballDownX) mainLayoutParams.y = mainLayoutParams.y + (event.getRawY() - ballDownY) window.updateViewLayout(ball, mainLayoutParams) ballDownX = event.getRawX() ballDownY = event.getRawY() return true elseif action == MotionEvent.ACTION_UP then expandUI() return true end return false end ) local winDownX, winDownY = 0, 0 windowst.setOnTouchListener( function (v, event) local action = event.getAction() if action == MotionEvent.ACTION_DOWN then winDownX = event.getRawX() winDownY = event.getRawY() return true elseif action == MotionEvent.ACTION_MOVE then mainLayoutParams.x = mainLayoutParams.x + (event.getRawX() - winDownX) mainLayoutParams.y = mainLayoutParams.y + (event.getRawY() - winDownY) window.updateViewLayout(window_layout, mainLayoutParams) winDownX = event.getRawX() winDownY = event.getRawY() return true end return false end ) Handler(Looper.getMainLooper()) Looper.prepare() window.addView(ball, mainLayoutParams) applyBestBlurEffect(windows, 0) Looper.loop() end changan.numberAdjust = function (imgPathMap, mainText, skinNames, weaponSuffix, varName, maxNum, initNum, numFuncMap) _ENV[varName] = initNum or 1 maxNum = maxNum or 5 weaponSuffix = weaponSuffix or "" skinNames = skinNames or { } imgPathMap = imgPathMap or { } local function getCurrentSkinName(num) return skinNames[num] or "默认皮肤" end local function getCurrentImgPath(num) return imgPathMap[num] or imgPathMap[1] or "" end local function getSubText(num) return getCurrentSkinName(num) .. weaponSuffix end local subText = getSubText(_ENV[varName]) numFuncMap = numFuncMap or { } local imgView local mainLayout = loadlayout( { LinearLayout, layout_width = "fill_parent", layout_height = "38dp", layout_margin = "1dp", background = getShepeBackground(0xfffffffff, 12), gravity = "center_vertical", orientation = "horizontal", padding = "3dp", { ImageView, layout_width = "28dp", layout_height = "28dp", layout_marginLeft = "3dp", src = getCurrentImgPath(_ENV[varName]), scaleType = "fitCenter", adjustViewBounds = "true", id = luajava.newId(varName .. "_img"), }, { LinearLayout, layout_width = "0dp", layout_weight = 1, layout_height = "wrap_content", orientation = "vertical", layout_marginLeft = "6dp", layout_marginRight = "6dp", { TextView, text = mainText, textColor = "0xff010101", textSize = "10sp", layout_width = "wrap_content", layout_height = "wrap_content", }, { TextView, id = luajava.newId(varName .. "_subtext"), text = subText, textColor = "0xff515151", textSize = "7sp", layout_width = "wrap_content", layout_height = "wrap_content", }, }, { LinearLayout, layout_width = "wrap_content", layout_height = "wrap_content", orientation = "horizontal", gravity = "center", { Button, text = "-", textColor = "0xff000000", textSize = "16sp", layout_width = "22dp", layout_height = "22dp", gravity = "center", padding = "0dp", background = miaobian(1, 20, 0xfffffffff, 0xffcccccc), onClick = function () if _ENV[varName] > 1 then _ENV[varName] = _ENV[varName] - 1 luajava.getIdView(varName .. "_num").setText(_ENV[varName] .. "/" .. maxNum) luajava.getIdView(varName .. "_subtext").setText(getSubText(_ENV[varName])) luajava.getIdView(varName .. "_img").setImageURI(luajava.newInstance("android.net.Uri", "file://" .. getCurrentImgPath(_ENV[varName]))) end end, }, { TextView, id = luajava.newId(varName .. "_num"), text = _ENV[varName] .. "/" .. maxNum, textColor = "0xff000000", textSize = "11sp", layout_width = "30dp", layout_height = "22dp", gravity = "center", layout_marginLeft = "3dp", layout_marginRight = "3dp", }, { Button, text = "+", textColor = "0xff000000", textSize = "16sp", layout_width = "22dp", layout_height = "22dp", gravity = "center", padding = "0dp", background = miaobian(1, 20, 0xfffffffff, 0xffcccccc), onClick = function () if _ENV[varName] < maxNum then _ENV[varName] = _ENV[varName] + 1 luajava.getIdView(varName .. "_num").setText(_ENV[varName] .. "/" .. maxNum) luajava.getIdView(varName .. "_subtext").setText(getSubText(_ENV[varName])) luajava.getIdView(varName .. "_img").setImageURI(luajava.newInstance("android.net.Uri", "file://" .. getCurrentImgPath(_ENV[varName]))) end end, }, { Button, text = "应用", textColor = "0xfffffffff", textSize = "10sp", layout_width = "40dp", layout_height = "22dp", gravity = "center", padding = "0dp", layout_marginLeft = "3dp", background = miaobian(1, 20, 0xff2196F3, 0xff1976D2), onClick = function () local currentNum = _ENV[varName] if numFuncMap[currentNum] then threadStart( { run = function () pcall(numFuncMap[currentNum], currentNum) end }) toast.success(mainText .. "已应用" .. getCurrentSkinName(currentNum)) luajava.runOnUiThread( function () local Inform = AlGuiBubbleNotification.Inform(context) Inform.showSuccessNotification_Simplicity() end ) else toast.success("该等级暂无对应功能") end end, }, }, }) local numText = luajava.getIdView(varName .. "_num") local subTextView = luajava.getIdView(varName .. "_subtext") imgView = luajava.getIdView(varName .. "_img") mainLayout.setSkinName = function (num, name) skinNames[num] = name subTextView.setText(getSubText(_ENV[varName])) end mainLayout.getNum = function () return _ENV[varName] end return mainLayout end changan.buttonRow = function (buttons) local rowLayout = loadlayout( { LinearLayout, layout_width = "match_parent", layout_height = "wrap_content", orientation = "horizontal", gravity = "left", padding = "0dp", layout_margin = "3dp" }) for i = 1, #buttons do local button = buttons[i] local params = luajava.new(LinearLayout.LayoutParams, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) params.rightMargin = 5 button.setLayoutParams(params) rowLayout.addView(button) end return rowLayout end changan.gyx = function (views) if #views == 0 then return end local mainLayout = loadlayout( {LinearLayout, layout_width = 'fill_parent', layout_height = 'wrap_content', orientation = 'vertical'}) local scrollView = loadlayout( { HorizontalScrollView, layout_width = 'fill_parent', layout_height = 'wrap_content', { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'vertical', id = 'rows_container' } }) mainLayout.addView(scrollView) local buttonsPerRow = 4 local currentRow = nil local buttonsInCurrentRow = 0 local normalBgOuter = getShepeBackground(0xff000000, 6) local selectBgOuter = getShepeBackground(0xff228b22, 6) local normalBgInner = getShepeBackground(0xffffffff, 5) local selectBgInner = getShepeBackground(0xffe8ffe8, 5) for i, v in ipairs(views) do if buttonsInCurrentRow % buttonsPerRow == 0 then currentRow = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', id = 'row_' .. math.ceil(i / buttonsPerRow) }) rows_container.addView(currentRow) end local func1, func2 = v[2], v[3] local buju = loadlayout( { LinearLayout, layout_width = '85dp', layout_height = '28dp', clickable = "true", layout_margin = "2dp", padding = "1dp", background = normalBgOuter, { LinearLayout, layout_width = "match_parent", layout_height = "match_parent", background = normalBgInner, orientation = "horizontal", gravity = "center_vertical", padding = "4dp", id = "btn_inner", { ImageView, layout_width = "20dp", layout_height = "20dp", layout_marginRight = "11dp", src = views[i]["图片"], scaleType = "fitCenter" }, { TextView, layout_width = "wrap_content", layout_height = "wrap_content", text = v[1], textSize = "10sp", textColor = 0xff000000 } } }) local innerLayout = buju.findViewById("btn_inner") local isSelect = false buju.onClick = function (view) threadStart( { run = function () gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/的东.mp3") isSelect = not isSelect if isSelect then view.setBackground(selectBgOuter) innerLayout.setBackground(selectBgInner) else view.setBackground(normalBgOuter) innerLayout.setBackground(normalBgInner) end if func1 then pcall(func1) end end }) end currentRow.addView(buju) buttonsInCurrentRow = buttonsInCurrentRow + 1 end return mainLayout end changan.gyx1 = function (views) if #views == 0 then return end local mainLayout = loadlayout( {LinearLayout, layout_width = 'fill_parent', layout_height = 'wrap_content', orientation = 'vertical'}) local scrollView = loadlayout( { HorizontalScrollView, layout_width = 'fill_parent', layout_height = 'wrap_content', { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'vertical', id = 'rows_container' } }) mainLayout.addView(scrollView) local buttonsPerRow = 4 local currentRow = nil local buttonsInCurrentRow = 0 local tagMap = { } local normalBgOuter = getShepeBackground(0xff000000, 4) local selectBgOuter = getShepeBackground(0xff228b22, 4) local normalBgInner = getShepeBackground(0xffffffff, 3) local selectBgInner = getShepeBackground(0xffe8ffe8, 3) for i, v in ipairs(views) do if buttonsInCurrentRow % buttonsPerRow == 0 then currentRow = loadlayout( { LinearLayout, layout_width = 'wrap_content', layout_height = 'wrap_content', orientation = 'horizontal', id = 'row_' .. math.ceil(i / buttonsPerRow) }) rows_container.addView(currentRow) end local func1, func2 = v[2], v[3] local buju = loadlayout( { LinearLayout, layout_width = '62dp', layout_height = '22dp', clickable = "true", layout_margin = "1dp", padding = "1dp", background = normalBgOuter, tag = "btn_tag_" .. i, { LinearLayout, layout_width = "match_parent", layout_height = "match_parent", background = normalBgInner, orientation = "horizontal", gravity = "center", padding = "2dp", { TextView, layout_width = "wrap_content", layout_height = "wrap_content", text = v[1], textSize = "9sp", textColor = 0xff000000 } } }) local isSelect = false buju.onClick = function (view) threadStart( { run = function () gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/的东.mp3") isSelect = not isSelect local innerLayout = view.getChildAt(0) if isSelect then view.setBackground(selectBgOuter) innerLayout.setBackground(selectBgInner) else view.setBackground(normalBgOuter) innerLayout.setBackground(normalBgInner) end if func1 then pcall(func1) end end }) end currentRow.addView(buju) buttonsInCurrentRow = buttonsInCurrentRow + 1 end return mainLayout end function changan.box2(views) local tid = "box" .. string.randomUUID( true ) colorvs[ #colorvs + 1] = {"box", tid} local plusIcon = { ImageView, id = luajava.newId(tid .. "_arrow"), layout_width = "14dp", layout_height = "14dp", scaleType = "fitCenter", src = "/storage/emulated/0/樱泽墨资源/UI1/图片/box" } local ttid = tid .. "6" local firadio = { LinearLayout, layout_width = 'fill_parent', background = miaobian(1, 8, 0xffffffff, 0xff000000), elevation = "0dp", layout_height = "wrap_content", layout_margin = "4dp", orientation = "vertical", LayoutTransition = LayoutTransition() } if type(views[1]) == "table" then local titleText = views[1].text or "标题" local iconPath = views[1].icon or "" firadio[ #firadio + 1] = { LinearLayout, layout_width = 'fill_parent', layout_height = "38dp", gravity = "center_vertical", onClick = function () visi(tid, ttid) end, { LinearLayout, layout_width = 'fill_parent', layout_height = "match_parent", layout_marginRight = "5dp", layout_marginLeft = "5dp", gravity = "center_vertical", padding = "6dp", { LinearLayout, layout_width = "28dp", layout_height = "28dp", gravity = "center", background = getShepeBackground(0xffffffff, 4), { ImageView, layout_width = "24dp", layout_height = "24dp", scaleType = "fitCenter", src = iconPath, } }, { TextView, layout_width = "wrap_content", layout_height = "wrap_content", text = titleText, textSize = "14sp", textColor = 0xff000000, layout_marginLeft = "8dp" }, { LinearLayout, layout_width = "0dp", layout_height = "match_parent", layout_weight = "1", gravity = "right|center_vertical", plusIcon } } } firadio[ #firadio + 1] = { View, layout_width = 'fill_parent', layout_height = "1dp", background = getShepeBackground(0xff000000, 0), layout_marginLeft = "8dp", layout_marginRight = "8dp" } else gg.alert("changan.box2 第一个参数必须是 {text='标题', icon='图标路径'} 格式的table") os.exit() end local contentLayout = { LinearLayout, layout_marginLeft = "10dp", layout_marginRight = "10dp", layout_marginTop = "12dp", layout_marginBottom = "10dp", orientation = "vertical", visibility = "gone", id = luajava.newId(tid), layout_width = 'fill_parent', background = getShepeBackground(0xffffffff, 8) } for i = 2, #views do table.insert(contentLayout, views[i]) end local finalLayout = loadlayout(firadio) local contentView = loadlayout(contentLayout) finalLayout.addView(contentView) boxes[tid] = contentView return finalLayout end changan.numberAdjust = function (imgPathMap, mainText, skinNames, weaponSuffix, varName, maxNum, initNum, numFuncMap) _ENV[varName] = initNum or 1 maxNum = maxNum or 5 weaponSuffix = weaponSuffix or "" skinNames = skinNames or { } imgPathMap = imgPathMap or { } local function getCurrentSkinName(num) return skinNames[num] or "默认皮肤" end local function getCurrentImgPath(num) return imgPathMap[num] or imgPathMap[1] or "" end local function getSubText(num) return getCurrentSkinName(num) .. weaponSuffix end local subText = getSubText(_ENV[varName]) numFuncMap = numFuncMap or { } local imgView local mainLayout = loadlayout( { LinearLayout, layout_width = "fill_parent", layout_height = "38dp", layout_margin = "1dp", background = getShepeBackground(0xfffffffff, 12), gravity = "center_vertical", orientation = "horizontal", padding = "3dp", { ImageView, layout_width = "28dp", layout_height = "28dp", layout_marginLeft = "3dp", src = getCurrentImgPath(_ENV[varName]), scaleType = "fitCenter", adjustViewBounds = "true", id = luajava.newId(varName .. "_img"), }, { LinearLayout, layout_width = "0dp", layout_weight = 1, layout_height = "wrap_content", orientation = "vertical", layout_marginLeft = "6dp", layout_marginRight = "6dp", { TextView, text = mainText, textColor = "0xff010101", textSize = "10sp", layout_width = "wrap_content", layout_height = "wrap_content", }, { TextView, id = luajava.newId(varName .. "_subtext"), text = subText, textColor = "0xff515151", textSize = "7sp", layout_width = "wrap_content", layout_height = "wrap_content", }, }, { LinearLayout, layout_width = "wrap_content", layout_height = "wrap_content", orientation = "horizontal", gravity = "center", { Button, text = "-", textColor = "0xff000000", textSize = "16sp", layout_width = "22dp", layout_height = "22dp", gravity = "center", padding = "0dp", background = miaobian(1, 20, 0xfffffffff, 0xffcccccc), onClick = function () if _ENV[varName] > 1 then _ENV[varName] = _ENV[varName] - 1 luajava.getIdView(varName .. "_num").setText(_ENV[varName] .. "/" .. maxNum) luajava.getIdView(varName .. "_subtext").setText(getSubText(_ENV[varName])) luajava.getIdView(varName .. "_img").setImageURI(luajava.newInstance("android.net.Uri", "file://" .. getCurrentImgPath(_ENV[varName]))) end end, }, { TextView, id = luajava.newId(varName .. "_num"), text = _ENV[varName] .. "/" .. maxNum, textColor = "0xff000000", textSize = "11sp", layout_width = "30dp", layout_height = "22dp", gravity = "center", layout_marginLeft = "3dp", layout_marginRight = "3dp", }, { Button, text = "+", textColor = "0xff000000", textSize = "16sp", layout_width = "22dp", layout_height = "22dp", gravity = "center", padding = "0dp", background = miaobian(1, 20, 0xfffffffff, 0xffcccccc), onClick = function () if _ENV[varName] < maxNum then _ENV[varName] = _ENV[varName] + 1 luajava.getIdView(varName .. "_num").setText(_ENV[varName] .. "/" .. maxNum) luajava.getIdView(varName .. "_subtext").setText(getSubText(_ENV[varName])) luajava.getIdView(varName .. "_img").setImageURI(luajava.newInstance("android.net.Uri", "file://" .. getCurrentImgPath(_ENV[varName]))) end end, }, { Button, text = "应用", textColor = "0xfffffffff", textSize = "10sp", layout_width = "40dp", layout_height = "22dp", gravity = "center", padding = "0dp", layout_marginLeft = "3dp", background = miaobian(1, 20, 0xff2196F3, 0xff1976D2), onClick = function () local currentNum = _ENV[varName] if numFuncMap[currentNum] then threadStart( { run = function () pcall(numFuncMap[currentNum], currentNum) end }) toast.success(mainText .. "已应用" .. getCurrentSkinName(currentNum)) luajava.runOnUiThread( function () local Inform = AlGuiBubbleNotification.Inform(context) Inform.showSuccessNotification_Simplicity() end ) else toast.success("该等级暂无对应功能") end end, }, }, }) local numText = luajava.getIdView(varName .. "_num") local subTextView = luajava.getIdView(varName .. "_subtext") imgView = luajava.getIdView(varName .. "_img") mainLayout.setSkinName = function (num, name) skinNames[num] = name subTextView.setText(getSubText(_ENV[varName])) end mainLayout.getNum = function () return _ENV[varName] end return mainLayout end local lastClickTime = 0 local clickCoolDown = 520 -- 冷却时间300ms,可调整 gg.setConfig("冻结间隔", 50) gg.setConfig(2131427466, 1) gg.setConfig(2131427487, 0) local function clean_all_freeze() local list = gg.getListItems() local to_remove = {} for i, item in pairs(list) do if item.description == "旧" or item.description == "新" then table.insert(to_remove, i) end end if #to_remove > 0 then gg.removeListItems(to_remove) toast.success("✅ 已清理所有冻结项") end end local function modify_with_success(item_type, value) modify_item(item_type, value) yfhook() callAsyncTask(function() elgg.exec("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", true, true) end) end function read_loop_speed() local file_path = "/storage/emulated/0/高木/UI1/Settings/循环播报.txt" local file = io.open(file_path, "r") if not file then return 1000 end local content = file:read("*a") file:close() local speed = tonumber(content) if speed and speed > 0 then return speed else return 1000 end end function RUI(addr) if not addr or addr == 0 then return 0 end local res = gg.getValues({{address = addr, flags = 32}}) return res and res[1] and res[1].value or 0 end function readD(addr) if not addr or addr == 0 then return 0 end local res = gg.getValues({{address = addr, flags = 4}}) return res and res[1] and res[1].value or 0 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 _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end local Ranges=gg.getRangesList('/') local function Read(module,type) for k,v in pairs(Ranges) do if v['internalName']:match('[^/]*$')==module and v['type']==type then return v['start'] end end end local Table={} local function Modify(address,value,flags) Table[#Table+1]={address=address,value=value,flags=flags} end function setvalue(address,flags,value) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end function getvalue(addr, flags) local asbd = { } asbd[1] = { } asbd[1].address = addr asbd[1].flags = flags tmp = gg.getValues(asbd) return tmp[1].value end function iceEdit(addr, type, value) local t = { } t[1] = { } t[1].address = addr t[1].flags = type t[1].value = value t[1].freeze = true gg.addListItems(t) end function breakice(addr, type) local t = { } t[1] = { } t[1].address = addr t[1].flags = type t[1].freeze = false gg.addListItems(t) end function getMapRanges() local ranges = { } local r_list = { } local _index = 1 local library = gg.getRangesList("^/data/*.so*$") for index, map in ipairs(library) do if map.type:sub(2, 2) == "w" or map.type == "r-xp" then local name = map.internalName local state = map.state local count = map.count if not r_list[name] then r_list[name] = { } end if not r_list[name][state] then r_list[name][state] = {0, _index} end r_list[name][state][1] = r_list[name][state][1] + 1 r_list[name][state][2] = _index map.count = r_list[name][state][1] table.insert(ranges, map) _index = _index + 1 end end return ranges, r_list end function staticstart(map) local ranges = getMapRanges() if not map[3] then map[3] = 1 end for index, value in ipairs(ranges) do local name = value.internalName:gsub("^.*/", "") if map[1] == name and map[2] == value.state and map[3] == value.count then return value.start end end end function xing(start, offset) local flags = {[ true ] = 32, [false ] = 4} local ti64 = gg.getTargetInfo().x64 local type = flags[ti64] local addr = 0 if start then addr = start + offset[1] for index = 2, #offset do local pointer = gg.getValues( { {address = addr, flags = type} }) if not ti64 then pointer[1].value = pointer[1].value & 0xFFFFFFFF end addr = pointer[1].value + offset[index] end end return addr end function yfhook() -- 定义偏移量 local ue4_offset = 0x6D84584 -- 定义要写入的文件路径 local path = "/storage/emulated/0/樱泽墨资源/UI1/yfhook" -- 获取目标进程PID local function getPid() local pid = nil -- 如果在GG环境下,尝试用GG的API获取 if gg and gg.getTargetInfo then local info = gg.getTargetInfo() if info and info.pid then pid = info.pid end end -- Fallback: 如果没获取到或不在GG环境,则读取当前脚本运行时的PID(通常不适用于外部目标) -- 注意:如果是在GG外或目标非自身,此Fallback可能无效,主要依赖GG API if not pid then local f = io.open("/proc/self/stat", "r") if f then local content = f:read("*line") f:close() if content then pid = tonumber(content:match("^(%d+)")) end end end return pid end -- 获取UE4模块基址 local function getUE4Base() if not gg or not gg.getRangesList then return nil end local ranges = gg.getRangesList("libUE4.so") if ranges and #ranges > 0 then return ranges[1].start end return nil end -- 链式读取地址函数 function LSQ_Chain_GetValue(so, offset, type) -- 获取可写的内存范围 local getRanges = function() local ranges = {} local t = gg.getRangesList("^/data/*.so*$") for i, v in pairs(t) do if v["type"]:sub(2, 2) == "w" then ranges[#ranges + 1] = v end end return ranges end local ranges = getRanges() local sostart = nil local valtype = gg.TYPE_DWORD -- 默认类型 -- 根据目标架构选择正确的数据类型 if gg.getTargetInfo() and gg.getTargetInfo().x64 then valtype = gg.TYPE_QWORD end -- 在范围内查找指定的SO库 for i in pairs(ranges) do local _name = ranges[i]["internalName"]:gsub("^.*/", "") if so[1] == _name and so[2] == ranges[i]["state"] then sostart = ranges[i]["start"] break end end if not sostart then return nil -- 找不到基址则返回 end local rest = {} -- 如果提供了偏移量数组,则进行链式读取 if offset and #offset > 0 then for i = 1, #offset do rest = { { flags = valtype, address = sostart + offset[i] } } -- 读取当前地址的值 rest = gg.getValues(rest) if not rest or #rest < 1 then return nil -- 读取失败 end if i == #offset then -- 到达最后一个偏移,停止更新sostart,直接准备返回最终值 break end -- 更新sostart为当前读取到的值,作为下一次读取的基础地址 if valtype == gg.TYPE_DWORD then sostart = rest[1].value & 0xFFFFFFFF else sostart = rest[1].value end end end -- 如果成功读取到最终值 if rest and #rest >= 1 then return { address = rest[1].address, -- 最终读取的地址 value = rest[1].value -- 地址中存储的值 } end return nil -- 其他情况返回nil end -- 主逻辑开始 local pid = getPid() local ue4_base = getUE4Base() -- 检查必要条件是否满足 if pid and ue4_base then local ue4_addr = ue4_base + ue4_offset -- 执行链式读取 local chain_result = LSQ_Chain_GetValue({"libUE4.so:bss", "Cb"}, {0x555C70, 0x30, 0x4B8, 0x2E50}, gg.TYPE_QWORD) if chain_result then -- 所有条件满足,打开文件准备写入 local file = io.open(path, "w") if file then -- 写入 PID (十进制) file:write(tostring(pid), "\n") -- 写入 UE4 目标地址 (十六进制) file:write(string.format("0x%X", ue4_addr), "\n") -- 写入 链式读取得到的值 (十六进制) <-- 修改了这里 file:write(string.format("0x%X", chain_result.value), "\n") -- 关闭文件句柄 file:close() -- 脚本结束,不再有任何提示 return end end end -- 如果任何一步失败 (例如PID/基址获取失败, 链式读取失败, 文件写入失败),脚本静默结束 -- 不再弹窗或打印任何信息 end function playOk() gg.playMusic("/storage/emulated/0/樱泽墨资源/UI1/音效/的东.mp3") end 顶部标题 = "樱泽墨美化" 顶部左侧图片 = "/storage/emulated/0/樱泽墨资源/UI1/图片/选择" 顶部右侧图片 = "/storage/emulated/0/樱泽墨资源/UI1/图片/关闭" 背景图 = "/storage/emulated/0/樱泽墨资源/UI1/图片/背景图" local icon = '/storage/emulated/0/樱泽墨资源/UI1/图片/xfq' local menu = { { name = '选择进程', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/图片/主页', changan.text('', '0xffD3D5E1', "12sp"), changan.image('/storage/emulated/0/樱泽墨资源/UI1/图片/图片'), changan.text('', '0xffD3D5E1', "12sp"), changan.button('选择进程', function () gg.setProcessX() mk = gg.getRangesList("libUE4.so:bss", "Cb")[1].start D = gg.TYPE_DWORD E = gg.TYPE_DOUBLE F = gg.TYPE_FLOAT W = gg.TYPE_WORD B = gg.TYPE_BYTE X = gg.TYPE_XOR Q = gg.TYPE_QWORD function qxbb(qxbb1) local t = {"libUE4.so:bss", "Cb"} local tt = {0x555C70,0x30,0x1970} local ttt = S_Pointer(t, tt, true ) gg.addListItems( { { address = ttt, flags = 4, value = qxbb1, freeze = true } }) end function szbb(szbb1) local t = {"libUE4.so:bss", "Cb"} local tt = {0x555C70,0x30,0x1974} local ttt = S_Pointer(t, tt, true ) gg.addListItems( { { address = ttt, flags = 4, value = szbb1, freeze = true } }) end function xingshen() ue4 = staticstart( {"libUE4.so:bss", "Cb", 1}) nmsl = xing(ue4, {0x555C70,0x30,0x4B8,0x2E50,0x3E8,0x0}) end function modify_item(item_type, value) xingshen() for offset = 0x0, 0x999, 0x3C do if getvalue(nmsl + 0x8 + offset, 4) == item_type then setvalue(nmsl + 0x0 + offset, 4, value) end end end function lx(kjsm) modify_item(1, kjsm) end -- 脸部 function tf(kjsm) modify_item(2, kjsm) end -- 头发 function ts(kjsm) modify_item(3, kjsm) end -- 头饰 function mz(kjsm) modify_item(4, kjsm) end -- 面罩 function yf(kjsm) modify_item(5, kjsm) end -- 衣服 function kz(kjsm) modify_item(6, kjsm) end -- 裤子 function xz(kjsm) modify_item(7, kjsm) end -- 鞋子 function bb(kjsm) modify_item(8, kjsm) end -- 背包 function tk(kjsm) modify_item(9, kjsm) end -- 头盔 function yz(kjsm) modify_item(12, kjsm) end -- 眼罩 function hj(kjsm) modify_item(10, kjsm) end -- 盔甲或者手套 function ny(kjsm) modify_item(24, kjsm) end -- 内衣 function nk(kjsm) modify_item(25, kjsm) end -- 内裤 function 衣服防一秒() modify_item(5, 1400129) end -- 衣服 (固定值) function cx88(yp, sc, qk, wb, dj, qt, bj1, bj2, bj3, bj4, bj5, bj6, bj7) mk = gg.getRangesList("libUE4.so:bss")[1].start add = RUI(RUI(RUI(RUI(RUI(mk + 0x555C70) + 0x30) + 0x4B8) + 0x2A90) + 0x7A8) offsets = {0x11C, 0x4, 0x2C, 0x54, 0x7C, 0xA4, 0x194} setvalue(add + offsets[1], 4, sc) setvalue(add + offsets[2], 4, qk) setvalue(add + offsets[3], 4, wb) setvalue(add + offsets[4], 4, dj) setvalue(add + offsets[5], 4, qt) setvalue(add + offsets[7], 4, sc) bjmh = add + offsets[6] if readD(bjmh) == 203001 then setvalue(bjmh, 4, bj1) end if readD(bjmh) == 203002 then setvalue(bjmh, 4, bj2) end if readD(bjmh) == 203003 then setvalue(bjmh, 4, bj3) end if readD(bjmh) == 203014 then setvalue(bjmh, 4, bj4) end if readD(bjmh) == 203004 then setvalue(bjmh, 4, bj5) end if readD(bjmh) == 203015 then setvalue(bjmh, 4, bj6) end if readD(bjmh) == 203005 then setvalue(bjmh, 4, bj7) end gg.sleep(3000) setvalue(add + offsets[1], 4, 0) end function shochi() --手持链条 local mk = gg.getRangesList("libUE4.so:bss")[1] and gg.getRangesList("libUE4.so:bss")[1].start or 0 if mk == 0 then return 0 end local step1 = RUI(mk + 0x555C70) local step2 = RUI(step1 + 0x30) local step3 = RUI(step2 + 0x4B8) local step4 = RUI(step3 + 0x2A90) local add = RUI(step4 + 0x7A8) if add == 0 then return 0 end return readD(add + 0x194) end function delete_old_freeze(target_addr) local list = gg.getListItems() for i, item in pairs(list) do if item.address == target_addr then gg.removeListItems({i}) break end end end -- 清理所有脚本创建的冻结项(退出时调用) local function clean_all_freeze() local list = gg.getListItems() local to_remove = {} for i, item in pairs(list) do -- 匹配脚本创建的冻结项描述("旧"/"新") if item.description == "旧" or item.description == "新" then table.insert(to_remove, i) end end if #to_remove > 0 then gg.removeListItems(to_remove) toast.success("✅ 已清理所有冻结项") end end function gym(A, B) local mk = gg.getRangesList("libUE4.so:bss", "Cb")[1].start local basePtr = RUI(RUI(RUI(RUI(RUI(mk + 0xE2E00) + 0x648) + 0x50) + 0x38) + 0x38) for ZYRUI = 0xCA58, 0xE3C0, 0x18 do local addr = RUI(basePtr + ZYRUI) if readD(addr + 0x58) == A then setvalue(addr + 0x18, 4, B) break end end yf(A) end end ), changan.switch('hook(test)', function () -- 【状态1:hook模式】 function lx(kjsm) modify_with_success(1, kjsm) end function tf(kjsm) modify_with_success(2, kjsm) end function ts(kjsm) modify_with_success(3, kjsm) end function mz(kjsm) modify_with_success(4, kjsm) end function yf(kjsm) modify_with_success(5, kjsm) end function kz(kjsm) modify_with_success(6, kjsm) end function xz(kjsm) modify_with_success(7, kjsm) end function bb(kjsm) modify_with_success(8, kjsm) end function tk(kjsm) modify_with_success(9, kjsm) end function yz(kjsm) modify_with_success(12, kjsm) end function hj(kjsm) modify_with_success(10, kjsm) end function ny(kjsm) modify_with_success(24, kjsm) end function nk(kjsm) modify_with_success(25, kjsm) end function cx88(yp, sc, qk, wb, dj, qt, bj1, bj2, bj3, bj4, bj5, bj6, bj7) local ue4_offset = 0x726abc0 local path = "/storage/emulated/0/樱泽墨资源/UI1/qxhook" local function getPid() local pid = nil if gg and gg.getTargetInfo then local info = gg.getTargetInfo() if info and info.pid then pid = info.pid end end if not pid then local f = io.open("/proc/self/stat", "r") if f then local content = f:read("*line") f:close() if content then pid = tonumber(content:match("^(%d+)")) end end end return pid end local function getUE4Base() if not gg or not gg.getRangesList then return nil end local ranges = gg.getRangesList("libUE4.so") return ranges and #ranges > 0 and ranges[1].start or nil end function LSQ_Chain_GetValue(so, offset, type) local getRanges = function() local ranges = {} local t = gg.getRangesList("^/data/*.so*$") for i, v in pairs(t) do if v["type"]:sub(2, 2) == "w" then ranges[#ranges + 1] = v end end return ranges end local ranges = getRanges() local sostart = nil local valtype = gg.TYPE_DWORD if gg.getTargetInfo() and gg.getTargetInfo().x64 then valtype = gg.TYPE_QWORD end for i in pairs(ranges) do local _name = ranges[i]["internalName"]:gsub("^.*/", "") if so[1] == _name and so[2] == ranges[i]["state"] then sostart = ranges[i]["start"] break end end if not sostart then return nil end local rest = {} if offset and #offset > 0 then for i = 1, #offset do rest = {{flags = valtype, address = sostart + offset[i]}} rest = gg.getValues(rest) if not rest or #rest < 1 then return nil end if i == #offset then break end sostart = valtype == gg.TYPE_DWORD and (rest[1].value & 0xFFFFFFFF) or rest[1].value end end if rest and #rest >= 1 then return {address = rest[1].address, value = rest[1].value} end -- ✅ 关键:此处必须有 end! return nil end local pid = getPid() local ue4_base = getUE4Base() if pid and ue4_base then local ue4_addr = ue4_base + ue4_offset local chain_result = LSQ_Chain_GetValue({"libUE4.so:bss", "Cb"}, {0x555C70, 0x30, 0x4B8, 0x2A90}, gg.TYPE_QWORD) if chain_result then local file = io.open(path, "w") if file then file:write(tostring(pid), "\n") file:write(string.format("0x%X", ue4_addr), "\n") file:write(string.format("0x%X", chain_result.value), "\n") file:close() end end end gg.sleep(100) local mk = gg.getRangesList("libUE4.so:bss")[1].start local add = RUI(RUI(RUI(RUI(RUI(mk + 0x555C70) + 0x30) + 0x4B8) + 0x2A90) + 0x7A8) local offsets = {0x11C, 0x4, 0x2C, 0x54, 0x7C, 0xA4, 0x194} setvalue(add + offsets[1], 4, sc) setvalue(add + offsets[2], 4, qk) setvalue(add + offsets[3], 4, wb) setvalue(add + offsets[4], 4, dj) setvalue(add + offsets[5], 4, qt) setvalue(add + offsets[7], 4, sc) local bjmh = add + offsets[6] if readD(bjmh) == 203001 then setvalue(bjmh, 4, bj1) end if readD(bjmh) == 203002 then setvalue(bjmh, 4, bj2) end if readD(bjmh) == 203003 then setvalue(bjmh, 4, bj3) end if readD(bjmh) == 203014 then setvalue(bjmh, 4, bj4) end if readD(bjmh) == 203004 then setvalue(bjmh, 4, bj5) end if readD(bjmh) == 203015 then setvalue(bjmh, 4, bj6) end if readD(bjmh) == 203005 then setvalue(bjmh, 4, bj7) end callAsyncTask(function() elgg.exec("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", true, true) end) gg.sleep(3000) setvalue(add + offsets[1], 4, 0) end gg.alert("✅ hook已激活") end, -- ✅ 第一个匿名函数闭合! function () -- 【状态2:恢复模式】 function lx(kjsm) modify_item(1, kjsm) end function tf(kjsm) modify_item(2, kjsm) end function ts(kjsm) modify_item(3, kjsm) end function mz(kjsm) modify_item(4, kjsm) end function yf(kjsm) modify_item(5, kjsm) end function kz(kjsm) modify_item(6, kjsm) end function xz(kjsm) modify_item(7, kjsm) end function bb(kjsm) modify_item(8, kjsm) end function tk(kjsm) modify_item(9, kjsm) end function yz(kjsm) modify_item(12, kjsm) end function hj(kjsm) modify_item(10, kjsm) end function ny(kjsm) modify_item(24, kjsm) end function nk(kjsm) modify_item(25, kjsm) end function cx88(yp, sc, qk, wb, dj, qt, bj1, bj2, bj3, bj4, bj5, bj6, bj7) local mk = gg.getRangesList("libUE4.so:bss")[1].start local add = RUI(RUI(RUI(RUI(RUI(mk + 0x555C70) + 0x30) + 0x4B8) + 0x2A90) + 0x7A8) local offsets = {0x11C, 0x4, 0x2C, 0x54, 0x7C, 0xA4, 0x194} setvalue(add + offsets[1], 4, sc) setvalue(add + offsets[2], 4, qk) setvalue(add + offsets[3], 4, wb) setvalue(add + offsets[4], 4, dj) setvalue(add + offsets[5], 4, qt) setvalue(add + offsets[7], 4, sc) local bjmh = add + offsets[6] if readD(bjmh) == 203001 then setvalue(bjmh, 4, bj1) end if readD(bjmh) == 203002 then setvalue(bjmh, 4, bj2) end if readD(bjmh) == 203003 then setvalue(bjmh, 4, bj3) end if readD(bjmh) == 203014 then setvalue(bjmh, 4, bj4) end if readD(bjmh) == 203004 then setvalue(bjmh, 4, bj5) end if readD(bjmh) == 203015 then setvalue(bjmh, 4, bj6) end if readD(bjmh) == 203005 then setvalue(bjmh, 4, bj7) end gg.sleep(3000) setvalue(add + offsets[1], 4, 0) end gg.alert("🔄 已切换为恢复模式") end -- ✅ 第二个匿名函数闭合 ), -- ✅ changan.switch 结束 changan.switch('内核读写(test)', function () 内核读写("开") end, function () 内核读写("关") end ), changan.button('代码查询',function() local function trim(s) return s and s:gsub("\227\128\128"," "):gsub("\194\160"," "):gsub("^%s*(.-)%s*$","%1") or "" end local PATH = "/storage/emulated/0/樱泽墨资源/UI1/代码查询.h" local function search(key) key=trim(key:lower()) local t={} local f=io.open(PATH,"r") if not f then return end for l in f:lines() do local n,i=l:match("^(.+)%-%-(%d+)$") if n and i and trim(n):lower():find(key,1,true) then table.insert(t,{n=trim(n),i=i}) if #t>=520 then break end end end f:close() return t end local i=gg.prompt{"输入关键词 只支持名称 最多显示520条"} if not i then return end local k=trim(i[1]) if k=="" then gg.alert("请输入关键词") return end local r=search(k) if not r or #r==0 then gg.alert("无结果") return end local s="匹配"..#r.."条\n" for j,v in ipairs(r) do s=s..j.."."..v.n.." "..v.i.."\n" end gg.alert(s) end), changan.button('打开切换到越南,暂时没更新', function () end ), changan.switch("切换", function () toast.success("✅ 越南已生效") end, function () end ), changan.switch("隐藏GG图标", function () gg.hide( true ) end, function () gg.hide(false ) end ), changan.button('清除冻结', function () gg.clearList() playOk() end ), changan.buttonMix('退出UI', '/storage/emulated/0/樱泽墨资源/UI1/图片/主页', function () luajava.exit() end ), }, { name = '混搭', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/衣服/明日香', changan.text("EVA៴ ", "#333333", "15sp"), changan.box2( { {text = "战斗服", icon = "/storage/emulated/0/樱泽墨资源/UI1/衣服/明日香"}, changan.gyx1( { {'明日香', function() yf(1406387) gg.sleep(3000) 衣服防一秒() playOk() end}, {'真理', function() yf(1406388) gg.sleep(3000) 衣服防一秒() playOk() end}, {'真嗣', function() yf(1406385) gg.sleep(3000) 衣服防一秒() playOk() end}, {'零', function() yf(1406386) gg.sleep(3000) 衣服防一秒() playOk() end}, {'薰', function() yf(1406389) gg.sleep(3000) 衣服防一秒() playOk() end} }) }), changan.text("木乃伊៴ ", "#333333", "15sp"), changan.box2( { {text = "木乃伊", icon = "/storage/emulated/0/樱泽墨资源/UI1/衣服/万圣木乃伊"}, changan.gyx1( { {'白木乃伊', function() yf(1400687) gg.sleep(3000) 衣服防一秒() playOk() end}, {'黄木乃伊', function() yf(1405623) gg.sleep(3000) 衣服防一秒() playOk() end} }) }), changan.text("金装៴ ", "#333333", "15sp"), changan.box2( { {text = "金装", icon = "/storage/emulated/0/樱泽墨资源/UI1/衣服/秘渊灵主"}, changan.gyx1( { {'神羽恋人', function() yf(1407276) gg.sleep(3000) 衣服防一秒() playOk() end}, {'风灵迦尔', function() yf(1407366) gg.sleep(3000) 衣服防一秒() playOk() end}, {'秘渊灵主', function() yf(1406971) gg.sleep(3000) 衣服防一秒() playOk() end}, {'玲珑白蛇', function() yf(1407161) gg.sleep(3000) 衣服防一秒() playOk() end}, {'曙光芙洛拉', function() yf(1407103) gg.sleep(3000) 衣服防一秒() playOk() end}, {'金尊法老', function() yf(1406469) gg.sleep(3000) playOk() end}, {'冰蝶新娘', function() yf(1407049) gg.sleep(3000) 衣服防一秒() playOk() end} }) }), changan.box2( { {text = "头盔", icon = "/storage/emulated/0/樱泽墨资源/UI1/衣服/头盔/地狱骑士"}, changan.gyx1( { {'隐藏', function () tk(0) end }, {'刺头', function () tk(1502003014) end }, {'冰头', function () tk(1502003023) end }, {'胖达头', function () tk(1502002027) end }, {'新辉王冠', function () tk(1502003439) end } }) }), changan.box2( { {text = "背包", icon = "/storage/emulated/0/樱泽墨资源/UI1/衣服/背包/古城密探"}, changan.gyx1( { {'隐藏', function () bb(0) end }, {'战术星舱背包', function () bb(1501000663) end }, {'簪花葫芦背包', function () bb(1501003629) end }, {'ADIDAS', function () tk(1501000303) end }, {'黄鲨鱼', function () bb(1501003058) end } }) }), }, { name = '散装自选', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/图片/上衣', changan.button('保存配置', function () tutor = gg.choice( {"保存", "加载"}, nil, "保存or加载") if tutor == 1 then function xingshen() ue4 = staticstart( {"libUE4.so:bss", "Cb", 1}) nmsl = xing(ue4, {0x555C70, 0x30, 0x4B8, 0x2E50, 0x3E8, 0x0}) if not nmsl or nmsl == 0 then return end end function readAllDress() xingshen() if not nmsl then return { } end local data = { } local parts = { {"脸部", 1}, {"头发", 2}, {"头饰", 3}, {"面罩", 4}, {"衣服", 5}, {"裤子", 6}, {"鞋子", 7}, {"背包", 8}, {"头盔", 9}, {"手套", 10}, {"眼罩", 12}, {"内衣", 24}, {"内裤", 25} } for _, p in ipairs(parts) do local name, bid = p[1], p[2] for q = 0, 0x999, 0x3C do if getvalue(nmsl + 0x8 + q, 4) == bid then data[name] = getvalue(nmsl + q, 4) break end end end return data end local savePath = "/storage/emulated/0/樱泽墨资源/ui1/枪械皮肤/配置衣服.txt" local dressData = readAllDress() if next(dressData) == nil then toast.success("❌ 读取失败") return end local showStr = "当前装扮数值:\n" local saveStr = "" for name, val in pairs(dressData) do showStr = showStr .. name .. ":" .. val .. "\n" saveStr = saveStr .. name .. "=" .. val .. "\n" end local choice = gg.choice( {"✅ 保存配置", "❌ 取消"}, nil, showStr) if choice ~= 1 then toast.success("已取消存档") return end local file, err = io.open(savePath, "w") if not file then gg.alert("❌ 保存失败\n错误:" .. (err or "无存储权限/路径不存在")) return end file:write(saveStr) file:close() toast.success("✅ 存档成功!") end if tutor == 2 then local configPath = "/storage/emulated/0/樱泽墨资源/ui1/枪械美化/配置衣服.txt" local file, err = io.open(configPath, "r") if not file then gg.alert("❌ 加载失败\n未找到配置文件\n路径:" .. configPath) return end local config = { } local showInfo = "配置文件内容:\n" for line in file:lines() do line = line:gsub("%s+", "") if line ~= "" then local part, id = line:match("^(.+)=(%d+)$") if part and id then config[part] = tonumber(id) showInfo = showInfo .. part .. ":" .. id .. "\n" end end end file:close() if next(config) == nil then toast.success("❌ 配置文件内容无效") return end local choice = gg.choice( {"✅ 加载并应用", "❌ 取消"}, nil, showInfo) if choice ~= 1 then toast.success("已取消加载") return end if config.脸部 then lx(config.脸部) end if config.头发 then tf(config.头发) end if config.头饰 then ts(config.头饰) end if config.面罩 then mz(config.面罩) end if config.衣服 then yf(config.衣服) end if config.裤子 then kz(config.裤子) end if config.鞋子 then xz(config.鞋子) end if config.背包 then bb(config.背包) end if config.头盔 then tk(config.头盔) end if config.眼罩 then yz(config.眼罩) end if config.手套 then hj(config.手套) end if config.内衣 then ny(config.内衣) end if config.内裤 then nk(config.内裤) end toast.success("✅ 配置加载完成\n已应用全部装扮") end end ), changan.box( { "头发", changan.gyx1( { {'2023 PMWI', function () tf(1410480) playOk() end }, {'雷电战魂', function () tf(1410085) playOk() end }, {'双马尾(白)', function () tf(40604012) playOk() end }, {'双马尾', function () tf(40605012) playOk() end }, }), }), changan.box( { "头饰", changan.gyx1( { {'恶魔角', function () ts(1402218) playOk() end }, {'天使之翼', function () ts(1402223) playOk() end }, }), }), changan.box( { "眼罩", changan.gyx1( { { '自改眼罩', function () local cfg_file = "/sdcard/樱泽墨资源/ui1/眼罩" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {1314, } end qing = gg.prompt( {"没有过一秒 输入你喜欢的眼罩代码:", }, cfg, {"text", }) if qing ~= nil then gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end yz(qing[1]) playOk() end end }, {'暗影哥特', function () yz(1484198) playOk() end }, {'幻境骇客', function () yz(1403326) playOk() end }, }), }), changan.box( { "面罩", changan.gyx1( { { '自改面罩', function () local cfg_file = "/sdcard/樱泽墨美化资源/面罩.txt" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {1314, } end qing = gg.prompt( {"没有过一秒 输入你喜欢的面罩代码:", }, cfg, {"text", }) if qing ~= nil then gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end mz(qing[1]) playOk() end end }, {'小丑鼻子', function () mz(1400165) playOk() end }, {'豹纹口罩', function () mz(474031) playOk() end }, }), }), changan.box( { "上衣", changan.gyx1( { { '自改衣服', function () local cfg_file = "/sdcard/樱泽墨美化资源/衣服.txt" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {1407276, } end qing = gg.prompt( {"没有过一秒 输入你喜欢的衣服代码:", }, cfg, {"text", }) if qing ~= nil then gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end yf(qing[1]) playOk() end end }, {'碟中谍上衣', function () yf(1400324) playOk() end }, {'战队服', function () yf(1400708) playOk() end }, {'骷髅船长', function () yf(1400708) playOk() end }, {'Ducati卫衣', function () yf(1404411) playOk() end }, {'武装女仆', function () yf(1400106) end }, {'甜蜜菠萝', function () yf(1404153) playOk() end }, {'波波桃', function () yf(1404411) playOk() end }, {'暗金舞者', function () yf(1404133) playOk() end }, {'B.Duck', function () yf(1404016) playOk() end }, {'挑战者', function () yf(1404127) playOk() end }, {'狂沙舞者', function () yf(1404207) playOk() end }, }), }), changan.box( { "裤子", changan.gyx1( { { '自改裤子', function () local cfg_file = "/sdcard/樱泽墨美化资源/裤子.txt" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {1314, } end qing = gg.prompt( {"没有过一秒 输入你喜欢的裤子代码:", }, cfg, {"text", }) if qing ~= nil then gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end kz(qing[1]) playOk() end end }, {'运动裤', function () kz(404030) playOk() end }, {'甜蜜菠萝', function () kz(1404152) playOk() end }, }), }), changan.box( { "鞋子", changan.gyx1( { { '自改鞋子', function () local cfg_file = "/sdcard/樱泽墨美化资源/鞋子.txt" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {1314, } end qing = gg.prompt( {"没有过一秒 输入你喜欢的鞋子代码:", }, cfg, {"text", }) if qing ~= nil then gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end xz(qing[1]) playOk() end end }, {'迷彩', function () xz(1404051) playOk() end }, {'霹雳拳王', function () xz(1404423) playOk() end }, }), }), changan.box( { "手套", changan.gyx1( { {'隐藏护甲', function () hj(0) playOk() end }, {'冰霜手套', function () hj(452001) playOk() end }, {'流沙手套', function () hj(452003) playOk() end }, {'水墨手套', function () hj(452002) playOk() end }, }), }), }, { name = '混搭', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/图片/上衣', changan.text("作者混搭៴ ", "#333333", "15sp"), changan.box2( { {text = "作者混搭", icon = "/storage/emulated/0/樱泽墨资源/UI1/图片/哈哈"}, changan.gyx1( { { '哈哈第一套', function () tf(40604012) ts(1402223) yf(1400324) xz(1400371) mz(1400165) lx(1400563) yz(1404198) kz(1400050) bb(1501003487) end }, { '哈哈第二套', function () yf(1400101) kz(404084) xz(1400371) tf(40604012) ts(1400426) mz(1400168) yz(1404199) lb(401993) bb(1501002229) tk(0) kj(503003) end } }) }), changan.text("代理混搭៴ ", "#333333", "15sp"), changan.box2( { {text = "代理", icon = "/storage/emulated/0/樱泽墨资源/UI1/图片/哈哈"}, changan.gyx1( { { '小恒混搭', function () tf(40605012) ts(1402218) mz(1400165) yz(1404198) yf(1404053) kz(1400050) xz(1404423) bb(1501003261) hj(452011) end }, { '樱小洛混搭', function () tf(40605012) ts(1402218) yf(1404243) kz(1404152) xz(1400127) bb(1501003261) end }, { '樱小洛第二套混搭', function () tf(40605012) ts(1402218) yf(1400101) kz(1404002) xz(1400127) bb(1501003261) end }, { '抹茶混搭', function () tf(40604012) ts(1402223) mz(1400165) yz(1404198) yf(1400708) kz(1404152) xz(1404423) bb(0) end }, { '忆风', function () yf(140400) kz(1404050) xz(1404424) tf(1410085) ts(0) mz(0) yz(1404198) playOk() end }, }) }), changan.text("用户混搭៴ ", "#333333", "15sp"), changan.box2( { {text = "用户混搭", icon = "/storage/emulated/0/樱泽墨资源/UI1/图片/哈哈"}, changan.gyx1( { { '逆光混搭', function () yf(403183) kz(1404160) xz(1400651) tf(40605012) ts(1402218) mz(0) yz(1404198) lx(401993) bb(1501003596) tk(1502003014) end }, { '羽北大王混搭', function () yf(1405040) kz(1404160) xz(1400651) tf(40605012) ts(1402223) mz(1400165) yz(1404198) lb(401993) bb(1501003211) tk(0) end }, { '有始终混搭', function () yf(1404053) kz(1404160) xz(1404423) tf(40605012) ts(0) mz(0) yz(1404198) lx(117) bb(1501003554) tk(1402223) hj(452001) end }, { '猪头肉混搭', function () tk(1400154) yf(1407825) end }, { '樱泽墨混搭', function () tf(1410085) ts(1402218) mz(1400165) yz(1404198) yf(1400101) kz(1404160) xz(1404423) kj(0) bb(0) tk(0) end }, { '黄金风衣', function () lx(1400779) tf(1410436) gym(1400135, 1406891) end }, {'黄沙圣体', function () gym(403007, 402902) end }, { '小黄鸭穿搭', function () ts(1402218) --头饰 tk(0) --头盔 tf(40605011) --头发 kz(1404201) -- 裤子 yz(1404198) -- 眼罩 mz(1400165) -- 口罩 xz(1404423) -- 鞋子 yf(1405801) --衣服 bb(1501003211) --背包 end }, { '废墟猎手混搭', function () tf(1410480) --头发 yz(1403274) --眼罩 yf(1405163) hjm() end }, { '身法荣', function () bb(1501003276) --背包 tk(1502002014) --地狱骑士头盔 mz(0) --隐藏 yz(1403627) --音乐之王眼镜 mz(474031) --豹皮面罩 kz(404049) --s1战斗裤 end }, { '七安', function () bb(1501003554) --背包 tk(1502003014) tf(40604011) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1404243) kz(1404230) xz(1404423) end }, { '假人', function () yf(402200) kz(0) xz(1404423) tf(40605011) ts(1402218) mz(0) yz(1404198) lx(402296) bb(0) tk(0) kj(0) end }, { '狂沙舞者套装', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1400127) --小丑鼻子 yf(1404207) kz(1404160) xz(1404423) end }, { '迷彩鲨鱼', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1404049) kz(1404050) xz(1404051) end }, { '黑色风衣套装', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(403182) kz(1404002) xz(1400127) end }, { '小丑鱼套装', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1405238) kz(0) xz(1400127) end }, { '赤色车神搭配', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1400781) kz(1404155) xz(1400022) end }, { '骷髅船长搭配', function () tf(40604012) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1404053) kz(1404160) xz(1400127) end }, { '指挥官搭配', function () tf(40605011) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1400101) kz(404030) xz(1400022) end }, { '战队服搭配', function () tf(1402879) mz(0) --隐藏 yz(0) mz(1403028) --小丑鼻子 yf(1400708) kz(404030) xz(1400022) end } }) }), }, { name = '枪械美化', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/m416', changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/龙吟", }, "mk14", { [1] = "龙吟妹控", [2] = "5级龙吟", [3] = "星云mk", [4] = "红白mk", [5] = "奶龙mk", [6] = "凌霄凤鸣", }, "-mk14", "mk14_num", 6, 1, { [1] = function (num) cx88(103007, 1103007028, 1030070234, 0, 1030070227, 1030070236, 1030070218, 1030070217, 1030070216, 1030070215, 1030070214, 1030070213, 1030070212) playok() end, [2] = function (num) cx88(103007, 1103007025, 1030070234, 0, 1030070227, 1030070236, 1030070218, 1030070217, 1030070216, 1030070215, 1030070214, 1030070213, 1030070212) playok() end, [3] = function (num) cx88(103007, 1103007020, 29100400, 0, 1030070211, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 203005) playok() end, [4] = function (num) cx88(103007, 1103007010, 29100400, 0, 20100900, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 203005) playok() end, [5] = function (num) cx88(103007, 1103007038, 29100400, 0, 1030070381, 20200200, 1010032027, 1010032026, 1010032025, 1010032024, 1010032023, 1010032022, 203005) playok() end, [6] = function (num) cx88(103007, 1103007029, 29100400, 0, 1030070211, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 203005) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/虎啸", }, "M416", { [1] = "赤霄神剑", [2] = "虎啸丹青", [3] = "冰霜核心", [4] = "愚人小丑", [5] = "机魂m4", [6] = "武魂宗师", [7] = "封印幽冥" }, "-M416", "m416_num", 7, 1, { [1] = function (num) cx88(101004, 1101004246, 1010042407, 1010042414, 1010042405, 1010042462, 1010042399, 1010042398, 1010042397, 1010042396, 1010042395, 1010042394, 0) playok() end, [2] = function (num) cx88(101004, 1101004236, 1010042306, 1010042314, 1010042305, 1010042315, 1010042299, 1010042298, 1010042297, 1010042296, 1010042295, 1010042294, 0) playok() end, [3] = function (num) cx88(101004, 1101004046, 1010040463, 1010040479, 1010040461, 1010040475, 1010040470, 1010040469, 1010040468, 1010040467, 1010040466, 1010040481, 0) playok() end, [4] = function (num) cx88(101004, 1101004062, 1010040577, 1010040585, 1010040576, 1010040586, 1010040569, 1010040568, 1010040567, 1010040566, 1010040565, 1010040564, 0) playok() end, [5] = function (num) cx88(101004, 1101004218, 1010042127, 1010042136, 1010042126, 1010042137, 1010042119, 1010042118, 1010042117, 1010042116, 1010042115, 1010042114, 0) playok() end, [6] = function (num) cx88(101004, 1101004201, 1010041957, 1010041965, 1010041955, 1010041966, 1010041948, 1010041947, 1010041946, 1010041945, 1010041944, 1010041967, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/凤鸣", }, "mg3", { [1] = "凤鸣神戟", [2] = "苍穹之龙", [3] = "彩虹g3", [4] = "绿皮", [5] = "铜铸神兽", }, ",mg3", "mg3_num", 5, 1, { [1] = function (num) cx88(105010, 1105010019, 0, 0, 1050100137, 0, 1050100144, 1050100143, 1050100142, 1050100141, 1050100139, 1050100138, 0) playok() end, [2] = function (num) cx88(105010, 1105010008, 0, 0, 20100900, 0, 203001, 203002, 203003, 203014, 203004, 203015, 203005) playok() end, [3] = function (num) cx88(105010, 1105010001, 29100400, 20500500, 20100900, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 0) playok() end, [4] = function (num) cx88(105010, 1105010011, 29100400, 20500500, 20100900, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 0) playok() end, [5] = function (num) cx88(105010, 1105010010, 29100400, 20500500, 20100900, 20200200, 203001, 203002, 203003, 203014, 203004, 203015, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/沙影", }, "ak 突击步枪", { [1] = "沙影神国", [2] = "光暗圣殿", [3] = "星海提督", [4] = "绝胜之日", [5] = "部落之王", [6] = "光暗金羽", }, "-ak", "ak_num", 6, 1, { [1] = function (num) cx88(101001, 1101001265, 1010012589, 1011020364, 1010012594, 1011020365, 1010012587, 1010012586, 1010012585, 1010012584, 1010012583, 1010012582, 0) playok() end, [2] = function (num) cx88(101001, 1101001249, 1010012438, 1011020444, 1010012444, 1011020445, 1010012436, 1010012435, 1010012434, 1010012433, 1010012432, 1010012446, 0) playok() end, [3] = function (num) cx88(101001, 1101001213, 1010012068, 0, 1010012073, 0, 1010012066, 1010012065, 1010012064, 1010012063, 1010012062, 1010012075, 0) playok() end, [4] = function (num) cx88(101001, 1101001242, 1010012358, 0, 1010012364, 0, 1010012356, 1010012355, 1010012354, 1010012353, 1010012352, 1010012366, 0) playok() end, [5] = function (num) cx88(101001, 1101001174, 1010011668, 0, 1010011674, 0, 1010011666, 1010011665, 1010011664, 1010011663, 1010011662, 1010011497, 0) playok() end, [6] = function (num) cx88(101001, 1101001256, 1010012508, 0, 1010012514, 0, 1010012506, 1010012505, 1010012504, 1010012503, 1010012502, 1010012516, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/灵阁", }, "m762 突击步枪", { [1] = "灵阁魔剪", [2] = "铂金骸骨", [3] = "森白骸骨", [4] = "琉璃仙灵", }, "-m762", "m762_num", 4, 1, { [1] = function (num) cx88(101008, 1101008163, 0, 1010081586, 1010081631, 1010081584, 1010081577, 1010081576, 1010081575, 1010081574, 1010081573, 1010081572, 0) playok() end, [2] = function (num) cx88(101008, 1101008153, 1101008163, 1010081541, 1010081529, 0, 1010081526, 1010081525, 1010081524, 1010081523, 1010081522, 1010081521, 0) playok() end, [3] = function (num) cx88(101008, 1101008146, 1010081402, 1010081405, 1010081399, 0, 1010081396, 1010081395, 1010081394, 1010081393, 1010081392, 1010081391, 0) playok() end, [4] = function (num) cx88(101008, 1101008136, 1010081315, 1010081318, 1010081313, 0, 1010081307, 1010081306, 1010081305, 1010081304, 1010081303, 1010081302, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/御灵", }, "SCAR-L 突击步枪", { [1] = "凤曜琼华", [2] = "御灵魂契", [3] = "霓虹天后", [4] = "荣誉之枪", [5] = "愚者之庸", }, "-SCAR-L", "SCAR-L_num", 5, 1, { [1] = function (num) cx88(101003, 1101003227, 1010032242, 1010032247, 1010032210, 101003227, 1010032207, 1010032206, 1010032205, 1010032204, 1010032203, 1010032202, 0) playok() end, [2] = function (num) cx88(101003, 1101003219, 1010032222, 1010032227, 1010032220, 1010031920, 1010032217, 1010032216, 1010032215, 1010032214, 1010032213, 1010032212, 0) playok() end, [3] = function (num) cx88(101003, 1101003195, 1010031911, 1010031916, 1010031909, 1010031920, 1010031906, 1010031905, 1010031904, 1010031903, 1010031902, 1010031901, 0) playok() end, [4] = function (num) cx88(101003, 1101003134, 1010031911, 1010031916, 1010031909, 1010031920, 1010031906, 1010031905, 1010031904, 1010031903, 1010031902, 1010031901, 0) playok() end, [5] = function (num) cx88(101003, 1101003188, 1010031764, 1010031769, 1010031763, 0, 1010031757, 1010031756, 1010031755, 1010031754, 1010031753, 1010031752, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/哥斯拉", }, "GROZA 突击步枪", { [1] = "红莲哥斯拉", [2] = "两面宿傩", }, "-GROZA", "GROZA_num", 2, 1, { [1] = function (num) cx88(101005, 1101005098, 1010050928, 0, 1010050932, 0, 1010050927, 1010050926, 1010050925, 1010050924, 1010050923, 1010050922, 0) playok() end, [2] = function (num) cx88(101005, 1101005038, 1010050327, 0, 1010050330, 0, 1010050326, 1010050325, 1010050324, 1010050323, 1010050322, 1010050321, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/清夜", }, "ace32 突击步枪", { [1] = "清夜蝶吻", }, "-ace32", "ace32_num", 1, 1, { [1] = function (num) cx88(101102, 1101102040, 1011020357, 1011020364, 1011020355, 1011020365, 1011020349, 1011020348, 1011020347, 1011020346, 1011020345, 1011020344, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/玫瑰", }, "aug 突击步枪", { [1] = "罪恶玫瑰", [2] = "破军狂鸣", }, "-aug", "aug_num", 2, 1, { [1] = function (num) cx88(101006, 1101006085, 1010060795, 1010060800, 1010060794, 0, 1010060788, 1010060787, 1010060786, 1010060785, 1010060784, 1010060783, 0) playok() end, [2] = function (num) cx88(101006, 1101006075, 0, 1010060706, 1010060718, 1010060703, 1010060696, 1010060695, 1010060694, 1010060693, 1010060692, 1010060691, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/冰", }, "98k 狙击枪", { [1] = "冰魄幻羽", [2] = "瑰红花火", [3] = "紫戮电极", [4] = "恐怖齿痕", }, "-98k", "98k_num", 4, 1, { [1] = function (num) cx88(103001, 1103001202, 1030011951, 0, 0, 1030011950, 1030011947, 1030011946, 1030011945, 1030011944, 1030011943, 1030011942, 1030011941) playok() end, [2] = function (num) cx88(103001, 1103001191, 0, 0, 0, 0, 1030011857, 1030011856, 1030011855, 1030011854, 1030011853, 1030011852, 1030011851) playok() end, [3] = function (num) cx88(103001, 1103001179, 0, 0, 0, 0, 1030011737, 1030011736, 1030011735, 1030011734, 1030011733, 1030011732, 1030011731) playok() end, [4] = function (num) cx88(103001, 1103001060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/灵泉", }, "ARM 狙击枪", { [1] = "烈焰圣枪", [2] = "灵泉剑影", [3] = "烈焰圣枪", }, "-ARM", "ARM_num", 3, 1, { [1] = function (num) cx88(103012, 1103012009, 0, 0, 1030120101, 0, 1105001048, 1105001047, 1105001046, 1105001045, 1105001044, 1105001043, 1105001042) playok() end, [2] = function (num) cx88(103012, 1103012031, 0, 0, 1030120311, 0, 1030120258, 1030120257, 1030120256, 1030120255, 1030120254, 1030120253, 1030120252) playok() end, [3] = function (num) cx88(103012, 1103012019, 0, 0, 1030120191, 0, 1030120138, 1030120137, 1030120137, 1030120136, 1030120135, 1030120134, 1030120133) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/夜影", }, "m24 狙击枪", { [1] = "夜影晨曦", [2] = "骄阳辉月", [3] = "黄金权杖", [4] = "极尊音律", }, "-m24", "m24-num", 4, 1, { [1] = function (num) cx88(103002, 1103002156, 1030021083, 0, 1030021131, 1030021083, 1030021078, 1030021077, 1030021076, 1030021075, 1030021074, 1030021073, 1030021072) playok() end, [2] = function (num) cx88(103002, 1103002136, 1030021013, 0, 1030021061, 1030021012, 1030021008, 1030021007, 1030021006, 1030021005, 1030021004, 1030021003, 1030021002) playok() end, [3] = function (num) cx88(103002, 1103002030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) playok() end, [4] = function (num) cx88(103002, 1103002087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/赤潮", }, "AWM 狙击枪", { [1] = "玲珑白蛇", [2] = "致命炎凤", [3] = "赤潮龙息", }, "-AWM", "AWM_num", 2, 1, { [1] = function (num) cx88(103007, 1103003087, 1030030826, 0, 1030030824, 1030030828, 1030070218, 1030030817, 1030030816, 1030030815, 1030030814, 1030030813, 1030030812) playok() end, [2] = function (num) cx88(103003, 1103003062, 0, 0, 1030030621, 0, 0, 0, 0, 0, 0, 0, 0) playok() end, [3] = function (num) cx88(103007, 1103003079, 1030030743, 0, 1030030745, 1030030747, 1030030738, 1030030737, 1030030736, 1030030735, 1030030734, 1030030733, 1030030732) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/红", }, "uzi 冲锋枪", { [1] = "冰魄幻羽", [2] = "瑰红花火", }, "-uzi", "uiz_num", 2, 1, { [1] = function (num) cx88(102001, 1102001130, 1020011248, 0, 1020011246, 0, 1020011243, 1020011242, 0, 0, 0, 0, 0) playok() end, [2] = function (num) cx88(102001, 1102001120, 1020011138, 0, 1020011136, 0, 1020011133, 1020011132, 0, 0, 0, 0, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/噬魂", }, "ump45 冲锋枪", { [1] = "噬魂凝视", [2] = "水晶冰刺", }, "-ump45", "ump45_num", 2, 1, { [1] = function (num) cx88(102002, 1102002424, 1020024192, 1020024197, 1020024190, 0, 1020024187, 1020024186, 1020024185, 1020024184, 1020024183, 1020024182, 0) playok() end, [2] = function (num) cx88(102002, 1102002136, 1020021313, 1020021318, 1020021312, 0, 1020021307, 1020021306, 1020021305, 1020021304, 1020021303, 1020021302, 0) playok() end, }), changan.numberAdjust({[1] = "/storage/emulated/0/樱泽墨资源/UI1/枪械皮肤/掠空", }, "Vector 冲锋枪", { [1] = "掠空", }, "-Vector", "Vector_num", 1, 1, { [1] = function (num) cx88(102003, 1102003080, 1020030756, 1020030760, 1020030754, 1020030765, 1020030748, 1020030747, 1020030746, 1020030745, 1020030744, 1020030764, 0) playok() end, }), }, { name = '其他', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/图片/选择', changan.button('判断播报',function() local function main_loop() local loop_delay = read_loop_speed() local target_addr = 0 -- 初始化目标地址,用于退出清理 -- 3. 解析目标地址 local t_So = {"libUE4.so:bss", "Cb"} local t_Offset = {0x555C70,0x30,0x1970} local target_addr_str = S_Pointer(t_So, t_Offset, true) target_addr = tonumber(target_addr_str) if not target_addr or target_addr == 0 then toast.success("❌ 目标地址解析失败") return end -- 4. 检测手持状态 local curr_val = shochi() if curr_val == 0 then toast.success("❌ 未手持或没有皮肤") return end -- 5. 初始冻结 delete_old_freeze(target_addr) gg.addListItems({{ address = target_addr, flags = 4, value = curr_val, freeze = true, description = "旧" }}) local last_val = curr_val local is_running = true -- 6. 循环检测(捕获退出信号) while is_running do -- 检测退出条件(step3值为0) local mk = gg.getRangesList("libUE4.so:bss")[1] and gg.getRangesList("libUE4.so:bss")[1].start or 0 local step1 = RUI(mk + 0x555C70) local step2 = RUI(step1 + 0x30) local check_val = RUI(step2 + 0x4B8) if check_val == 0 then toast.success("🔴 检测到退出条件,准备清理") is_running = false break end -- 更新冻结值 curr_val = shochi() if curr_val == 0 then gg.sleep(loop_delay) goto continue end if curr_val ~= last_val then delete_old_freeze(target_addr) gg.addListItems({{ address = target_addr, flags = 4, value = curr_val, freeze = true, description = "新" }}) last_val = curr_val end ::continue:: gg.sleep(loop_delay) end end -- 7. 执行主逻辑+确保退出时清理冻结(关键:捕获异常也会清理) local success, err = pcall(main_loop) -- 无论脚本正常结束还是报错,都清理冻结项 clean_all_freeze() if not success then gg.alert("❌ 脚本执行异常:" .. tostring(err)) end end), changan.box( { "枪械播报区", changan.gyx1( { {'冰霜核心', function () qxbb(1101004046) playOk() end }, {'龙吟国度', function () qxbb(1103007028) playOk() end }, {'凤鸣神戟', function () qxbb(1105010019) playOk() end }, {'决胜之日', function () qxbb(1502002427) playOk() end }, {'神庭冰棘', function () qxbb(1502003336) playOk() end }, {'琉璃仙灵', function () qxbb(1101008136) playOk() end } }) }), changan.box( { "圣装播报区", changan.gyx1( { {'幽冥阿努比斯', function () szbb(1407512) playOk() end }, {'风灵迦尔', function () szbb(1407366) playOk() end }, {'曙光芙洛拉', function () szbb(1407103) playOk() end }, {'海洋之王', function () szbb(1407140) playOk() end }, {'血鸦', function () szbb(1405909) playOk() end }, {'精灵王', function () szbb(1407142) playOk() end } }) }) }, { name = '功能', 图片 = '/storage/emulated/0/樱泽墨资源/UI1/图片/选择', changan.switch('动态广角', function () local cfgPath = "/sdcard/高木/UI1/Settings/动态广角.txt" local cfg = nil local loadCfg = loadfile(cfgPath) if loadCfg ~= nil then cfg = loadCfg() end if cfg == nil then cfg = {330} end local inputCfg = gg.prompt( {"数值修改: [200;520]"}, cfg, {"number"} ) if inputCfg ~= nil then gg.saveVariable(inputCfg, cfgPath) local targetFov = inputCfg[1] local ptrBase = {"libUE4.so:bss", "Cb"} local ptrOffsets = {0x555C70,0x30,0x4B8,0x1D40,0x39C} local targetAddr = S_Pointer(ptrBase, ptrOffsets, true) if targetAddr then gg.setValues({{ address = targetAddr, flags = 16, value = targetFov }}) playOk() else toast.success("动态广角修改失败(指针解析错误)") end end end, function () end), -- 静态广角 Switch(保留原open弹窗选择/close恢复1逻辑) changan.switch('静态广角', function () local cfg_file = "/sdcard/高木/UI1/Settings/静态广角.txt" local chunk = loadfile(cfg_file) local cfg = nil if chunk ~= nil then cfg = chunk() end if cfg == nil then cfg = {2,} end qing = gg.prompt({ "1是恢复,推荐2", },cfg,{"text",}) if qing == nil then else gg.saveVariable(qing, cfg_file) if qing[1] == true then qing1() end so=gg.getRangesList('libUE4.so')[1].start py=0x3594978 setvalue(so+py,16,qing[1]) playOk() end end, function () so=gg.getRangesList('libUE4.so')[1].start py=0x3594978 setvalue(so+py,16,1) end), changan.gyx1( { -- 手持聚点 { "手持聚点", function () local t = {"libUE4.so:bss", "Cb"} local tt = {0x555C70,0x30,0x4B8,0x2A90,0x7E8,0xC2C} local ttt = S_Pointer(t, tt, true) gg.addListItems({{address = ttt, flags = 16, value = 0, freeze = true}}) --- 手持聚点基准 playOk() end, function () end }, { "手持无后", function () playOk() end, function () end }, }) }, } changan.menu(icon, title, menu)