--ELGG专用UI --作者Shizuku B站靓女空白 --有问题联系Q2843833170并提供来源 --不接定制和单子请勿联系 TLOGO="突击队" DM = "音乐播放器" menu = {} current_song_info = {} playing = false SEARCH_API = "https://netease-cloud-music-api.fe-mm.com/search?offset=0&limit=%d&keywords=%s" PLAY_URL = "https://music.163.com/song/media/outer/url?id=%s.mp3" MAX_RETRY = 3 SEARCH_LIMIT = 20 function d() gg.clearResults() gg.setRanges(gg.REGION_CODE_APP) gg.searchNumber("1000000", 16, false, gg.SIGN_EQUAL, 0, -1) if gg.getResultCount() == 0 then gg.toast("开启失败") else gg.searchNumber("",16 , false, gg.SIGN_EQUAL, 0, -1) jg=gg.getResults(100)--设置冻结前100个代码 sl=gg.getResultCount() for i = 1, sl do dzy=jg[i].address gg.addListItems({[1] = {address = dzy,flags = 16,freeze = true,value = "750000"}}) end gg.toast("加速开启成功") gg.clearResults() end end function c1() gg.clearResults() gg.setRanges(16384) gg.searchNumber("1314520",16,false,gg.SIGN_EQUAL,0,-1) gg.getResults(202) gg.editAll("0.00999999978",16) gg.clearResults() gg.searchNumber("5.202",16,false,gg.SIGN_EQUAL,0,-1) gg.getResults(202) gg.editAll("9.99999997e-7",16) end function c() gg.clearResults() gg.setRanges(16384) gg.searchNumber("0.00999999978",16,false,gg.SIGN_EQUAL,0,-1) gg.getResults(202) gg.editAll("1314520",16) gg.clearResults() gg.setRanges(16384) gg.searchNumber("9.99999997e-7",16,false,gg.SIGN_EQUAL,0,-1) gg.getResults(202) gg.editAll("5.202",16) end function a() --local p = gg.prompt({'输入数值'},{0},{'number'}) fastsearch({ {27, 4, 32}, {-458752,0x4,4}, },{ {999, 0x4, 16, false, 0}}) -- 在冻结后面加个1 表示每次增量1 fastsearch({ {-458752, 4, 32}, {100,0x4,4}, {-458752,0x8,4}, {2,0xC,4}, {1,0x14,4}, },{ {4, 0x0, 16, false, 0}}) -- 在冻结后面加个1 表示每次增量1 fastsearch({ {-458752, 4, 32}, {1,-0x4,4}, {35,0x4,4}, {-458752,0x8,4}, {3,0xC,4}, },{ {10, 0x0, 16, false, 0}}) -- 在冻结后面加个1 表示每次增量1 end function b() fastsearch({ {51, 4, 32}, {-458752,0x4,4}, },{ {4, 0x4, 16, false, 0}}) -- 在冻结后面加个1 表示每次增量1 end function fastsearch(search, write) gg.setVisible(false) gg.clearResults() gg.setRanges(search[1][3]) gg.searchNumber(search[1][1], search[1][2]) if gg.getResultsCount() == 0 then gg.toast("Not Found") return false else local result = gg.getResults(gg.getResultsCount()) gg.clearResults() for i = 2, #search do local mtp = {} for w, r in ipairs(result) do mtp[#mtp + 1] = { address = r.address + search[i][2], flags = search[i][3] } end mtp = gg.getValues(mtp) local hook = {} for w, r in ipairs(mtp) do if r.value == search[i][1] then hook[#hook + 1] = result[w] end end result = hook end if #result > 0 then local tb = {{}, {}} for i, v in ipairs(result) do --- 遍历每个结果 for _, vv in ipairs(write) do local p = {address = v.address + vv[2], flags = vv[3], value = vv[1], freeze = vv[4]} if vv[5] then p.value = vv[1] + i * vv[5] end if vv[4] then --- true 就是冻结 table.insert(tb[2], p) else table.insert(tb[1], p) end end end gg.addListItems(tb[2]) gg.setValues(tb[1]) gg.toast("修改成功, 共修改" .. (#tb[1] + #tb[2]) .. "条结果") else gg.toast("Not Found") end end end -- 统一的重试请求函数 local function requestWithRetry(url, action) for retry = 1, MAX_RETRY do gg.toast(string.format("%s中(%d/%d)...", action, retry, MAX_RETRY)) local result = gg.makeRequest(url) if result and result.code == 200 then local data = json.decode(result.content) if data and data.code == 200 then return data end end gg.sleep(1000) end gg.alert(action.."失败,请检查网络") return nil end local function searchMusic() local input = gg.prompt({"歌曲名称或歌手", string.format("搜索数量", SEARCH_LIMIT)}, {"", "20"}, {"text", "text"}) if not input or input[1] == "" then return false end local limit = math.max(1, math.min(SEARCH_LIMIT, tonumber(input[2]) or 10)) local url = string.format(SEARCH_API, limit, input[1]:gsub("([^%w ])", function(c) return string.format("%%%02X", string.byte(c)) end)) local data = requestWithRetry(url, "搜索") if not data or not data.result or not data.result.songs then return false end menu = {} for _, song in ipairs(data.result.songs) do local artists = "" if song.artists and #song.artists > 0 then for j, artist in ipairs(song.artists) do artists = artists .. (j > 1 and " / " or "") .. (artist.name or "未知歌手") end else artists = "未知歌手" end table.insert(menu, { id = song.id, name = song.name or "未知歌曲", artist = artists, display = string.format("%s - %s", song.name or "未知歌曲", artists) }) end return #menu > 0 or (gg.alert("未找到相关歌曲") and false) end local function showResults() if #menu == 0 then return gg.alert("没有搜索记录") and false end local choices = {} for i, item in ipairs(menu) do table.insert(choices, string.format("%d. %s", i, item.display)) end table.insert(choices, "↩返回") local selected = gg.choice(choices, nil, string.format("搜索结果 (共%d首)", #menu)) if not selected or selected == #choices then return "back" end current_song_info = menu[selected] return true end local function playMusic() if not current_song_info or not current_song_info.id then return gg.alert("没有可用的歌曲信息") and false end local url = string.format(PLAY_URL, current_song_info.id) gg.toast("正在准备播放...") if gg.playMusic(url) then playing = true gg.toast("开始播放: " .. current_song_info.display) return true else gg.alert("播放失败,请检查网络") return false end end local function stopMusic() if playing then playing = false gg.playMusic("stop") gg.toast("播放已停止") else gg.toast("无正在播放的音乐") end end function mainMenu() gg.setVisible(false) -- 隐藏悬浮窗 local status = playing and "▶正在播放: "..current_song_info.display or "⏸未播放" local items = { "🔍搜索音乐", "📋搜索结果", playing and "⏹停止播放" or "▶播放音乐", "❌退出脚本" } local choice = gg.choice(items, nil, string.format("%s\n%s", DM, status)) if not choice then return end if choice == 1 then if searchMusic() then if showResults() == true then playMusic() end end elseif choice == 2 then if #menu > 0 then if showResults() == true then playMusic() end else gg.alert("请先搜索音乐") end elseif choice == 3 then if playing then stopMusic() elseif #menu > 0 then playMusic() else gg.alert("请先搜索并选择音乐") end elseif choice == 4 then stopMusic() os.exit() end mainMenu() -- 递归调用保持菜单显示 end -- 初始化 gg.toast("音乐播放器已启动") --[[ 为保证UI加载效率,UI内图片全部使用本地图片而不是云端调用 脚本的图片资源全部存储在/storage/emulated/0/NyaYAN/极简宽/res/这个目录下 且已经提前准备了一些资源可供使用,具体自行查看 图片名称为XFQ和LOGO的是重要图标,可使用下方函数替换 下方提供了一个下载图片资源的函数,你只需要提供外链即可 且脚本检测到用户第一次打开此脚本时会自动调用此函数,你也可以在别处调用 ]] function 下载图片() local 图片表={ {"目标名称","外链"}, {"目标名称","外链"}, } if 图片表[1][2]~="外链" then for i=1,#图片表 do file.download(图片表[i][2],"/storage/emulated/0/NyaYAN/极简宽/res/"..图片表[i][1]) end end end loadYunLuaGroup("5C3C4E3813681C4C204C35346F1B4C2F7EFF612D2B22175F195D410B6EE1B0AE82D284F56ABFA8") --此处可复制粘贴添加主题颜色,下面的十六进制ARGB颜色码分别为暗背景,亮背景,文字,图标,高亮 function 添加主题() return {LinearLayout, layout_height="-2"; layout_width="-1"; orientation="vertical", themebtn(1,"简约白",{0xEFFFFEFE,0xEBC3E0F6,0xFF404B7C,0xFF303030,0xFF0084FF}), themebtn(2,"温馨黄",{0xEFf9f4dc,0xEDDADADA,0xFFfba414,0xFFd85916,0xFFfa5d19}), } end --[[ 组件说明 注,下文所说文字大小为像素值,即数字,文字颜色为十六进制ARGB码 例如 0xFFFFFFFF 白色 普通文本 nyaText(text,size,color,func) 传入文本内容,文字大小,文字颜色,点击事件(function) 只有第一个是必填,其他可选 普通文字按钮 nyaButton(text,func,size,color) 传入文本内容,点击事件(function),文字大小,文字颜色 第1,2个是必填 图标按钮 nyaCButton(text,pic,func,size,color) 传入文本内容,图片名字,点击事件(function),文字大小,文字颜色 第123个是必填 普通开关 nyaSwitch(text,opfunc,clfunc,size,color,zt) 传入文本内容,开启事件(function),关闭事件(function),文字大小,文字颜色,开关状态(true为默认开启不填为关闭) 第123个是必填 补充 此UI中长按开关可以重置开关,就是将开启的开关转换为关闭状态但是不触发关闭事件 没看懂看下方事例 复制粘贴----==========----框住部分即可 ]] function 生成UI() return { ----==========---- {"菜单1","star",--菜单按钮名称,图片名称 { --下面一行对应一个功能,可无限添加或者减少 nyaSwitch("全英雄技能无CD和攻速99➕",function() a() end,function() a() end), nyaSwitch("全英雄无敌:注意⚠️人机会无敌",function() b() end,function() b() end), nyaSwitch("全图范围拿刀攻速9999➕",function() c() end,function() c1() end), nyaSwitch("游戏全局加速",function() d() end,function() d() end), }}, ----==========---- ----==========---- {"菜单2","set",--菜单按钮名称,图片名称 {nyaButton("主题",function() UI线程(function() hideExpand() themelay.setVisibility(0) end) end), nyaSwitch("自动隐藏ELGG", function() gg.hide(true) Settings["hide"]=true UpdateC() end, function() gg.hide(false) Settings["hide"]=false UpdateC() end,11,nil,Settings["hide"]), nyaSwitch("音量键显隐UI", function() Settings["volume"]=true UpdateC() end, function() Settings["volume"]=false UpdateC() end,11.5,nil,Settings["volume"]), nyaCButton("音乐","QQ音乐",function() mainMenu()end), }}, ----==========---- {"退出辅助","exit"}, --退出按钮勿动 } end Lock.Ui(LoadUI, nil, function(err) print(err) luajava.exit() end)