-------------使用说明-------- ---对接之前请在你们后台的接口管理,接口安全根据以下内容配置 --[[ 1、加密方式:RC4对称加密 2、加密编码方式:Base64编码 3、请求加密方式:全部加密 4、响应加密方式:全部加密 5、随机数防劫持:开 6、签名方式:SHA256 7、时间戳验证 :30000(30秒) 8、签名计算规则:方式二 脚本放置位置搜索词:这里放置你的脚本代码 ]] -- -- 应用编号 local appId = 1171 -- RC4秘钥 local encryptKey = "aXyxdnBSjac6Ckdb5nTZGmXp8KFrbCWS" -- 应用秘钥 local appKey = "SJMDTF4OU9SHSMJGZNX0X5JCQQTKVNZX" -- 应用版本号 local version = "2.6" -- 店铺地址ID local shopId = 9 -- 公告变量ID local noticeId = 633 -- 时间戳验证时间差(单位:毫秒)- 新增配置 local timestampTolerance = 5000000 local http = gg.makeRequest -- GG框架网络请求 local json = { _version = "0.1.2" } -- JSON编解码对象 local shopAddr = "" -- 店铺地址 -- 请将您的主脚本代码放在这个函数内 local function developerMainScript() -- 这里放置你的脚本代码 gg.alert("验证成功!开始执行主脚本...") end -- 核心加密 local function decryptDomains() local encoded1 = "aHR0cHM6Ly95ei5ibHlmdy5jbg==" local encoded2 = "aHR0cHM6Ly9vcHMubmV3LWNkbi5jb20=" local function base64Decode(data) local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' data = string.gsub(data, '[^'..b64chars..'=]', '') return (data:gsub('.', function(x) if (x == '=') then return '' end local r,f='',(b64chars:find(x)-1) for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end return r; end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) if (#x ~= 8) then return '' end local c=0 for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end return string.char(c) end)) end local domain1 = base64Decode(encoded1) local domain2 = base64Decode(encoded2) return {domain1, domain2} end local DOMAINS = decryptDomains() local currentDomain = DOMAINS[1] local domainIndex = 1 local isDomainInitialized = false local SECURE_STORAGE_DIR = "/storage/emulated/0/lua_secure/" local CONFIG_FILE_NAME = "secure_config.dat" local function stringTrim(str) str = tostring(str) return str:gsub("^%s+", ""):gsub("%s+$", "") end local function completeDomainProtocol(domain) domain = stringTrim(domain) if domain:find("^https?://") then return { domain } end return { "https://" .. domain, "http://" .. domain } end -- 时间戳验证函数 local function validateTimestamp(serverTimestamp) if not serverTimestamp then return false end local clientTime = os.time() * 1000 -- 客户端当前时间戳(毫秒) local timeDiff = math.abs(clientTime - serverTimestamp) -- 检查时间差是否在容忍范围内 if timeDiff > timestampTolerance then gg.alert(string.format("时间戳验证失败!\n时间差:%.1f秒(最大容忍:%.1f秒)", timeDiff/1000, timestampTolerance/1000)) return false end return true end -- 获取Android ID local function getAndroidId() local androidId = "" local ok, serialNo = pcall(gg.getProperty, "ro.serialno") if ok and serialNo and stringTrim(serialNo) ~= "" then androidId = stringTrim(serialNo) else local ok2, androidIdRaw = pcall(gg.getProperty, "persist.sys.android_id") if ok2 and androidIdRaw and stringTrim(androidIdRaw) ~= "" then androidId = stringTrim(androidIdRaw) end end return androidId end -- 读取安卓设备IMEI local function getImei() local imei = "" local imeiPaths = { "/data/user_de/0/com.android.providers.telephony/databases/telephony.db", "/data/data/com.android.providers.telephony/databases/telephony.db" } for _, path in ipairs(imeiPaths) do local ok, file = pcall(io.open, path, "r") if ok and file then local content = file:read("*a") file:close() local matchImei = content:match("IMEI[^%d]*(%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d)") if matchImei then imei = matchImei break end end end return imei end local function generateAndroidDeviceMac() local deviceId = "" local androidId = getAndroidId() if androidId ~= "" then deviceId = androidId else local imei = getImei() if imei ~= "" then deviceId = imei else deviceId = tostring(math.random(10000000, 99999999)) .. os.time() end end return SHA256(deviceId) end -- 随机字符串生成 function getRandomString() return tostring(math.random(10000000, 99999999)) end function RC4(code, key) code = tostring(code) key = tostring(key) XINXIN = {} function XINXIN.__andBit(left, right) return (left == 1 and right == 1) and 1 or 0 end function XINXIN.__orBit(left, right) return (left == 1 or right == 1) and 1 or 0 end function XINXIN.__xorBit(left, right) return (left + right) == 1 and 1 or 0 end function XINXIN.__base(left, right, op) if left < right then left, right = right, left end local res = 0 local shift = 1 while left ~= 0 do local ra = left % 2 local rb = right % 2 res = shift * op(ra, rb) + res shift = shift * 2 left = math.modf(left / 2) right = math.modf(right / 2) end return res end function XINXIN.andOp(left, right) return XINXIN.__base(left, right, XINXIN.__andBit) end function XINXIN.xorOp(left, right) return XINXIN.__base(left, right, XINXIN.__xorBit) end function XINXIN.orOp(left, right) return XINXIN.__base(left, right, XINXIN.__orBit) end function XINXIN.notOp(left) return left > 0 and -(left + 1) or -left - 1 end function XINXIN.lShiftOp(left, num) return left * (2 ^ num) end function XINXIN.rShiftOp(left, num) return math.floor(left / (2 ^ num)) end function encrypt(text, key) local function KSA(key) local keyLen = string.len(key) local schedule = {} local keyByte = {} for i = 0, 255 do schedule[i] = i end for i = 1, keyLen do keyByte[i - 1] = string.byte(key, i, i) end local j = 0 for i = 0, 255 do j = (j + schedule[i] + keyByte[i % keyLen]) % 256 schedule[i], schedule[j] = schedule[j], schedule[i] end return schedule end local function PRGA(schedule, textLen) local i = 0 local j = 0 local k = {} for n = 1, textLen do i = (i + 1) % 256 j = (j + schedule[i]) % 256 schedule[i], schedule[j] = schedule[j], schedule[i] k[n] = schedule[(schedule[i] + schedule[j]) % 256] end return k end local function output(schedule, text) local len = string.len(text) local c = nil local res = {} for i = 1, len do c = string.byte(text, i, i) res[i] = string.char(XINXIN.xorOp(schedule[i], c)) end return table.concat(res) end local textLen = string.len(text) local schedule = KSA(key) local k = PRGA(schedule, textLen) return output(k, text) end return encrypt(code, key) end -- Base64编码解码 function Base64Convert(str, isEncrypt) str = tostring(str) if isEncrypt then local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' local bytes = {} for i = 1, #str do bytes[#bytes + 1] = str:byte(i) end local result = "" for i = 1, #bytes, 3 do local a, b, c = bytes[i], bytes[i+1], bytes[i+2] local n = (a or 0) * 0x10000 + (b or 0) * 0x100 + (c or 0) local b1 = math.floor(n / 262144) % 64 local b2 = math.floor(n / 4096) % 64 local b3 = math.floor(n / 64) % 64 local b4 = n % 64 result = result .. b64chars:sub(b1+1, b1+1) .. b64chars:sub(b2+1, b2+1) if b then result = result .. b64chars:sub(b3+1, b3+1) else result = result .. '=' end if c then result = result .. b64chars:sub(b4+1, b4+1) else result = result .. '=' end end return result else str = str:gsub("[^%w%+%/=]", "") local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' local result = "" for i = 1, #str, 4 do local chunk = str:sub(i, i+3) if #chunk == 0 then break end local values = {} for j = 1, 4 do local char = chunk:sub(j, j) if char == '=' then values[j] = nil else values[j] = b64chars:find(char) - 1 end end if values[1] and values[2] then local byte1 = (values[1] * 4) + math.floor(values[2] / 16) result = result .. string.char(byte1) if values[3] then local byte2 = ((values[2] % 16) * 16) + math.floor(values[3] / 4) result = result .. string.char(byte2) if values[4] then local byte3 = ((values[3] % 4) * 64) + values[4] result = result .. string.char(byte3) end end end end return result end end -- 参数加密 local function paramEncrypt(str) local rc4 = RC4(str, encryptKey) local base64 = Base64Convert(rc4, true) return base64 end -- 参数排序拼接 function sort_and_concat_params(params) local keys = {} for k, _ in pairs(params) do if k ~= "appId" then table.insert(keys, k) end end table.sort(keys) local param_str = "" for _, k in ipairs(keys) do if param_str ~= "" then param_str = param_str .. "&" end param_str = param_str .. k .. "=" .. tostring(params[k]) end return param_str end -- SHA256签名函数 function SHA256(str) str = tostring(str) local k = { 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298 } local h = { 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225 } local msg_len = #str local bit_len = msg_len * 8 str = str .. string.char(128) while (#str + 8) % 64 ~= 0 do str = str .. string.char(0) end for i = 7, 0, -1 do str = str .. string.char(bit32.band(bit32.rshift(bit_len, i * 8), 255)) end for chunk_start = 1, #str, 64 do local chunk = str:sub(chunk_start, chunk_start + 63) local w = {} for i = 0, 15 do local word = 0 for j = 1, 4 do word = bit32.lshift(word, 8) + chunk:byte((i * 4) + j) end w[i] = word end for i = 16, 63 do local s0 = bit32.bxor(bit32.bxor(bit32.rrotate(w[i-15], 7), bit32.rrotate(w[i-15], 18)), bit32.rshift(w[i-15], 3)) local s1 = bit32.bxor(bit32.bxor(bit32.rrotate(w[i-2], 17), bit32.rrotate(w[i-2], 19)), bit32.rshift(w[i-2], 10)) w[i] = (w[i-16] + s0 + w[i-7] + s1) % 4294967296 end local a, b, c, d, e, f, g, hh = h[1], h[2], h[3], h[4], h[5], h[6], h[7], h[8] for i = 0, 63 do local S1 = bit32.bxor(bit32.bxor(bit32.rrotate(e, 6), bit32.rrotate(e, 11)), bit32.rrotate(e, 25)) local ch = bit32.bxor(bit32.band(e, f), bit32.band(bit32.bnot(e), g)) local temp1 = (hh + S1 + ch + k[i+1] + w[i]) % 4294967296 local S0 = bit32.bxor(bit32.bxor(bit32.rrotate(a, 2), bit32.rrotate(a, 13)), bit32.rrotate(a, 22)) local maj = bit32.bxor(bit32.bxor(bit32.band(a, b), bit32.band(a, c)), bit32.band(b, c)) local temp2 = (S0 + maj) % 4294967296 hh = g g = f f = e e = (d + temp1) % 4294967296 d = c c = b b = a a = (temp1 + temp2) % 4294967296 end h[1] = (h[1] + a) % 4294967296 h[2] = (h[2] + b) % 4294967296 h[3] = (h[3] + c) % 4294967296 h[4] = (h[4] + d) % 4294967296 h[5] = (h[5] + e) % 4294967296 h[6] = (h[6] + f) % 4294967296 h[7] = (h[7] + g) % 4294967296 h[8] = (h[8] + hh) % 4294967296 end local result = "" for i = 1, 8 do result = result .. string.format("%08x", h[i]) end return result end -- 基础参数获取 local function getBaseParams() return { timestamp = os.time() * 1000, safeCode = getRandomString() } end -- 签名计算规则 local function goEncrypt(paramsMap) local baseMap = getBaseParams() local newTable = {} for k, v in pairs(paramsMap) do newTable[k] = v end for k, v in pairs(baseMap) do newTable[k] = v end local sortedParamsStr = sort_and_concat_params(newTable) newTable["signature"] = SHA256(sortedParamsStr .. appKey) local finalParams = {} for k, v in pairs(newTable) do if k ~= "appId" then finalParams[k] = v end end local paramsStr = sort_and_concat_params(finalParams) paramsStr = paramEncrypt(paramsStr) return "appId=" .. appId .. "¶ms=" .. paramsStr end -- RC4解密函数 function rc4_decrypt(key, ciphertext_base64) if not ciphertext_base64 or ciphertext_base64 == "" then return "" end local ciphertext = Base64Convert(ciphertext_base64, false) if ciphertext == "" then return "" end local function rc4_decrypt_core(key, ciphertext) local sbox = {} for i = 0, 255 do sbox[i] = i end local keylen = #key if keylen == 0 then return "" end local j = 0 for i = 0, 255 do j = (j + sbox[i] + key:byte((i % keylen) + 1)) % 256 sbox[i], sbox[j] = sbox[j], sbox[i] end local i, j = 0, 0 local plaintext = {} for k = 1, #ciphertext do i = (i + 1) % 256 j = (j + sbox[i]) % 256 sbox[i], sbox[j] = sbox[j], sbox[i] local keybyte = sbox[(sbox[i] + sbox[j]) % 256] plaintext[k] = string.char(bit32.bxor(ciphertext:byte(k), keybyte)) end return table.concat(plaintext) end return rc4_decrypt_core(key, ciphertext) end -- 时间戳验证响应处理 local function validateResponseTimestamp(jsonRes) if jsonRes and jsonRes.timestamp then return validateTimestamp(jsonRes.timestamp) end return true end -- 初始化存储目录 local function initStorageDir() local ok, err = pcall(function() os.execute("mkdir -p " .. SECURE_STORAGE_DIR) end) if not ok then local testFile = io.open(SECURE_STORAGE_DIR .. "test.tmp", "w") if testFile then testFile:close() os.remove(SECURE_STORAGE_DIR .. "test.tmp") else SECURE_STORAGE_DIR = "/storage/emulated/0/" end end end initStorageDir() local function writeConfig(configData) local filePath = SECURE_STORAGE_DIR .. CONFIG_FILE_NAME local ok, file = pcall(io.open, filePath, "w") if not ok or not file then filePath = "/storage/emulated/0/" .. CONFIG_FILE_NAME ok, file = pcall(io.open, filePath, "w") if not ok or not file then return false end end local jsonData = json.encode(configData) local encryptedData = RC4(jsonData, encryptKey .. "_config_salt") file:write(encryptedData) file:close() return true end local function readConfig() local filePath = SECURE_STORAGE_DIR .. CONFIG_FILE_NAME local ok, file = pcall(io.open, filePath, "r") if not ok or not file then filePath = "/storage/emulated/0/" .. CONFIG_FILE_NAME ok, file = pcall(io.open, filePath, "r") if not ok or not file then return {} end end local encryptedData = file:read("*all") file:close() if encryptedData == "" then return {} end local success, jsonData = pcall(RC4, encryptedData, encryptKey .. "_config_salt") if not success then return {} end local success2, configData = pcall(json.decode, jsonData) if not success2 then return {} end return configData or {} end local function getMac() local config = readConfig() if config.mac then return config.mac end return nil end -- 保存机器码 local function saveMac(mac) local config = readConfig() config.mac = mac return writeConfig(config) end -- 卡密存储 local function saveCard(card) local config = readConfig() config.card = card return writeConfig(config) end local function getCard() local config = readConfig() return config.card or "" end -- 自动登录状态存储 local function saveAutoLogin(isEnable, isUserChecked, isUserRejected) local config = readConfig() if type(config.autoLogin) ~= "table" then config.autoLogin = {} end config.autoLogin.enable = isEnable config.autoLogin.checked = isUserChecked config.autoLogin.rejected = isUserRejected return writeConfig(config) end local function getAutoLoginStatus() local config = readConfig() if not config.autoLogin or type(config.autoLogin) ~= "table" then return false, false, false end return config.autoLogin.enable or false, config.autoLogin.checked or false, config.autoLogin.rejected or false end -- 清除卡密 local function clearCard() local config = readConfig() config.card = nil if type(config.autoLogin) ~= "table" then config.autoLogin = {} end config.autoLogin.enable = false config.autoLogin.checked = false config.autoLogin.rejected = false return writeConfig(config) end -- 清除所有配置(解绑时使用) local function clearAllConfig() local filePath = SECURE_STORAGE_DIR .. CONFIG_FILE_NAME local success1 = pcall(os.remove, filePath) filePath = "/storage/emulated/0/" .. CONFIG_FILE_NAME local success2 = pcall(os.remove, filePath) return success1 or success2 end local function isProtocolDomainAvailable(protocolDomain) local testParams = { safeCode = getRandomString() } local encryptStr = goEncrypt(testParams) local fullUrl = protocolDomain .. "/api/expand/new-ver?" .. encryptStr local ok, response = pcall(http, fullUrl) if not ok or not response then return false end local responseContent = tostring(response.content) if responseContent == "" then return false end local blockKeywords = { "屏蔽", "拦截", "禁止访问", "404 Not Found", "502 Bad Gateway", "503 Service Unavailable" } for _, keyword in ipairs(blockKeywords) do if string.find(responseContent, keyword) then return false end end local decryptStr = rc4_decrypt(encryptKey, responseContent) local success, jsonRes = pcall(json.decode, decryptStr) return success and jsonRes and jsonRes.code == 1 end local function switchToAvailableDomain() if isDomainInitialized then return true end local foundAvailable = false local availableDomainIndex = 0 local availableProtocolDomain = "" for i, domain in ipairs(DOMAINS) do local protocolDomains = completeDomainProtocol(domain) for _, protoDomain in ipairs(protocolDomains) do if isProtocolDomainAvailable(protoDomain) then currentDomain = protoDomain foundAvailable = true availableDomainIndex = i availableProtocolDomain = protoDomain isDomainInitialized = true break end end if foundAvailable then break end end if foundAvailable then return true else return false end end local function enhancedDomainCheck() if not switchToAvailableDomain() then local testParams = { safeCode = getRandomString() } local encryptStr = goEncrypt(testParams) local testUrl = currentDomain .. "/api/expand/new-ver?" .. encryptStr local ok, response = pcall(http, testUrl) if not ok or not response then gg.alert("网络连接失败,请检查网络设置") return false end local responseContent = tostring(response.content) if responseContent == "" then gg.alert("服务器无响应,请稍后重试") return false end local decryptStr = rc4_decrypt(encryptKey, responseContent) if decryptStr == "" then gg.alert("签名验证失败,请检查加密配置") return false end local success, jsonRes = pcall(json.decode, decryptStr) if not success or not jsonRes then local errorInfo = "服务器链接失败" if decryptStr and decryptStr ~= "" then if decryptStr:find("{") and decryptStr:find("}") then errorInfo = errorInfo .. "\n请检查后台配置是否正确配\n将接口管理,接口安全配置修改为\nRC4对称加密,Base64编码" else errorInfo = errorInfo .. "\n服务器正在维护\n请稍后进行重试,或者联系管理员" end end gg.alert(errorInfo) return false end if jsonRes.code and jsonRes.msg then gg.alert("签名计算有误\n请检查后台配置\n将接口管理,接口安全改为\n签名方式:SHA256\n签名计算规则:方法二\n时间戳验证:30000") else gg.alert("服务器响应异常") end return false end return true end local function enhancedMultiDomainRequest(apiPath, encryptStr) if not isDomainInitialized then if not switchToAvailableDomain() then return nil end end local fullUrl = currentDomain .. apiPath .. "?" .. encryptStr local ok, response = pcall(http, fullUrl) if not ok or not response then return nil end local responseContent = tostring(response.content) if responseContent == "" then return nil end local decryptStr = rc4_decrypt(encryptKey, responseContent) if not decryptStr or decryptStr == "" then return nil end local success, jsonRes = pcall(json.decode, decryptStr) if not success then return nil end if not validateResponseTimestamp(jsonRes) then return nil end return jsonRes end -- 获取应用状态函数 local function getAppStatus() if not enhancedDomainCheck() then return nil end local paramsMap = { safeCode = getRandomString(), timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/expand/app-status", encryptStr) return jsonRes end -- 正确判断应用模式 local function isFreeMode() local appStatus = getAppStatus() if appStatus and appStatus.code == 1 then -- 免费模式 if appStatus.msg and (appStatus.msg:find("免费模式") or appStatus.msg:find("免费")) then return true end -- 检查data字段中的模式标识 if appStatus.data then if type(appStatus.data) == "table" then for _, item in ipairs(appStatus.data) do if item.values and tostring(item.values):find("免费") then return true end if item.mark and tostring(item.mark):find("免费") then return true end end elseif type(appStatus.data) == "string" and appStatus.data:find("免费") then return true end end end return false end -- 获取单码信息接口 local function getCardInfo(card) if not enhancedDomainCheck() then return nil end local paramsMap = { card = card, safeCode = getRandomString(), timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/single/info", encryptStr) return jsonRes end -- 解绑逻辑:根据后台配置处理设备验证 local function unbind(card) if not card or card == "" then gg.alert("请输入卡密进行解绑") return false end -- 取卡密信息,确认绑定状态 local cardInfo = getCardInfo(card) if not cardInfo or cardInfo.code ~= 1 then gg.alert("获取卡密信息失败,无法进行解绑操作") return false end -- 检查卡密是否已绑定设备 local boundMac = cardInfo.data and cardInfo.data.mac or "" if not boundMac or boundMac == "" then gg.alert("该卡密未绑定任何设备,无需解绑") return false end local currentMac = getMac() if not currentMac then currentMac = generateAndroidDeviceMac() saveMac(currentMac) end -- 处理解绑逻辑 local paramsMap = { safeCode = getRandomString(), card = card, newMac = "", timestamp = os.time() * 1000 } -- 判断是否需要验证原设备:采用智能处理:先尝试不传originalMac,如果失败再尝试传originalMac local function tryUnbind(withOriginalMac, originalMacValue) local tempParams = {} for k, v in pairs(paramsMap) do tempParams[k] = v end if withOriginalMac and originalMacValue and originalMacValue ~= "" then tempParams.originalMac = originalMacValue end local encryptStr = goEncrypt(tempParams) local jsonRes = enhancedMultiDomainRequest("/api/single/unbind", encryptStr) return jsonRes end -- 不传originalMac(假设后台允许其他设备解绑) local jsonRes = tryUnbind(false, nil) -- 如果返回特定错误码,说明需要验证原设备 if jsonRes and jsonRes.code == -10010 then -- 检查当前设备是否是绑定的设备 if currentMac ~= boundMac then local choice = gg.alert("只能在绑定的设备上解绑!", "确定") return false end -- 传入originalMac(验证原设备) jsonRes = tryUnbind(true, boundMac) end -- 处理解绑结果 if jsonRes and jsonRes.code == 1 then if jsonRes.msg ~= "应用当前为免费模式" then gg.alert(jsonRes.msg .. "\n您可以在其他设备进行重新登录。") clearAllConfig() -- 清除本地配置 return true else gg.alert("当前应用为免费模式无需解绑") end elseif jsonRes then local errorMsg = "解绑失败:\n" .. jsonRes.msg if jsonRes.code == -10009 then errorMsg = errorMsg .. "\n可能原因:该应用不允许解绑操作" elseif jsonRes.code == -10010 then errorMsg = errorMsg .. "\n可能原因:只能在原设备解绑" end gg.alert(errorMsg) else gg.alert("解绑失败:网络请求异常") end return false end -- 优化后的登录逻辑 local function login(card, isUserCheckedAutoLogin) -- 收费模式 if not card or card == "" then saveAutoLogin(false, false, true) return 0, "卡密不能为空" end local currentMac = getMac() if not currentMac then currentMac = generateAndroidDeviceMac() saveMac(currentMac) end local paramsMap = { card = card, safeCode = getRandomString(), mac = currentMac, timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/single/login", encryptStr) if jsonRes and jsonRes.code == 1 then saveCard(card) local popupContent = "" local callback = nil if jsonRes.data and jsonRes.data.endTime then popupContent = string.format("登录成功!\n到期时间为:%s", jsonRes.data.endTime) else popupContent = "登录成功!" end if isUserCheckedAutoLogin then callback = gg.alert(popupContent, "确定", "取消自动登录") else callback = gg.alert(popupContent, "确定") end local finalEnable = false local finalChecked = false local finalRejected = false if isUserCheckedAutoLogin then if callback ~= nil and callback == 2 then finalEnable = false finalChecked = true finalRejected = true else finalEnable = true finalChecked = true finalRejected = false end else finalEnable = false finalChecked = false finalRejected = true end saveAutoLogin(finalEnable, finalChecked, finalRejected) return 1, "登录成功" elseif jsonRes then saveAutoLogin(false, false, true) return 0, "登录失败:" .. jsonRes.msg else saveAutoLogin(false, false, true) return 0, "登录失败:网络请求异常" end end -- 改进的主流程控制函数 local function main() if not enhancedDomainCheck() then os.exit(0) end -- 先检测应用模式 local freeMode = isFreeMode() if freeMode then gg.alert("当前为免费模式") return 1, "免费模式" end local input = {} local savedCard = getCard() local isAutoLoginEnable, isAutoLoginChecked, isUserRejected = getAutoLoginStatus() if savedCard and savedCard ~= "" then input[1] = savedCard end if isAutoLoginEnable and isAutoLoginChecked and not isUserRejected and savedCard ~= "" then gg.alert("正在自动登录...") local loginResult, loginMsg = login(savedCard, true) if loginResult == 1 then return 1, "自动登录成功" else gg.alert("自动登录失败:" .. loginMsg .. "\n请手动登录") saveAutoLogin(false, false, true) end end -- 循环输入,直到登录成功或用户取消 while true do local defaultAutoLogin = isAutoLoginEnable and not isUserRejected if shopAddr == nil or shopAddr == "" then input = gg.prompt({ "请输入卡密", "自动登录", "解绑卡密" }, { input[1] or "", defaultAutoLogin, false }, { "text", "checkbox", "checkbox" }) else input = gg.prompt({ "请输入卡密", "自动登录", "解绑卡密", "复制购卡地址" }, { input[1] or "", defaultAutoLogin, false, false }, { "text", "checkbox", "checkbox", "checkbox" }) end if input == nil then return 0, "用户取消登录" end if input[2] and input[3] then gg.alert("不可同时选中\"自动登录\"和\"解绑卡密\"") -- 重新输入 goto continue end if input[3] then local result = unbind(input[1]) if result then -- 解绑后清空输入框 input[1] = "" end -- 解绑后继续登录流程 goto continue end if input[4] then gg.alert("已复制购卡地址") gg.copyText(shopAddr) -- 复制地址后继续登录流程 goto continue end local loginResult, loginMsg = login(input[1], input[2]) if loginResult == 1 then return 1, loginMsg else gg.alert(loginMsg .. "\n请重新输入卡密") -- 登录失败,继续循环 end ::continue:: end end -- 公告获取 local function getNotice() if not enhancedDomainCheck() then return end local paramsMap = { variableId = noticeId, safeCode = getRandomString(), timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/expand/variable", encryptStr) if jsonRes and jsonRes.code == 1 then if jsonRes.data and jsonRes.data.content then gg.alert("系统公告:\n" .. jsonRes.data.content) end end end -- 店铺地址获取 local function getShop() if not enhancedDomainCheck() then return end local paramsMap = { safeCode = getRandomString(), variableId = shopId, timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/expand/variable", encryptStr) if jsonRes and jsonRes.code == 1 then if jsonRes.data and jsonRes.data.content then shopAddr = jsonRes.data.content end end end -- 版本检查 local function checkVersion() if not enhancedDomainCheck() then return end local paramsMap = { safeCode = getRandomString(), timestamp = os.time() * 1000 } local encryptStr = goEncrypt(paramsMap) local jsonRes = enhancedMultiDomainRequest("/api/expand/new-ver", encryptStr) if jsonRes and jsonRes.code == 1 then if jsonRes.data and jsonRes.data.num and jsonRes.data.num ~= version then if jsonRes.data.forced == 0 then local result = gg.alert("最新版:" .. (jsonRes.data.name or "") .. "\n" .. (jsonRes.data.content or ""), "前往更新", "晚些再说") if result == 1 then gg.copyText(jsonRes.data.addr or "") gg.alert("已为您复制更新地址,请打开浏览器访问") end else while true do local result = gg.alert("强制更新 最新版:" .. (jsonRes.data.name or "") .. "\n" .. (jsonRes.data.content or ""), "前往更新", "退出脚本") if result == 1 then gg.copyText(jsonRes.data.addr or "") gg.alert("已为您复制更新下载地址,请打开浏览器访问\n更新完成后重新启动脚本") os.exit(0) elseif result == 2 then os.exit(0) end end end end end end -- JSON编解码库(完整代码) local encode local escape_char_map = { ["\\"] = "\\", ["\""] = "\"", ["\b"] = "b", ["\f"] = "f", ["\n"] = "n", ["\r"] = "r", ["\t"] = "t", } local escape_char_map_inv = { ["/"] = "/" } for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end local function escape_char(c) return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) end local function encode_nil(val) return "null" end local function encode_table(val, stack) local res = {} stack = stack or {} if stack[val] then error("circular reference") end stack[val] = true if rawget(val, 1) ~= nil or next(val) == nil then local n = 0 for k in pairs(val) do if type(k) ~= "number" then error("invalid table: mixed or invalid key types") end n = n + 1 end if n ~= #val then error("invalid table: sparse array") end for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end stack[val] = nil return "[" .. table.concat(res, ",") .. "]" else for k, v in pairs(val) do if type(k) ~= "string" then error("invalid table: mixed or invalid key types") end table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) end stack[val] = nil return "{" .. table.concat(res, ",") .. "}" end end local function encode_string(val) return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' end local function encode_number(val) if val ~= val or val <= -math.huge or val >= math.huge then error("unexpected number value '" .. tostring(val) .. "'") end return string.format("%.14g", val) end local type_func_map = { ["nil"] = encode_nil, ["table"] = encode_table, ["string"] = encode_string, ["number"] = encode_number, ["boolean"] = tostring, } encode = function(val, stack) local t = type(val) local f = type_func_map[t] if f then return f(val, stack) end error("unexpected type '" .. t .. "'") end function json.encode(val) return (encode(val)) end local parse local function create_set(...) local res = {} for i = 1, select("#", ...) do res[select(i, ...)] = true end return res end local space_chars = create_set(" ", "\t", "\r", "\n") local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") local literals = create_set("true", "false", "null") local literal_map = { ["true"] = true, ["false"] = false, ["null"] = nil, } local function next_char(str, idx, set, negate) for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end return #str + 1 end local function decode_error(str, idx, msg) local line_count = 1 local col_count = 1 for i = 1, idx - 1 do col_count = col_count + 1 if str:sub(i, i) == "\n" then line_count = line_count + 1 col_count = 1 end end error(string.format("%s at line %d col %d", msg, line_count, col_count)) end local function codepoint_to_utf8(n) local f = math.floor if n <= 127 then return string.char(n) elseif n <= 2047 then return string.char(f(n / 64) + 192, n % 64 + 128) elseif n <= 65535 then return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) elseif n <= 1114111 then return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) end error(string.format("invalid unicode codepoint '%x'", n)) end local function parse_unicode_escape(s) local n1 = tonumber(s:sub(1, 4), 16) local n2 = tonumber(s:sub(7, 10), 16) if n2 then return codepoint_to_utf8((n1 - 55296) * 1024 + (n2 - 56320) + 65536) else return codepoint_to_utf8(n1) end end local function parse_string(str, i) local res = "" local j = i + 1 local k = j while j <= #str do local x = str:byte(j) if x < 32 then decode_error(str, j, "control character in string") elseif x == 92 then res = res .. str:sub(k, j - 1) j = j + 1 local c = str:sub(j, j) if c == "u" then local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) or str:match("^%x%x%x%x", j + 1) or decode_error(str, j - 1, "invalid unicode escape in string") res = res .. parse_unicode_escape(hex) j = j + #hex else if not escape_chars[c] then decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string") end res = res .. escape_char_map_inv[c] end k = j + 1 elseif x == 34 then res = res .. str:sub(k, j - 1) return res, j + 1 end j = j + 1 end decode_error(str, i, "expected closing quote for string") end local function parse_number(str, i) local x = next_char(str, i, delim_chars) local s = str:sub(i, x - 1) local n = tonumber(s) if not n then decode_error(str, i, "invalid number '" .. s .. "'") end return n, x end local function parse_literal(str, i) local x = next_char(str, i, delim_chars) local word = str:sub(i, x - 1) if not literals[word] then decode_error(str, i, "invalid literal '" .. word .. "'") end return literal_map[word], x end local function parse_array(str, i) local res = {} local n = 1 i = i + 1 while 1 do local x i = next_char(str, i, space_chars, true) if str:sub(i, i) == "]" then i = i + 1 break end x, i = parse(str, i) res[n] = x n = n + 1 i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "]" then break end if chr ~= "," then decode_error(str, i, "expected ']'或','") end end return res, i end local function parse_object(str, i) local res = {} i = i + 1 while 1 do local key, val i = next_char(str, i, space_chars, true) if str:sub(i, i) == "}" then i = i + 1 break end if str:sub(i, i) ~= '"' then decode_error(str, i, "expected string for key") end key, i = parse(str, i) i = next_char(str, i, space_chars, true) if str:sub(i, i) ~= ":" then decode_error(str, i, "expected ':' after key") end i = next_char(str, i + 1, space_chars, true) val, i = parse(str, i) res[key] = val i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "}" then break end if chr ~= "," then decode_error(str, i, "expected '}'或','") end end return res, i end local char_func_map = { ['"'] = parse_string, ["0"] = parse_number, ["1"] = parse_number, ["2"] = parse_number, ["3"] = parse_number, ["4"] = parse_number, ["5"] = parse_number, ["6"] = parse_number, ["7"] = parse_number, ["8"] = parse_number, ["9"] = parse_number, ["-"] = parse_number, ["t"] = parse_literal, ["f"] = parse_literal, ["n"] = parse_literal, ["["] = parse_array, ["{"] = parse_object, } parse = function(str, idx) local chr = str:sub(idx, idx) local f = char_func_map[chr] if f then return f(str, idx) end decode_error(str, idx, "unexpected character '" .. chr .. "'") end function json.decode(str) if type(str) ~= "string" then error("expected argument of type string, got " .. type(str)) end local res, idx = parse(str, next_char(str, 1, space_chars, true)) idx = next_char(str, idx, space_chars, true) if idx <= #str then decode_error(str, idx, "trailing garbage") end return res end -- 主执行流程 if enhancedDomainCheck() then checkVersion() getNotice() getShop() local authResult, authMsg = main() if authResult == 1 then local success, err = pcall(developerMainScript) if not success then gg.alert("脚本执行出错:" .. tostring(err)) end else if authMsg and authMsg ~= "用户取消登录" then gg.alert(authMsg .. "\n脚本停止运行") end os.exit(0) end else os.exit(0) end --[[Welcome to Dluae]] -- ==================== 悬浮窗系统(稳定版) ==================== import "android.app.*" import "android.os.*" import "android.widget.*" import "android.view.*" import "android.content.*" import "android.graphics.drawable.*" import "android.graphics.PixelFormat" import "android.animation.ObjectAnimator" import "android.view.animation.DecelerateInterpolator" import "android.graphics.Typeface" import "android.graphics.drawable.GradientDrawable" TEXT_open = 0xFFFF57B0 TEXT_close = 0xFFFFFFFF BG_COLOR = 0xFF3B3C40 BORDER_close = 0xFF2B2D2F BORDER_width = 8 CORNER_RADIUS = 15 context = activity windowManager = context.getSystemService("window") allSwitches = {} -- ==================== 新增:模式切换全局变量 ==================== PC_MODE_ENABLED = false -- 电脑模式(特征码) MOBILE_MODE_ENABLED = false -- 手机模式(指针) -- ==================== 新增:泳池体力修改 ==================== local POOL_ENERGY_ADDRS = nil -- 存储修改过的地址 function createRoundRectBg(fillColor, borderColor, borderWidth, cornerRadius) local shape = GradientDrawable() shape.setShape(GradientDrawable.RECTANGLE) shape.setColor(fillColor) shape.setCornerRadius(cornerRadius) shape.setStroke(borderWidth, borderColor) return shape end function clickAnimation(view) local anim1 = ObjectAnimator.ofFloat(view, "scaleX", 1.2, 0.8, 1.1, 0.9, 1.0) local anim2 = ObjectAnimator.ofFloat(view, "scaleY", 1.2, 0.8, 1.1, 0.9, 1.0) anim1.setDuration(500) anim2.setDuration(500) anim1.start() anim2.start() end function getLayoutParams() local LayoutParams = WindowManager.LayoutParams local layoutParams = luajava.new(LayoutParams) if (Build.VERSION.SDK_INT >= 26) then layoutParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY else layoutParams.type = LayoutParams.TYPE_PHONE end layoutParams.format = PixelFormat.RGBA_8888 layoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE layoutParams.gravity = Gravity.CENTER layoutParams.width = LayoutParams.WRAP_CONTENT layoutParams.height = LayoutParams.WRAP_CONTENT return layoutParams end function showFloatingNotify(title, msg) luajava.runOnUiThread(function() if Inform and Inform.showSuccessNotification_Simplicity then Inform.showSuccessNotification_Simplicity(nil, title, msg, 2000) else toast.black(title .. ":" .. msg, 1) end end) end function createSwitch(name, onFunction, offFunction) local switch = {} local isActive = false local layoutParams = getLayoutParams() layoutParams.x = math.random(200, 500) layoutParams.y = math.random(30, 200) local switchLayout = { LinearLayout; layout_height="fill"; layout_width="fill"; { TextView; layout_width="150"; layout_height="70"; id="switch_" .. name; text=name; textColor=TEXT_close; textSize="13"; gravity="center"; background=createRoundRectBg(BG_COLOR, BORDER_close, BORDER_width, CORNER_RADIUS); padding="8"; typeface=Typeface.DEFAULT_BOLD; }; } local switchView = loadlayout(switchLayout) local textView = switchView.getChildAt(0) local initialX, initialY = 0, 0 local initialTouchX, initialTouchY = 0, 0 switchView.setOnTouchListener(View.OnTouchListener{ onTouch=function(v, event) local action = event.getAction() if action == MotionEvent.ACTION_DOWN then initialX = layoutParams.x initialY = layoutParams.y initialTouchX = event.getRawX() initialTouchY = event.getRawY() return true elseif action == MotionEvent.ACTION_MOVE then local deltaX = event.getRawX() - initialTouchX local deltaY = event.getRawY() - initialTouchY layoutParams.x = initialX + deltaX layoutParams.y = initialY + deltaY windowManager.updateViewLayout(switchView, layoutParams) return true elseif action == MotionEvent.ACTION_UP then local moveDistance = math.sqrt( math.pow(event.getRawX() - initialTouchX, 2) + math.pow(event.getRawY() - initialTouchY, 2) ) if moveDistance < 50 then if isActive then textView.setTextColor(TEXT_close) textView.setBackground(createRoundRectBg(BG_COLOR, BORDER_close, BORDER_width, CORNER_RADIUS)) isActive = false if offFunction then thread(function() local ok, err = pcall(offFunction) if not ok then showFloatingNotify(name, "关闭出错: " .. tostring(err)) else showFloatingNotify(name, "已关闭") end end) else showFloatingNotify(name, "已关闭") end else textView.setTextColor(TEXT_open) textView.setBackground(createRoundRectBg(BG_COLOR, TEXT_open, BORDER_width, CORNER_RADIUS)) isActive = true if onFunction then thread(function() local ok, err = pcall(onFunction) if not ok then showFloatingNotify(name, "开启出错: " .. tostring(err)) else showFloatingNotify(name, "已开启") end end) else showFloatingNotify(name, "已开启") end end clickAnimation(textView) end return true end return false end }) function switch.show() if not switchView:isAttachedToWindow() then windowManager.addView(switchView, layoutParams) clickAnimation(textView) end end function switch.hide() if switchView:isAttachedToWindow() then windowManager.removeView(switchView) end end function switch.setState(state) if state then textView.setTextColor(TEXT_open) textView.setBackground(createRoundRectBg(BG_COLOR, TEXT_open, BORDER_width, CORNER_RADIUS)) isActive = true else textView.setTextColor(TEXT_close) textView.setBackground(createRoundRectBg(BG_COLOR, BORDER_close, BORDER_width, CORNER_RADIUS)) isActive = false end end function switch.getState() return isActive end allSwitches[name] = switch return switch end -- 悬浮窗绑定功能(原有) function createLeftCrystalSwitch() return createSwitch("秒左", function() Zuilong_LeftKill_On() end, function() end) end function createRightCrystalSwitch() return createSwitch("秒右", function() Zuilong_RightKill_On() end, function() end) end function createPerspectiveSwitch() return createSwitch("透视", function() ModelPenetration_On() end, function() ModelPenetration_Off() end) end function createGatherSwitch() return createSwitch("聚怪", function() Zuilong_Gather_On() end, function() Zuilong_Gather_Off() end) end function createStepSwitch() return createSwitch("穿图", function() StepByStep_Enable() end, function() StepByStep_Disable() end) end -- ==================== 新增:电脑模式(特征码)开关 ==================== function createPCSwitch() return createSwitch( "电脑模式", function() PC_MODE_ENABLED = true showCloudNotify("模式切换", "电脑模式(特征码)已开启", true) end, function() PC_MODE_ENABLED = false showCloudNotify("模式切换", "电脑模式(特征码)已关闭", true) end ) end -- ==================== 新增:手机模式(指针)开关 ==================== function createMobileSwitch() return createSwitch( "手机模式", function() MOBILE_MODE_ENABLED = true showCloudNotify("模式切换", "手机模式(指针)已开启", true) end, function() MOBILE_MODE_ENABLED = false showCloudNotify("模式切换", "手机模式(指针)已关闭", true) end ) end local leftSwitch, rightSwitch, perspectiveSwitch, gatherSwitch, stepSwitch, pcSwitch, mobileSwitch = nil, nil, nil, nil, nil, nil, nil function initAllSwitches() leftSwitch = createLeftCrystalSwitch() rightSwitch = createRightCrystalSwitch() perspectiveSwitch = createPerspectiveSwitch() gatherSwitch = createGatherSwitch() stepSwitch = createStepSwitch() pcSwitch = createPCSwitch() mobileSwitch = createMobileSwitch() end function showSwitch(switchName) luajava.runOnUiThread(function() local s = allSwitches[switchName] if s then s.show() end end) end function hideSwitch(switchName) luajava.runOnUiThread(function() local s = allSwitches[switchName] if s then s.hide() end end) end function hideAllSwitches() luajava.runOnUiThread(function() for _, s in pairs(allSwitches) do if s and s.hide then s.hide() end end end) end function allshowSwitches() luajava.runOnUiThread(function() for _, s in pairs(allSwitches) do if s and s.show then s.show() end end end) end -- ==================== 云通知初始化 ==================== loadYunLuaGroup("5C3C4E3813681C4C204C35346F1B4C2F7EFF612D2B22176FF346535E1C0B1E493339036EE15318") function init() stab = _ENV["分页"]; ttitle = _ENV["标题"]; xfcpic = _ENV["悬浮窗图标"] end local Cloud_Note_Url = 'https://sharechain.qq.com/bb8dfff6a3346b24f73fe7c626ae6ec7' local function getCloudContent() local response = gg.makeRequest(Cloud_Note_Url) if not response or not response.content then return nil,nil,nil,"网络错误" end local note_content = response.content:match('"html_content":"(.-)",') if not note_content then return nil,nil,nil,"QQ收藏格式错误" end note_content = note_content:gsub("\\u003C","<"):gsub("\\u003E",">"):gsub("\\u003Cbr%s*/?%s*\\u003E","\n"):gsub("
","\n"):gsub("
",""):gsub(" "," ") local announcement = note_content:match("【公告】(.-)【公告】") local notification = note_content:match("【通知】(.-)【通知】") local qqGroupKey = note_content:match("【joinQQGroup】(.-)【joinQQGroup】") if announcement then announcement = announcement:gsub("<.->",""):gsub("^%s+",""):gsub("%s+$","") end if notification then notification = notification:gsub("<.->",""):gsub("^%s+",""):gsub("%s+$","") end if qqGroupKey then qqGroupKey = qqGroupKey:gsub("<.->",""):gsub("%s+","") end return announcement, notification, qqGroupKey end local announcement, notification, qqGroupKey = getCloudContent() elgg.import("toast") elgg.import("AlGui") import "android.graphics.drawable.GradientDrawable" import "android.widget.LinearLayout" import "android.view.LayoutInflater" import "android.widget.TextView" import "android.widget.Button" import "java.util.Locale" import "android.view.Gravity" import "android.graphics.Typeface" import "irene.window.algui.AlGuiData" import "android.view.animation.Animation" import "irene.window.algui.AlGuiDialogBox" import "irene.window.algui.AlGuiSoundEffect" import "irene.window.algui.AlGuiWindowView" import "irene.window.algui.Tools.VariousTools" local neonColors = { [0]=0xFFff00cc, [1]=0xFFffcc00, [2]=0xFF00ffcc, [3]=0xFFff0066 } luajava.runOnUiThread(function() if AlGui.algui then AlGui.algui.clearBall() AlGui.algui.clearMenu() AlGuiWindowView.clearAllViews(context) gui = AlGui.newGUI(context) else gui = AlGui.GUI(context) end if AlGuiBubbleNotification.bn then Inform = AlGuiBubbleNotification.newInform(context) else Inform = AlGuiBubbleNotification.Inform(context) end AlGuiWindowView.showNeonLightText(context, "YZ科技", neonColors, 15, nil, Gravity.START|Gravity.BOTTOM, 50, 100) end) function showCloudNotify(title, msg, isSuccess) luajava.runOnUiThread(function() if isSuccess then Inform.showSuccessNotification_Simplicity(nil, title, msg, 3000) else Inform.showMessageNotification_Simplicity(nil, title, msg, 3000) end end) end -- ==================== v2.2 视奸模式(单次执行,开关式) ==================== local SHIJIAN_BUSY = false -- 视奸模式 - 切磋(只改当前值为1的地址) function doQieCuo() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(1135494768, gg.TYPE_DWORD) local cnt = gg.getResultsCount() if cnt and cnt > 0 then local results = gg.getResults(math.min(cnt, 500)) local editList = {} for _, v in ipairs(results) do if v.address and v.address ~= 0 then local targetAddr = v.address + 408 local curVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}}) if curVal and curVal[1] and curVal[1].value == 1 then table.insert(editList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257}) end end end if #editList > 0 then gg.setValues(editList) end end gg.clearResults() end -- 视奸模式 - 状态(只改当前值为1的地址) function doZhuangTai() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(1223231026, gg.TYPE_DWORD) local cnt = gg.getResultsCount() if cnt and cnt > 0 then local results = gg.getResults(math.min(cnt, 500)) local editList = {} for _, v in ipairs(results) do if v.address and v.address ~= 0 then local targetAddr = v.address - 312 local curVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}}) if curVal and curVal[1] and curVal[1].value == 1 then table.insert(editList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257}) end end end if #editList > 0 then gg.setValues(editList) end end gg.clearResults() end -- 视奸模式 - 私聊(只改当前值为1的地址) function doSiLiao() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(-1670169661, gg.TYPE_DWORD) local cnt = gg.getResultsCount() if cnt and cnt > 0 then local results = gg.getResults(math.min(cnt, 500)) local editList = {} for _, v in ipairs(results) do if v.address and v.address ~= 0 then local targetAddr = v.address + 0x34 local curVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}}) if curVal and curVal[1] and curVal[1].value == 1 then table.insert(editList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257}) end end end if #editList > 0 then gg.setValues(editList) end end gg.clearResults() end function Shijian_On() if SHIJIAN_BUSY then showCloudNotify("视奸模式", "正在执行中,请稍后...", false) return end SHIJIAN_BUSY = true showCloudNotify("视奸模式", "正在执行...", false) doQieCuo() doZhuangTai() doSiLiao() showCloudNotify("视奸模式", "执行完成", true) SHIJIAN_BUSY = false end function Shijian_Off() showCloudNotify("视奸模式", "无需关闭,再次开启可重新执行", false) end -- ============ 通用变量声明 ============ local LAST_MODIFY_DATA = nil local LAST_SEARCH_VALUE = nil local LAST_MODIFY_COUNT = 0 local sj = {} local LOOP_INTERVAL = 4 local IS_LOOP_ACTIVE = false local TERRAIN_LOOP_ACTIVE = false local TERRAIN_LOOP_INTERVAL = 4 local GLOBAL_SPEED_DATA = nil local GLOBAL_SPEED_MULTIPLIER = 3.0 local GAME_SPEED_ACTIVE = false local GAME_SPEED_VALUE = 3.0 local GAME_SPEED_TIMER = nil local zuilong_gather_data = nil local step_active = false local BUDDHA_LIGHT_DATA = nil local BUDDHA_LIGHT_ACTIVE = false local INFINITE_JUMP_ACTIVE = false local INFINITE_JUMP_LIST = nil local MONKEY_INVINCIBLE_KILL_DATA = nil local WUKONG_STRONG_REPLACE_ACTIVE = false local WUKONG_STRONG_REPLACE_VALUE = 8660 local WUKONG_STRONG_REPLACE_DATA = nil local MONKEY_SKILL_DATA = nil local FLAME_MOUNTAIN_DATA = nil local FLAME_MOUNTAIN_ID = 1032 local MODEL_PENETRATION_DATA = nil local ALL_NO_COOLDOWN_DATA = nil local NO_MANA_LIST_ITEMS = nil local ZUILONG_ROLE_INVINCIBLE_ACTIVE = false local ZUILONG_ROLE_INVINCIBLE_DATA = nil local MONSTER_FIX_ACTIVE = false local MONSTER_FIX_INTERVAL = 0.1 local POOL_MODIFY_ADDRS = nil local WHACK_A_MOLE_DATA = nil local WIDE_SCREEN_DATA = nil local SPEED_BUTTON_DATA = nil _72Bian_Active = false _72Bian_Data = {} _72Bian_TargetID = 40 local EAT_ZONGZI_DATA = nil local GM_DATA = nil local WaiZhuan64_GM_DATA = nil local SHUA_WENDIE_DATA = nil local ALL_INVINCIBLE_DATA = nil local leftRoleData = nil local rightRoleData = nil local leftRoleFeatureData = nil local rightRoleFeatureData = nil local SANSHENGCHUI_DATA = nil ALL_SECOND_KILL_LOOP_ACTIVE = false local MAI_DONGXI_ACTIVE = false local MAI_DONGXI_DATA = nil -- ==================== 外传64 GM 功能(开关式) ==================== function WaiZhuan64_GM_Enable() if WaiZhuan64_GM_DATA then return end gg.clearResults() search(101, 4, -2080896) if #sj == 0 then showCloudNotify("外传64 GM", "未找到特征值 101", false) gg.clearResults() return end py1(11, 4, -16) if #sj == 0 then showCloudNotify("外传64 GM", "筛选值 11 失败", false) gg.clearResults() return end py1(-425984, 4, 172) if #sj == 0 then showCloudNotify("外传64 GM", "筛选值 -425984 失败", false) gg.clearResults() return end local modifyList = {} local recordList = {} for _, v in ipairs(sj) do local targetAddr = v.address + 168 local orig = gg.getValues({{address = targetAddr, flags = 4}})[1].value table.insert(recordList, {address = targetAddr, flags = 4, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = 4, value = 0}) end if #modifyList == 0 then showCloudNotify("外传64 GM", "无有效修改项", false) gg.clearResults() return end gg.setValues(modifyList) WaiZhuan64_GM_DATA = recordList gg.clearResults() end function WaiZhuan64_GM_Disable() if not WaiZhuan64_GM_DATA then return end local restoreList = {} for _, item in ipairs(WaiZhuan64_GM_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) WaiZhuan64_GM_DATA = nil end function GM_On_Internal() gg.clearResults() search(101, 4, 4) if #sj == 0 then showCloudNotify("GM模式", "未找到特征值 101", false) return end py1(11, 4, -16) if #sj == 0 then showCloudNotify("GM模式", "筛选值 11 失败", false) return end py1(-425984, 4, 172) if #sj == 0 then showCloudNotify("GM模式", "筛选值 -425984 失败", false) return end local modifyList = {} local recordList = {} for _, v in ipairs(sj) do local targetAddr = v.address + 168 local orig = gg.getValues({{address = targetAddr, flags = 4}})[1].value table.insert(recordList, {address = targetAddr, flags = 4, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = 4, value = 0}) end if #modifyList == 0 then showCloudNotify("GM模式", "无有效修改项", false) return end gg.setValues(modifyList) GM_DATA = recordList gg.clearResults() end function GM_Off_Internal() if not GM_DATA then return end local restoreList = {} for _, item in ipairs(GM_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) GM_DATA = nil end function GM_On() if GM_DATA or WaiZhuan64_GM_DATA then showCloudNotify("GM模式", "已开启,无需重复操作", false) return end WaiZhuan64_GM_Enable() GM_On_Internal() if GM_DATA or WaiZhuan64_GM_DATA then showCloudNotify("GM模式", "已开启(外传64 + 原版)", true) else showCloudNotify("GM模式", "开启失败,请检查环境", false) end end function GM_Off() if not GM_DATA and not WaiZhuan64_GM_DATA then showCloudNotify("GM模式", "未开启,无需关闭", false) return end WaiZhuan64_GM_Disable() GM_Off_Internal() showCloudNotify("GM模式", "已关闭(已恢复两个GM)", true) end -- ==================== 卖道具功能(自定义输入,写值-1) ==================== function MaiDongXi_On() if MAI_DONGXI_ACTIVE then showCloudNotify("卖道具", "已开启,无需重复操作", false) return end gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.clearResults() -- 搜索特征值 -425984 gg.searchNumber("-425984", gg.TYPE_DWORD) local results = gg.getResults(gg.getResultsCount()) if results == nil or #results == 0 then showCloudNotify("卖道具", "未找到匹配结果", false) gg.clearResults() return end -- 批量读取偏移20和24的值 local readList = {} for i, v in ipairs(results) do table.insert(readList, {address = v.address + 20, flags = gg.TYPE_DWORD}) table.insert(readList, {address = v.address + 24, flags = gg.TYPE_DWORD}) end local readValues = gg.getValues(readList) if not readValues then showCloudNotify("卖道具", "读取内存失败", false) gg.clearResults() return end -- 验证条件 local validAddresses = {} for i = 1, #results do local idx20 = (i - 1) * 2 + 1 local idx24 = (i - 1) * 2 + 2 local val20 = readValues[idx20] and readValues[idx20].value local val24 = readValues[idx24] and readValues[idx24].value if val20 and val24 then if val20 >= 1 and val20 <= 30 and val24 == -491520 then table.insert(validAddresses, results[i].address) end end end gg.clearResults() if #validAddresses == 0 then showCloudNotify("卖道具", "未找到符合条件的地址", false) return end -- 弹出输入框让用户输入自定义数值 local input = gg.prompt( { "请输入要修改的值(将自动写入 输入值-1):" }, { [1] = "1" }, { [1] = "number" } ) if input == nil then showCloudNotify("卖道具", "已取消", false) return end local userInput = tonumber(input[1]) if userInput == nil then showCloudNotify("卖道具", "输入无效,请输入数字", false) return end -- 写入值为 用户输入的值 - 1 local modifyValue = userInput - 1 local setList = {} local recordList = {} for _, addr in ipairs(validAddresses) do local targetAddr = addr + 20 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(recordList, {address = targetAddr, flags = gg.TYPE_DWORD, originalValue = orig}) table.insert(setList, {address = targetAddr, flags = gg.TYPE_DWORD, value = modifyValue}) end gg.setValues(setList) MAI_DONGXI_ACTIVE = true MAI_DONGXI_DATA = recordList showCloudNotify("卖道具", string.format("已开启,共修改 %d 个地址,写入值: %d", #setList, modifyValue), true) end function MaiDongXi_Off() if not MAI_DONGXI_ACTIVE or not MAI_DONGXI_DATA then showCloudNotify("卖道具", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(MAI_DONGXI_DATA) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue }) end gg.setValues(restoreList) MAI_DONGXI_ACTIVE = false MAI_DONGXI_DATA = nil showCloudNotify("卖道具", "已关闭,数值已恢复", true) end function ShowMaiDongXiInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "卖道具使用说明", "1. 进入游戏商城或道具购买界面\n" .. "2. 开启本开关后输入自定义数值\n" .. "3. 脚本会自动搜索并验证条件(偏移20在[1,30]且偏移24为-491520)\n" .. "4. 将偏移20处的值修改为【您输入的值-1】\n\n" .. "示例:输入 5,则写入 4\n" .. "示例:输入 1,则写入 0\n\n" .. "⚠️ 注意:开关式功能,退出商城后建议关闭恢复", "知道了") end) end) end function EatZongzi_On() if EAT_ZONGZI_DATA then showCloudNotify("吃粽子刷分", "已开启,无需重复操作", false) return end gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber('4262', gg.TYPE_DWORD) local results = gg.getResults(gg.getResultCount()) if #results == 0 then showCloudNotify("吃粽子刷分", "未找到特征数据,请确保在粽子活动界面内", false) gg.clearResults() return end local targetList = {} local modifyList = {} for i, v in ipairs(results) do local check1 = gg.getValues({{address = v.address + 8, flags = gg.TYPE_DWORD}}) if check1[1].value == 4263 then local check2 = gg.getValues({{address = v.address + 16, flags = gg.TYPE_DWORD}}) if check2[1].value == 5 then local targetAddr = v.address - 16 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(targetList, { address = targetAddr, flags = gg.TYPE_DWORD, originalValue = orig }) table.insert(modifyList, { address = targetAddr, flags = gg.TYPE_DWORD, value = 211, freeze = true }) end end end if #modifyList == 0 then showCloudNotify("吃粽子刷分", "未找到符合条件的地址", false) gg.clearResults() return end gg.addListItems(modifyList) gg.setValues(modifyList) EAT_ZONGZI_DATA = targetList showCloudNotify("吃粽子刷分", "已开启(撞一次桌子得211分,建议刷到2000分即停)", true) gg.clearResults() end function EatZongzi_Off() if not EAT_ZONGZI_DATA then showCloudNotify("吃粽子刷分", "未开启,无需关闭", false) return end local listItems = gg.getListItems() for _, item in ipairs(EAT_ZONGZI_DATA) do for _, li in ipairs(listItems) do if li.address == item.address then gg.removeListItems({li}) break end end end local restoreList = {} for _, item in ipairs(EAT_ZONGZI_DATA) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue }) end gg.setValues(restoreList) EAT_ZONGZI_DATA = nil showCloudNotify("吃粽子刷分", "已关闭,数值已恢复", true) end function ShowEatZongziInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "吃粽子刷分使用说明", "1. 进入游戏,打开粽子活动界面\n2. 点击暂停按钮(进入暂停状态)\n3. 开启本开关\n4. 撞一次桌子即可获得211分\n5. 累计达到2000分即可拿满奖励,请勿刷太高(否则可能被检测)\n\n⚠️ 注意:退出后记得关闭,不然会闪退。", "知道了") end) end) end -- ==================== 泳池修改(单向,每次开启重新执行,基于140特征,写值40) ==================== function PoolModify_On() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.clearResults() gg.searchNumber(140, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) local results = gg.getResults(gg.getResultsCount()) if #results == 0 then showCloudNotify("泳池修改", "未搜索到,请确保在泳池活动关卡内", false) return end local valid_addrs = {} for _, r in ipairs(results) do local addr = r.address local vals = gg.getValues({ {address = addr - 28, flags = gg.TYPE_DWORD}, {address = addr - 36, flags = gg.TYPE_DWORD} }) if vals and #vals == 2 and vals[1].value and vals[2].value then if vals[1].value == -491520 and vals[2].value == -491520 then table.insert(valid_addrs, addr) end end end if #valid_addrs == 0 then showCloudNotify("泳池修改", "未找到有效地址", false) return end local writes = {} for _, addr in ipairs(valid_addrs) do table.insert(writes, {address = addr - 40, value = 80, flags = gg.TYPE_DWORD}) end local write_results = gg.setValues(writes) local success_count = 0 if type(write_results) == "table" then for _, res in ipairs(write_results) do if res and res.result == true then success_count = success_count + 1 end end elseif write_results == true then success_count = #writes else success_count = 0 end gg.clearResults() if success_count > 0 then showCloudNotify("泳池修改", string.format("开启成功,修改了 %d (可再次开启重复执行)", success_count), true) else showCloudNotify("泳池修改", "写入失败,请检查权限或游戏保护", false) end end function PoolModify_Off() showCloudNotify("泳池修改", "此功能为单向修改,无需关闭(退出关卡后数值恢复)", false) end function ShowPoolModifyInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "泳池修改使用说明", "1. 进入泳池活动关卡\n2. 暂停游戏(建议暂停后操作)\n3. 改分数为:点击「开启」修改分数为 800\n4. 改体力为:开启时体力变为无限,关闭后立即结算(建议先开体力再改分数)\n\n⚠️ 注意:进泳池后10s内暂停开启,最佳时间为进图后5s。", "知道了") end) end) end -- ==================== 刷成就(单次执行,点击即生效,无需关闭) ==================== function Achievement_Once() gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("500", gg.TYPE_DWORD) local results = gg.getResults(9999999) if #results == 0 then showCloudNotify("刷成就", "未搜索到特征数据,请确保在游戏关卡内", false) gg.clearResults() return end local validAddresses = {} for i, v in ipairs(results) do local reads = { {address = v.address - 560, flags = gg.TYPE_DWORD}, {address = v.address - 72, flags = gg.TYPE_DWORD}, {address = v.address - 496, flags = gg.TYPE_DWORD} } local values = gg.getValues(reads) if values and #values == 3 then if values[1].value == 1 and values[2].value == 1 and values[3].value == 40 then table.insert(validAddresses, v) end end if i % 500 == 0 then gg.sleep(0) end end if #validAddresses == 0 then showCloudNotify("刷成就", "未找到符合条件的地址", false) gg.clearResults() return end local modifyList = {} for _, v in ipairs(validAddresses) do local addr448 = v.address - 448 local addr432 = v.address - 432 local addr408 = v.address - 408 local addr148 = v.address - 328 local addr352 = v.address - 352 table.insert(modifyList, {address = addr448, flags = gg.TYPE_DWORD, value = 100}) table.insert(modifyList, {address = addr432, flags = gg.TYPE_DWORD, value = 100}) table.insert(modifyList, {address = addr408, flags = gg.TYPE_DWORD, value = 5}) table.insert(modifyList, {address = addr148, flags = gg.TYPE_DWORD, value = 40}) table.insert(modifyList, {address = addr352, flags = gg.TYPE_DWORD, value = 3}) end gg.setValues(modifyList) showCloudNotify("刷成就", "已执行(效果:MVP、助攻、野怪王子、斩龙)", true) gg.clearResults() end -- ==================== 内存操作函数 ==================== function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc = gg.REGION_C_ALLOC | gg.REGION_OTHER end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,536870912,dz1,dz2) local sl = gg.getResultCount() if sl~=0 then sj = gg.getResults(sl) gg.clearResults() else showCloudNotify("提示","未找到结果",false) end end end end function py1(value,lx,py) if #sj~=nil then local z1={} local z2={} for i=1,#sj do z1[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].value==value then z2[#z2+1]=sj[i] end end sj=z2 else showCloudNotify("提示","没有搜索结果",false) end end function xg1(value,lx,py,dj) if #sj~=nil then local z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end else showCloudNotify("提示","没有可修改的结果",false) end 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 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 end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end -- ==================== 稳定秒过 ==================== function StableInstantPass() gg.clearResults() local extendedRanges = gg.REGION_C_ALLOC | gg.REGION_OTHER | gg.REGION_ANONYMOUS gg.setRanges(extendedRanges) gg.searchNumber("900000", gg.TYPE_DWORD) local cnt = gg.getResultCount() if cnt > 0 then local results = gg.getResults(cnt) local addrs = {} for i, v in ipairs(results) do addrs[i] = {address = v.address + 80, flags = gg.TYPE_DWORD} end local vals = gg.getValues(addrs) local filtered = {} for i, val in ipairs(vals) do if val.value == 700 then table.insert(filtered, results[i]) end end if #filtered > 0 then local modifyList = {} for _, v in ipairs(filtered) do table.insert(modifyList, {address = v.address - 312, flags = gg.TYPE_DWORD, value = 0}) table.insert(modifyList, {address = v.address - 268, flags = gg.TYPE_DWORD, value = 0}) table.insert(modifyList, {address = v.address - 24, flags = gg.TYPE_DWORD, value = 1}) table.insert(modifyList, {address = v.address - 248, flags = gg.TYPE_DWORD, value = 0}) table.insert(modifyList, {address = v.address - 272, flags = gg.TYPE_DWORD, value = 1}) table.insert(modifyList, {address = v.address - 152, flags = gg.TYPE_DWORD, value = 1}) table.insert(modifyList, {address = v.address, flags = gg.TYPE_DWORD, value = 2000000}) end gg.setValues(modifyList) end end gg.clearResults() search(-121, 4, extendedRanges) if #sj > 0 then py1(-127, 4, 8) py1(-125, 4, 16) py1(-127, 4, -8) py1(-125, 4, -208) py1(-125, 4, -240) py1(-127, 4, -264) if #sj > 0 then xg1(0, 4, -244, false) xg1(0, 4, -212, false) xg1(1, 4, -116, false) xg1(1, 4, -236, false) end end gg.clearResults() search(-294912, 4, extendedRanges) if #sj > 0 then py1(-491520, 4, 8) py1(-425984, 4, 16) py1(-491520, 4, -8) py1(-425984, 4, -208) py1(-425984, 4, -240) py1(-491520, 4, -264) xg1(0, 4, -244, false) xg1(0, 4, -212, false) xg1(1, 4, -116, false) xg1(1, 4, -236, false) end gg.clearResults() end function TerrainIgnorePass() StableInstantPass() showCloudNotify("无视地形秒过","增强版已执行(必定触发入侵奖励)",true) end function SetTerrainLoopInterval() local input = gg.prompt({"请输入循环间隔时间(秒):"},{tostring(TERRAIN_LOOP_INTERVAL)},{"number"}) if input and input[1] then local interval = tonumber(input[1]) if interval and interval > 0 then TERRAIN_LOOP_INTERVAL = interval showCloudNotify("设置","间隔已设为"..interval.."秒",true) else showCloudNotify("错误","请输入正数",false) end else showCloudNotify("提示","已取消",false) end end function StartLoopTerrainIgnorePass() if TERRAIN_LOOP_ACTIVE then showCloudNotify("提示","循环已在运行",false) return end TERRAIN_LOOP_ACTIVE = true showCloudNotify("无视地形循环","已开启,间隔"..TERRAIN_LOOP_INTERVAL.."秒",true) local loop_thread = function() while TERRAIN_LOOP_ACTIVE do StableInstantPass() if TERRAIN_LOOP_ACTIVE then local start_time = os.time() while os.time() - start_time < TERRAIN_LOOP_INTERVAL and TERRAIN_LOOP_ACTIVE do gg.sleep(1000) end end end showCloudNotify("无视地形循环","已停止",true) end pcall(loop_thread) end function StopLoopTerrainIgnorePass() if not TERRAIN_LOOP_ACTIVE then showCloudNotify("提示","循环未运行",false) return end TERRAIN_LOOP_ACTIVE = false showCloudNotify("无视地形循环","已停止",true) end function InstantPass() gg.clearResults() search(8000,4) py1(-1,4,48) py1(10,4,24) xg1(9000,4,56,true) search(900000,4) py1(700,4,80) xg1(0,4,-312,false) xg1(0,4,-268,false) xg1(1,4,-24,false) xg1(0,4,-248,false) xg1(1,4,-272,false) xg1(1,4,-152,false) xg1(2000000,4,0,false) gg.clearResults() showCloudNotify("秒过","单次秒过成功",true) end function SetLoopInterval() local input = gg.prompt({"请输入循环间隔时间(秒):"},{tostring(LOOP_INTERVAL)},{"number"}) if input and input[1] then local interval = tonumber(input[1]) if interval and interval > 0 then LOOP_INTERVAL = interval showCloudNotify("设置","间隔已设为"..interval.."秒",true) else showCloudNotify("错误","请输入正数",false) end else showCloudNotify("提示","已取消",false) end end function StartLoopInstantPass() if IS_LOOP_ACTIVE then showCloudNotify("提示","循环已在运行",false) return end IS_LOOP_ACTIVE = true showCloudNotify("秒过循环","已开启,间隔"..LOOP_INTERVAL.."秒",true) local loop_thread = function() while IS_LOOP_ACTIVE do gg.clearResults() search(8000,4) py1(-1,4,48) py1(10,4,24) xg1(9000,4,56,true) search(900000,4) py1(700,4,80) xg1(0,4,-312,false) xg1(0,4,-268,false) xg1(1,4,-24,false) xg1(0,4,-248,false) xg1(1,4,-272,false) xg1(1,4,-152,false) xg1(2000000,4,0,false) gg.clearResults() if IS_LOOP_ACTIVE then local start_time = os.time() while os.time() - start_time < LOOP_INTERVAL and IS_LOOP_ACTIVE do gg.sleep(1000) end end end showCloudNotify("秒过循环","已停止",true) end pcall(loop_thread) end function StopLoopInstantPass() if not IS_LOOP_ACTIVE then showCloudNotify("提示","循环未运行",false) return end IS_LOOP_ACTIVE = false showCloudNotify("秒过循环","已停止",true) end -- 万能修改 function UniversalModify() local searchValue = gg.prompt({"请输入要搜索的值:"},{"100.0"},{"number"}) if searchValue == nil then showCloudNotify("万能修改","已取消",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC|gg.REGION_OTHER) gg.searchNumber(searchValue[1], gg.TYPE_DOUBLE) local results = gg.getResults(10000) local resultCount = #results if resultCount == 0 then showCloudNotify("万能修改","未找到匹配数值",false) return end local modifyCountInput = gg.prompt({"请输入要修改的数量(1-"..resultCount.."):"},{tostring(math.min(150, resultCount))},{"number"}) if modifyCountInput == nil then showCloudNotify("万能修改","已取消",false) return end local modifyCount = tonumber(modifyCountInput[1]) if modifyCount < 1 or modifyCount > resultCount then modifyCount = math.min(150, resultCount) end local selectedResults = {} for i = 1, modifyCount do selectedResults[i] = results[i] end local newValue = gg.prompt({"请输入新数值:"},{"999.0"},{"number"}) if newValue == nil then showCloudNotify("万能修改","已取消",false) return end local actionChoice = gg.choice({"✅仅修改数值","❄️修改并冻结","🚫取消"},nil,"请选择操作方式:") if actionChoice == nil or actionChoice == 3 then showCloudNotify("万能修改","已取消",false) return end local originalData = {} for i = 1, modifyCount do originalData[i] = {address = selectedResults[i].address, originalValue = selectedResults[i].value, frozen = (actionChoice == 2)} end for i = 1, modifyCount do selectedResults[i].value = tonumber(newValue[1]) if actionChoice == 2 then selectedResults[i].freeze = true else selectedResults[i].freeze = false end end gg.setValues(selectedResults) if actionChoice == 2 then gg.addListItems(selectedResults) end LAST_MODIFY_DATA = originalData LAST_SEARCH_VALUE = tonumber(searchValue[1]) LAST_MODIFY_COUNT = modifyCount local actionText = {"修改","修改并冻结"} showCloudNotify("万能修改","成功"..actionText[actionChoice]..modifyCount.."个数值",true) end function RestoreLastModify() if LAST_MODIFY_DATA == nil then showCloudNotify("恢复","没有可恢复的记录",false) return end local choice = gg.choice({"✅确认恢复","❌取消"},nil,"恢复上次修改?") if choice == 1 then local restoreResults = {} for i = 1, #LAST_MODIFY_DATA do restoreResults[i] = {address = LAST_MODIFY_DATA[i].address, value = LAST_MODIFY_DATA[i].originalValue, flags = gg.TYPE_DOUBLE, freeze = false} end gg.setValues(restoreResults) local frozenItems = gg.getListItems() if #frozenItems > 0 then for i = 1, #frozenItems do for j = 1, #LAST_MODIFY_DATA do if frozenItems[i].address == LAST_MODIFY_DATA[j].address then gg.removeListItems({frozenItems[i]}) break end end end end showCloudNotify("恢复","已恢复"..LAST_MODIFY_COUNT.."个数值",true) LAST_MODIFY_DATA = nil else showCloudNotify("恢复","已取消",false) end end function ShowUniversalModifyInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "万能修改攻略", "八戒第四次普攻提高伤害(图内开):2.1\n有效值(修改人物属性魔抗等):0.008 0.002 0.013 0.001 0.05", "知道了") end) end) end -- 穿图 function StepByStep_Enable() gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC|gg.REGION_OTHER) local function simpleSearch(v,t) gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC|gg.REGION_OTHER) gg.searchNumber(v,t) return gg.getResultsCount() end local function editAll(v,t) local r = gg.getResults(gg.getResultsCount()) for i=1,#r do r[i].value=v r[i].freeze=false end gg.setValues(r) return #r end if simpleSearch("0.1",gg.TYPE_FLOAT)>0 then editAll("-999",gg.TYPE_FLOAT) step_active = true showCloudNotify("穿图","已开启",true) else showCloudNotify("穿图","开启失败",false) end gg.clearResults() end function StepByStep_Disable() gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC|gg.REGION_OTHER) local function simpleSearch(v,t) gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC|gg.REGION_OTHER) gg.searchNumber(v,t) return gg.getResultsCount() end local function editAll(v,t) local r = gg.getResults(gg.getResultsCount()) for i=1,#r do r[i].value=v r[i].freeze=false end gg.setValues(r) return #r end if simpleSearch("-999",gg.TYPE_FLOAT)>0 then editAll("0.1",gg.TYPE_FLOAT) step_active = false showCloudNotify("穿图","已关闭",true) else showCloudNotify("穿图","关闭失败",false) end gg.clearResults() end -- 内购三生锤 function InternalBloodsucker() gg.clearResults() gg.setRanges(gg.REGION_OTHER) -- 仅搜索 other 区 -- 特征码数据(基于您提供的文件) local MAIN_VAL = 2260 local SUB1_VAL = 2270 local SUB2_VAL = 1362 local OFF_SUB1 = 0x4C0 local OFF_SUB2 = 0x500 local OFF_TARGET = 0x340 -- 搜索主特征码 gg.searchNumber(MAIN_VAL, gg.TYPE_DWORD) local cnt = gg.getResultCount() if cnt == 0 then showCloudNotify("内购三生锤", "未找到主特征码 2260", false) gg.clearResults() return end local results = gg.getResults(cnt) local modifyList = {} local validCount = 0 for _, v in ipairs(results) do -- 验证副特征码1和2 local check = gg.getValues({ {address = v.address + OFF_SUB1, flags = gg.TYPE_DWORD}, {address = v.address + OFF_SUB2, flags = gg.TYPE_DWORD} }) if check[1].value == SUB1_VAL and check[2].value == SUB2_VAL then local targetAddr = v.address + OFF_TARGET table.insert(modifyList, { address = targetAddr, flags = gg.TYPE_DWORD, value = -99999999 }) validCount = validCount + 1 end end if #modifyList > 0 then gg.setValues(modifyList) showCloudNotify("内购三生锤", "开启成功,修改 " .. #modifyList .. " 处", true) else showCloudNotify("内购三生锤", "未找到同时匹配副特征码的地址", false) end gg.clearResults() end -- ==================== 法宝秒怪 ==================== local function modifyFabaosearch(targetValue, newValue) gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(tostring(targetValue), gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber(tostring(targetValue), gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100) gg.editAll(tostring(newValue), gg.TYPE_DWORD) showCloudNotify("法宝秒怪","开启成功",true) end function FaBao_ZhenHunXiaoYiJie() modifyFabaosearch(100310, 20786) end function FaBao_ZhenHunXiaoErJie() modifyFabaosearch(100320, 20786) end function FaBao_YunYangBanYiJie() modifyFabaosearch(100250, 20786) end function FaBao_YunYangBanErJie() modifyFabaosearch(100260, 20786) end function FaBao_KuYeLingYiJie() modifyFabaosearch(100160, 20786) end function FaBao_KuYeLingErJie() modifyFabaosearch(100170, 20786) end function FaBao_KuiHuaLanYiJie() modifyFabaosearch(100330, 20786) end function FaBao_KuiHuaLanErJie() modifyFabaosearch(100340, 20786) end -- ==================== v2.5 三生锤无敌属性(开关式) ==================== function SanShengChui_On() if SANSHENGCHUI_DATA then showCloudNotify("三生锤无敌属性", "已开启,无需重复操作", false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) local MAIN_VAL = 1070176665 local SUB1_VAL = 1069128089 local SUB2_VAL = 40 local OFF_SUB1 = 320 local OFF_SUB2 = 204 local BASE_OFF = 188 local STEP = 8 local COUNT = 12 local NEW_VAL = 99999 gg.searchNumber(MAIN_VAL, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1, 0) local cnt = gg.getResultsCount() if cnt == 0 then showCloudNotify("三生锤无敌属性", "未找到主特征码,请确认游戏内存区域", false) gg.clearResults() return end local results = gg.getResults(cnt) local targetAddrs = {} for _, r in ipairs(results) do local addr = r.address local check = gg.getValues({ { address = addr + OFF_SUB1, flags = gg.TYPE_DWORD }, { address = addr + OFF_SUB2, flags = gg.TYPE_DWORD } }) if check[1].value == SUB1_VAL and check[2].value == SUB2_VAL then table.insert(targetAddrs, addr) end end if #targetAddrs == 0 then showCloudNotify("三生锤无敌属性", "未找到同时匹配副特征码的地址,可能偏移或数值有变化", false) gg.clearResults() return end local setList = {} local saveList = {} local recordList = {} for _, baseAddr in ipairs(targetAddrs) do for i = 0, COUNT - 1 do local curAddr = baseAddr + BASE_OFF + i * STEP local orig = gg.getValues({{ address = curAddr, flags = gg.TYPE_DWORD }})[1].value table.insert(recordList, { address = curAddr, flags = gg.TYPE_DWORD, originalValue = orig }) local entry = { address = curAddr, flags = gg.TYPE_DWORD, value = NEW_VAL } table.insert(setList, entry) table.insert(saveList, entry) end end gg.setValues(setList) gg.addListItems(saveList) SANSHENGCHUI_DATA = recordList gg.clearResults() local total = #targetAddrs * COUNT showCloudNotify("三生锤无敌属性", string.format("已开启,修改 %d 个地址(%d 个主地址 × %d 个偏移),已保存至保存列表", total, #targetAddrs, COUNT), true) end function SanShengChui_Off() if not SANSHENGCHUI_DATA then showCloudNotify("三生锤无敌属性", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(SANSHENGCHUI_DATA) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue }) end gg.setValues(restoreList) local listItems = gg.getListItems() for _, item in ipairs(SANSHENGCHUI_DATA) do for _, li in ipairs(listItems) do if li.address == item.address and li.flags == item.flags then gg.removeListItems({ li }) break end end end SANSHENGCHUI_DATA = nil showCloudNotify("三生锤无敌属性", "已关闭,所有数值已恢复", true) end -- 游戏加速 function GameSpeed_On() if GAME_SPEED_ACTIVE then showCloudNotify("游戏加速","已开启",false) return end GAME_SPEED_ACTIVE = true gg.setSpeed(GAME_SPEED_VALUE) if GAME_SPEED_TIMER then gg.clearTimer(GAME_SPEED_TIMER) end GAME_SPEED_TIMER = gg.timer(2000, function() if GAME_SPEED_ACTIVE then gg.setSpeed(GAME_SPEED_VALUE) end end) showCloudNotify("游戏加速","已开启(倍速:"..GAME_SPEED_VALUE..")",true) end function GameSpeed_Off() if not GAME_SPEED_ACTIVE then showCloudNotify("游戏加速","未开启",false) return end GAME_SPEED_ACTIVE = false if GAME_SPEED_TIMER then gg.clearTimer(GAME_SPEED_TIMER) GAME_SPEED_TIMER = nil end gg.setSpeed(1.0) showCloudNotify("游戏加速","已关闭",true) end function SetGameSpeedValue() local input = gg.prompt({"请输入游戏加速倍速(建议1~5倍):"},{tostring(GAME_SPEED_VALUE)},{"number"}) if input == nil then showCloudNotify("设置","已取消",false) return end local newSpeed = tonumber(input[1]) if not newSpeed or newSpeed <= 0 then showCloudNotify("错误","倍速必须大于0",false) return end if newSpeed > 5 then local confirm = gg.choice({"继续使用","重新输入"},nil,"⚠️倍速超过5倍可能不稳定") if confirm == 2 or confirm == nil then return end end GAME_SPEED_VALUE = newSpeed if GAME_SPEED_ACTIVE then gg.setSpeed(GAME_SPEED_VALUE) showCloudNotify("游戏加速","倍速已更新为"..GAME_SPEED_VALUE.."倍",true) else showCloudNotify("游戏加速","倍速已保存为"..GAME_SPEED_VALUE.."倍",true) end end -- 全局加速 function SetGlobalSpeedMultiplier() local input = gg.prompt({"请输入全局加速倍速(建议1~6倍):"},{tostring(GLOBAL_SPEED_MULTIPLIER)},{"number"}) if input == nil then showCloudNotify("设置","已取消",false) return end local newSpeed = tonumber(input[1]) if not newSpeed or newSpeed <= 0 then showCloudNotify("错误","倍速必须大于0",false) return end if newSpeed > 6 then local confirm = gg.choice({"继续使用","重新输入"},nil,"⚠️倍速超过6倍可能不稳定") if confirm == 2 or confirm == nil then return end end GLOBAL_SPEED_MULTIPLIER = newSpeed if GLOBAL_SPEED_DATA then gg.setValues({{address = GLOBAL_SPEED_DATA.address, flags = GLOBAL_SPEED_DATA.flags, value = GLOBAL_SPEED_MULTIPLIER}}) showCloudNotify("全局加速","倍速已更新为"..GLOBAL_SPEED_MULTIPLIER.."倍",true) else showCloudNotify("全局加速","倍速已保存为"..GLOBAL_SPEED_MULTIPLIER.."倍",true) end end function GlobalSpeed_On() if GLOBAL_SPEED_DATA then showCloudNotify("全局加速","已开启",false) return end local t = {'libcocos2djs.so:bss', 'Cb'} local tt = {0xA4698, 0x118, 0x24} local ttt = S_Pointer(t, tt, true) if ttt == nil or ttt == "0x0" then showCloudNotify("全局加速","无法定位地址",false) return end local addr = tonumber(ttt) local flags = gg.TYPE_FLOAT local orig = gg.getValues({{address = addr, flags = flags}})[1].value GLOBAL_SPEED_DATA = {address = addr, flags = flags, originalValue = orig} gg.setValues({{address = addr, flags = flags, value = GLOBAL_SPEED_MULTIPLIER}}) showCloudNotify("全局加速","已开启(倍速:"..GLOBAL_SPEED_MULTIPLIER..")",true) end function GlobalSpeed_Off() if not GLOBAL_SPEED_DATA then showCloudNotify("全局加速","未开启",false) return end gg.setValues({{address = GLOBAL_SPEED_DATA.address, flags = GLOBAL_SPEED_DATA.flags, value = GLOBAL_SPEED_DATA.originalValue}}) GLOBAL_SPEED_DATA = nil showCloudNotify("全局加速","已关闭",true) end -- 猴子无敌秒 function MonkeyInvincibleKill_On() if MONKEY_INVINCIBLE_KILL_DATA then showCloudNotify("猴子无敌秒","已开启",false) return end gg.clearResults() local modifyList = {} local saveData = {} local extendedRanges = gg.REGION_C_ALLOC | gg.REGION_OTHER search(1074921472, 4, extendedRanges) if #sj == 0 then showCloudNotify("猴子无敌秒","未找到无敌特征",false) gg.clearResults() return end py1(-425984, 4, 8) if #sj == 0 then showCloudNotify("猴子无敌秒","无敌特征筛选失败",false) gg.clearResults() return end for _, v in ipairs(sj) do local targetAddr = v.address + 12 local orig = gg.getValues({{address = targetAddr, flags = 4}})[1].value table.insert(saveData, {address = targetAddr, flags = 4, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = 4, value = 1}) end search(1078198272, 4, extendedRanges) if #sj == 0 then showCloudNotify("猴子无敌秒","未找到秒杀特征",false) gg.clearResults() return end py1(-491520, 4, 8) if #sj == 0 then showCloudNotify("猴子无敌秒","秒杀特征筛选失败",false) gg.clearResults() return end for _, v in ipairs(sj) do local targetAddr = v.address + 4 local orig = gg.getValues({{address = targetAddr, flags = 4}})[1].value table.insert(saveData, {address = targetAddr, flags = 4, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = 4, value = 20786}) end if #modifyList == 0 then showCloudNotify("猴子无敌秒","未生成修改项",false) return end gg.setValues(modifyList) MONKEY_INVINCIBLE_KILL_DATA = saveData showCloudNotify("猴子无敌秒","已开启(无敌+秒杀)",true) gg.clearResults() end function MonkeyInvincibleKill_Off() if not MONKEY_INVINCIBLE_KILL_DATA then showCloudNotify("猴子无敌秒","未开启",false) return end local restoreList = {} for _, item in ipairs(MONKEY_INVINCIBLE_KILL_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) MONKEY_INVINCIBLE_KILL_DATA = nil showCloudNotify("猴子无敌秒","已关闭",true) gg.clearResults() end -- 悟空强普替换 function WukongStrongReplace_On() if WUKONG_STRONG_REPLACE_ACTIVE then showCloudNotify("悟空强普替换","已开启",false) return end gg.clearResults() search(1078198272, 4) if #sj == 0 then showCloudNotify("悟空强普替换","未找到特征数据",false) return end py1(1015, 4, 4) if #sj == 0 then showCloudNotify("悟空强普替换","未找到匹配的技能地址",false) return end local targetAddr = sj[1].address + 4 local orig = gg.getValues({{address = targetAddr, flags = 4}})[1].value local freezeItem = {address = targetAddr, flags = 4, value = WUKONG_STRONG_REPLACE_VALUE, freeze = true} gg.addListItems({freezeItem}) WUKONG_STRONG_REPLACE_DATA = {address = targetAddr, originalValue = orig, flags = 4} WUKONG_STRONG_REPLACE_ACTIVE = true showCloudNotify("悟空强普替换","已开启(技能代码:"..WUKONG_STRONG_REPLACE_VALUE..")",true) gg.clearResults() end function WukongStrongReplace_Off() if not WUKONG_STRONG_REPLACE_ACTIVE then showCloudNotify("悟空强普替换","未开启",false) return end if WUKONG_STRONG_REPLACE_DATA then local listItems = gg.getListItems() for _, li in ipairs(listItems) do if li.address == WUKONG_STRONG_REPLACE_DATA.address then gg.removeListItems({li}) break end end gg.setValues({{address = WUKONG_STRONG_REPLACE_DATA.address, flags = WUKONG_STRONG_REPLACE_DATA.flags, value = WUKONG_STRONG_REPLACE_DATA.originalValue}}) WUKONG_STRONG_REPLACE_DATA = nil end WUKONG_STRONG_REPLACE_ACTIVE = false showCloudNotify("悟空强普替换","已关闭",true) end function SetWukongStrongReplaceValue() local input = gg.prompt({"请输入技能代码(默认8660)"},{tostring(WUKONG_STRONG_REPLACE_VALUE)},{"number"}) if input == nil then showCloudNotify("设置","已取消",false) return end local newCode = tonumber(input[1]) if not newCode then showCloudNotify("错误","请输入有效数字",false) return end WUKONG_STRONG_REPLACE_VALUE = newCode showCloudNotify("悟空强普","技能代码已设置为"..newCode,true) if WUKONG_STRONG_REPLACE_ACTIVE then WukongStrongReplace_Off() WukongStrongReplace_On() end end -- 通天神猴 function MonkeySkillReplace_On() if MONKEY_SKILL_DATA then showCloudNotify("通天神猴","已开启",false) return end gg.clearResults() local modifyRecords = {} gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("942956337", gg.TYPE_DWORD) local cnt = gg.getResultCount() if cnt == 0 then showCloudNotify("通天神猴","未找到普攻特征",false) return end local results1 = gg.getResults(cnt) local filtered1 = {} for _, v in ipairs(results1) do local checkAddr = v.address + 4 local val = gg.getValues({{address = checkAddr, flags = 4}})[1].value if val == 12848 then filtered1[#filtered1 + 1] = v end end if #filtered1 == 0 then showCloudNotify("通天神猴","普攻特征筛选失败",false) return end local mods1 = { {offset = 400, newVal = 1735290740, flags = 4},{offset = 404, newVal = 1851877748, flags = 4}, {offset = 408, newVal = 1868654954, flags = 4},{offset = 412, newVal = 1601529978, flags = 4}, {offset = 416, newVal = 1818848115, flags = 4},{offset = 420, newVal = 13420, flags = 4}, {offset = 492, newVal = 22, flags = 4},{offset = 496, newVal = 1735290740, flags = 4}, {offset = 500, newVal = 1851877748, flags = 4},{offset = 504, newVal = 1868654954, flags = 4}, {offset = 508, newVal = 1601529978, flags = 4},{offset = 512, newVal = 1818848115, flags = 4}, {offset = 516, newVal = 13676, flags = 4},{offset = 588, newVal = 22, flags = 4}, {offset = 592, newVal = 2054516580, flags = 4},{offset = 596, newVal = 1936613736, flags = 4}, {offset = 600, newVal = 1735288168, flags = 4},{offset = 604, newVal = 1935634278, flags = 4}, {offset = 608, newVal = 1819044203, flags = 4},{offset = 612, newVal = 12849, flags = 4}, {offset = 684, newVal = 22, flags = 4},{offset = 688, newVal = 1634497125, flags = 4}, {offset = 692, newVal = 1752393582, flags = 4},{offset = 696, newVal = 1935634021, flags = 4}, {offset = 700, newVal = 1819044203, flags = 4},{offset = 704, newVal = 909336374, flags = 4}, {offset = 708, newVal = 12848, flags = 4},{offset = 780, newVal = 23, flags = 4}, {offset = 784, newVal = 1735290740, flags = 4},{offset = 788, newVal = 1851877748, flags = 4}, {offset = 792, newVal = 1868654954, flags = 4},{offset = 796, newVal = 1601529978, flags = 4}, {offset = 800, newVal = 1818848115, flags = 4},{offset = 804, newVal = 3158380, flags = 4}, {offset = 972, newVal = 17, flags = 4},{offset = 976, newVal = 1634497125, flags = 4}, {offset = 980, newVal = 1752393582, flags = 4},{offset = 984, newVal = 1935634021, flags = 4}, {offset = 988, newVal = 1819044203, flags = 4},{offset = 992, newVal = 50, flags = 4}, {offset = 996, newVal = 0, flags = 4},{offset = 396, newVal = 22, flags = 4}, } for _, r in ipairs(filtered1) do for _, m in ipairs(mods1) do local targetAddr = r.address + m.offset local orig = gg.getValues({{address = targetAddr, flags = m.flags}})[1].value table.insert(modifyRecords, {address = targetAddr, flags = m.flags, originalValue = orig}) gg.setValues({{address = targetAddr, flags = m.flags, value = m.newVal}}) end end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("909128031", gg.TYPE_DWORD) local cnt2 = gg.getResultCount() if cnt2 == 0 then showCloudNotify("通天神猴","未找到技能特征,普攻已改",false) for _, rec in ipairs(modifyRecords) do gg.setValues({{address = rec.address, flags = rec.flags, value = rec.originalValue}}) end return end local results2 = gg.getResults(cnt2) local filtered2 = {} for _, v in ipairs(results2) do local checkAddr = v.address - 4 local val = gg.getValues({{address = checkAddr, flags = 4}})[1].value if val == 862743657 then filtered2[#filtered2 + 1] = v end end if #filtered2 == 0 then showCloudNotify("通天神猴","技能特征筛选失败,普攻已改",false) for _, rec in ipairs(modifyRecords) do gg.setValues({{address = rec.address, flags = rec.flags, value = rec.originalValue}}) end return end local mods2 = { {offset = 112, newVal = 1735290740, flags = 4},{offset = 116, newVal = 1851877748, flags = 4}, {offset = 120, newVal = 1868654954, flags = 4},{offset = 124, newVal = 1601529978, flags = 4}, {offset = 128, newVal = 1818848115, flags = 4},{offset = 132, newVal = 3223916, flags = 4}, {offset = -372, newVal = 17, flags = 4},{offset = -368, newVal = 1702193516, flags = 4}, {offset = -364, newVal = 1936671346, flags = 4},{offset = -360, newVal = 1802723187, flags = 4}, {offset = -356, newVal = 829189225, flags = 4},{offset = -352, newVal = 48, flags = 4}, {offset = -348, newVal = 0, flags = 4},{offset = 108, newVal = 23, flags = 4}, } for _, r in ipairs(filtered2) do for _, m in ipairs(mods2) do local targetAddr = r.address + m.offset local orig = gg.getValues({{address = targetAddr, flags = m.flags}})[1].value table.insert(modifyRecords, {address = targetAddr, flags = m.flags, originalValue = orig}) gg.setValues({{address = targetAddr, flags = m.flags, value = m.newVal}}) end end if #modifyRecords == 0 then showCloudNotify("通天神猴","未生成修改项",false) return end MONKEY_SKILL_DATA = modifyRecords showCloudNotify("通天神猴","已开启(替换普攻+技能)",true) gg.clearResults() end function MonkeySkillReplace_Off() if not MONKEY_SKILL_DATA then showCloudNotify("通天神猴","未开启",false) return end local restoreList = {} for _, item in ipairs(MONKEY_SKILL_DATA) do restoreList[#restoreList + 1] = {address = item.address, flags = item.flags, value = item.originalValue} end gg.setValues(restoreList) MONKEY_SKILL_DATA = nil showCloudNotify("通天神猴","已关闭",true) gg.clearResults() end -- 模型透视 function ModelPenetration_On() if MODEL_PENETRATION_DATA then showCloudNotify("模型透视","已开启",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("876899620", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("模型透视","未找到特征",false) gg.clearResults() return end local results = gg.getResults(count) gg.clearResults() local filtered = {} local checkAddrs = {} for i, v in ipairs(results) do checkAddrs[i] = {address = v.address + 4, flags = gg.TYPE_DWORD} end local checkVals = gg.getValues(checkAddrs) for i, val in ipairs(checkVals) do if val.value == 0 then table.insert(filtered, results[i]) end end if #filtered == 0 then showCloudNotify("模型透视","特征匹配失败",false) return end local modifyList = {} local recordList = {} for _, addrInfo in ipairs(filtered) do local targetAddr = addrInfo.address + 52 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(recordList, {address = targetAddr, flags = gg.TYPE_DWORD, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257, freeze = true}) end gg.addListItems(modifyList) gg.setValues(modifyList) MODEL_PENETRATION_DATA = recordList showCloudNotify("模型透视","已开启,修改"..#modifyList.."处",true) end function ModelPenetration_Off() if not MODEL_PENETRATION_DATA then showCloudNotify("模型透视","未开启",false) return end local restoreList = {} for _, item in ipairs(MODEL_PENETRATION_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) local currentList = gg.getListItems() for _, item in ipairs(MODEL_PENETRATION_DATA) do for _, li in ipairs(currentList) do if li.address == item.address and li.flags == item.flags then gg.removeListItems({li}) break end end end MODEL_PENETRATION_DATA = nil showCloudNotify("模型透视","已关闭",true) gg.clearResults() end -- 全员技能无冷却 function AllNoCooldown_On() if ALL_NO_COOLDOWN_DATA then showCloudNotify("全员无冷却","已开启",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("2680", gg.TYPE_DWORD) local resultCount = gg.getResultCount() if resultCount == 0 then showCloudNotify("全员无冷却","未找到冷却特征",false) gg.clearResults() return end local results = gg.getResults(resultCount) local modifyList = {} local recordList = {} for _, v in ipairs(results) do local addr2680 = v.address local verifyAddr = addr2680 - 16 local verifyVal = gg.getValues({{address = verifyAddr, flags = gg.TYPE_DWORD}})[1].value if verifyVal == 1000 then local checkAddr = addr2680 + 24 local checkVal = gg.getValues({{address = checkAddr, flags = gg.TYPE_DWORD}})[1].value if checkVal == 4 then local targetAddr = addr2680 - 8 local origVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(recordList, {address = targetAddr, flags = gg.TYPE_DWORD, originalValue = origVal}) table.insert(modifyList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 0}) end end end if #modifyList == 0 then showCloudNotify("全员无冷却","没有满足条件的地址",false) gg.clearResults() return end gg.setValues(modifyList) ALL_NO_COOLDOWN_DATA = recordList showCloudNotify("全员无冷却","已开启,共修改"..#modifyList.."处",true) gg.clearResults() end function AllNoCooldown_Off() if not ALL_NO_COOLDOWN_DATA then showCloudNotify("全员无冷却","未开启",false) return end local restoreList = {} for _, item in ipairs(ALL_NO_COOLDOWN_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) ALL_NO_COOLDOWN_DATA = nil showCloudNotify("全员无冷却","已关闭",true) gg.clearResults() end -- 角色无蓝耗 function NoManaCost_On() if NO_MANA_LIST_ITEMS then showCloudNotify("无蓝耗","已开启",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("500", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("无蓝耗","未找到数据",false) gg.clearResults() return end local results = gg.getResults(count) gg.clearResults() local filters = {{"-425984", "12"}, {"-425984", "20"}, {"-425984", "28"}} for _, f in ipairs(filters) do local tmp = {} for _, v in ipairs(results) do tmp[#tmp+1] = {address = v.address + tonumber(f[2]), flags = gg.TYPE_DWORD} end tmp = gg.getValues(tmp) local filtered = {} for i, val in ipairs(tmp) do if tostring(val.value) == f[1] then filtered[#filtered+1] = results[i] end end results = filtered if #results == 0 then break end end if #results == 0 then showCloudNotify("无蓝耗","特征匹配失败",false) return end local itemsToAdd = {} local backup = {} for _, addrInfo in ipairs(results) do local targetAddr = addrInfo.address + 24 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(backup, {address = targetAddr, original = orig, flags = gg.TYPE_DWORD}) table.insert(itemsToAdd, {address = targetAddr, flags = gg.TYPE_DWORD, value = 1, freeze = false}) end local writeList = {} for _, item in ipairs(itemsToAdd) do writeList[#writeList+1] = {address = item.address, flags = item.flags, value = item.value} end gg.setValues(writeList) gg.addListItems(itemsToAdd) NO_MANA_LIST_ITEMS = {addedItems = itemsToAdd, backup = backup} showCloudNotify("无蓝耗","已开启,共"..#itemsToAdd.."项",true) gg.clearResults() end function NoManaCost_Off() if not NO_MANA_LIST_ITEMS then showCloudNotify("无蓝耗","未开启",false) return end local currentList = gg.getListItems() for _, added in ipairs(NO_MANA_LIST_ITEMS.addedItems) do for _, li in ipairs(currentList) do if li.address == added.address and li.flags == added.flags then gg.removeListItems({li}) break end end end local restoreList = {} for _, bk in ipairs(NO_MANA_LIST_ITEMS.backup) do restoreList[#restoreList+1] = {address = bk.address, flags = bk.flags, value = bk.original} end gg.setValues(restoreList) NO_MANA_LIST_ITEMS = nil showCloudNotify("无蓝耗","已关闭",true) end local function BothOn() NoManaCost_On() AllNoCooldown_On() end local function BothOff() NoManaCost_Off() AllNoCooldown_Off() end -- 坠龙角色无敌 function ZuilongRoleInvincible_On() if ZUILONG_ROLE_INVINCIBLE_ACTIVE then showCloudNotify("坠龙角色无敌","已开启",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("500", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("坠龙角色无敌","未找到特征",false) gg.clearResults() return end local results = gg.getResults(count) local validAddrs = {} local origData = {} for _, v in ipairs(results) do local addr = v.address local check = gg.getValues({ {address = addr + 4, flags = gg.TYPE_DWORD}, {address = addr - 4, flags = gg.TYPE_DWORD}, {address = addr - 76, flags = gg.TYPE_DWORD}, {address = addr + 12, flags = gg.TYPE_DWORD}, {address = addr - 12, flags = gg.TYPE_DWORD}, {address = addr - 16, flags = gg.TYPE_DWORD} }) local c1, c2, c3, c4, c5, c6 = check[1].value, check[2].value, check[3].value, check[4].value, check[5].value, check[6].value if c1 == -491520 and c2 == -262026 and c3 == -262026 and c4 == -425984 and c5 == -425984 and c6 == 0 then table.insert(validAddrs, addr) local targetAddr = addr + 16 local origVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(origData, {address = targetAddr, originalValue = origVal, flags = gg.TYPE_DWORD}) end end if #validAddrs == 0 then showCloudNotify("坠龙角色无敌","未找到满足条件的地址",false) gg.clearResults() return end local modifyList = {} for _, addr in ipairs(validAddrs) do table.insert(modifyList, {address = addr + 16, flags = gg.TYPE_DWORD, value = 1}) end gg.setValues(modifyList) ZUILONG_ROLE_INVINCIBLE_DATA = origData ZUILONG_ROLE_INVINCIBLE_ACTIVE = true showCloudNotify("坠龙角色无敌","已开启,共修改"..#modifyList.."处",true) gg.clearResults() end function ZuilongRoleInvincible_Off() if not ZUILONG_ROLE_INVINCIBLE_ACTIVE then showCloudNotify("坠龙角色无敌","未开启",false) return end if ZUILONG_ROLE_INVINCIBLE_DATA and #ZUILONG_ROLE_INVINCIBLE_DATA > 0 then local restoreList = {} for _, item in ipairs(ZUILONG_ROLE_INVINCIBLE_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) showCloudNotify("坠龙角色无敌","已关闭,已恢复"..#restoreList.."处",true) else showCloudNotify("坠龙角色无敌","未找到可恢复数据",false) end ZUILONG_ROLE_INVINCIBLE_ACTIVE = false ZUILONG_ROLE_INVINCIBLE_DATA = nil gg.clearResults() end -- 火焰山替换主线关卡(单次执行,保留开关,每次开启重新执行) function FlameMountain_On() gg.clearResults() local modifyList = {} local ranges = gg.REGION_C_ALLOC | gg.REGION_OTHER gg.setRanges(ranges) -- 搜索特征 9010 gg.searchNumber("9010", gg.TYPE_DWORD) local cnt1 = gg.getResultCount() if cnt1 > 0 then local results1 = gg.getResults(cnt1) for _, v in ipairs(results1) do local addr = v.address local val1 = gg.getValues({{address = addr + 4, flags = gg.TYPE_DWORD}})[1].value if val1 == -491520 then local val2 = gg.getValues({{address = addr + 16, flags = gg.TYPE_DWORD}})[1].value if val2 == -1 then local val3 = gg.getValues({{address = addr + 20, flags = gg.TYPE_DWORD}})[1].value if val3 == -491520 then table.insert(modifyList, {address = addr, flags = gg.TYPE_DWORD, value = FLAME_MOUNTAIN_ID}) end end end end end -- 搜索特征 3005 gg.clearResults() gg.setRanges(ranges) gg.searchNumber("3005", gg.TYPE_DWORD) local cnt2 = gg.getResultCount() if cnt2 > 0 then local results2 = gg.getResults(cnt2) for _, v in ipairs(results2) do local addr = v.address local val1 = gg.getValues({{address = addr + 4, flags = gg.TYPE_DWORD}})[1].value if val1 == -491520 then local val2 = gg.getValues({{address = addr + 16, flags = gg.TYPE_DWORD}})[1].value if val2 == -1 then local val3 = gg.getValues({{address = addr + 20, flags = gg.TYPE_DWORD}})[1].value if val3 == -491520 then table.insert(modifyList, {address = addr, flags = gg.TYPE_DWORD, value = FLAME_MOUNTAIN_ID}) end end end end end if #modifyList == 0 then showCloudNotify("火焰山替换", "未找到组队特征,请确保在组队界面开启", false) gg.clearResults() return end gg.setValues(modifyList) gg.clearResults() showCloudNotify("火焰山替换", string.format("已执行,修改 %d 处,关卡ID: %d(可重复开启)", #modifyList, FLAME_MOUNTAIN_ID), true) end function FlameMountain_Off() -- 单次执行功能,关闭时不恢复数据 showCloudNotify("火焰山替换", "单次执行功能,关闭无影响(再次开启可重新执行)", false) end function SetFlameMountainID() local input = gg.prompt({"请输入关卡ID(默认1032代表火焰山)"},{tostring(FLAME_MOUNTAIN_ID)},{"number"}) if input == nil then showCloudNotify("设置","已取消",false) return end local newID = tonumber(input[1]) if not newID then showCloudNotify("错误","请输入有效数字",false) return end FLAME_MOUNTAIN_ID = newID showCloudNotify("火焰山","关卡ID已设置为 "..newID..",请重新开启开关生效",true) end -- 坠龙聚怪、秒水晶 function Zuilong_Gather_On() if zuilong_gather_data then showCloudNotify("聚怪","已开启",false) return end gg.clearResults() search(2139095040,4) if #sj == 0 then showCloudNotify("聚怪","未找到聚怪数据",false) return end py1(1065353216,4,-8) py1(1065353216,4,-4) py1(0,4,4) py1(0,4,8) py1(0,4,12) xg1(1222,16,20,true) xg1(3563,16,16,true) local records = {} for i, v in ipairs(sj) do table.insert(records, {address=v.address+20, value=1222, flags=16, freeze=true}) table.insert(records, {address=v.address+16, value=3563, flags=16, freeze=true}) end zuilong_gather_data = records showCloudNotify("聚怪","已开启",true) gg.clearResults() end function Zuilong_Gather_Off() if not zuilong_gather_data then showCloudNotify("聚怪","未开启",false) return end for _, item in ipairs(zuilong_gather_data) do gg.removeListItems({item}) end zuilong_gather_data = nil showCloudNotify("聚怪","已关闭",true) end function Zuilong_LeftKill_On() gg.clearResults() search(50000, 4) if #sj == 0 then showCloudNotify("秒左","未找到水晶血量",false) return end py1(1, 4, 8) py1(60, 4, 920) xg1(0, 4, -32, false) search(2139095040, 4) if #sj == 0 then showCloudNotify("秒左","未找到顺左数据",false) return end py1(1065353216, 4, -8) py1(1065353216, 4, -4) py1(0, 4, 4) py1(0, 4, 8) py1(0, 4, 12) xg1(529, 16, 20, false) xg1(882, 16, 16, false) showCloudNotify("秒左","已执行",true) gg.clearResults() end function Zuilong_RightKill_On() gg.clearResults() search(50000, 4) if #sj == 0 then showCloudNotify("秒右","未找到水晶血量",false) return end py1(1, 4, 8) py1(60, 4, 920) xg1(0, 4, -32, false) search(2139095040, 4) if #sj == 0 then showCloudNotify("秒右","未找到顺右数据",false) return end py1(1065353216, 4, -8) py1(1065353216, 4, -4) py1(0, 4, 4) py1(0, 4, 8) py1(0, 4, 12) xg1(530, 16, 20, false) xg1(6239, 16, 16, false) showCloudNotify("秒右","已执行",true) gg.clearResults() end -- ==================== 72变功能(特征码版 - 基于101) ==================== local _72BIAN_SEARCH = 101 local _72BIAN_OFFSET_CHECK1 = -40 local _72BIAN_CHECK1_MIN = 1 local _72BIAN_CHECK1_MAX = 130 local _72BIAN_OFFSET_CHECK2 = -36 local _72BIAN_CHECK2_VALUE = -491520 local _72BIAN_OFFSET_TARGET = -40 -- 目标地址 = 搜索结果地址 + 这个偏移 function _72Bian_Enable(targetID) if _72Bian_Active then _72Bian_Disable() end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) -- 搜索特征码 101 gg.searchNumber(tostring(_72BIAN_SEARCH), gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) local mainCount = gg.getResultsCount() if mainCount == 0 then showCloudNotify("72变", "未找到特征码 101,请确保在训练营或关卡内", false) gg.clearResults() return false end local mainResults = gg.getResults(mainCount) -- 批量读取两个偏移处的值 local checkList = {} for i, v in ipairs(mainResults) do local addr = v.address table.insert(checkList, {address = addr + _72BIAN_OFFSET_CHECK1, flags = gg.TYPE_DWORD}) table.insert(checkList, {address = addr + _72BIAN_OFFSET_CHECK2, flags = gg.TYPE_DWORD}) end local checkValues = gg.getValues(checkList) -- 筛选符合条件的地址,并收集目标地址 local targetAddrs = {} local idx = 1 for i = 1, #mainResults do local val1 = checkValues[idx].value local val2 = checkValues[idx + 1].value idx = idx + 2 -- 验证条件:val1 在 1~130 之间,val2 等于 -491520 if val1 >= _72BIAN_CHECK1_MIN and val1 <= _72BIAN_CHECK1_MAX and val2 == _72BIAN_CHECK2_VALUE then local targetAddr = mainResults[i].address + _72BIAN_OFFSET_TARGET table.insert(targetAddrs, targetAddr) end end if #targetAddrs == 0 then showCloudNotify("72变", "未找到满足条件的地址(偏移-40不在1~130或-36不为-491520)", false) gg.clearResults() return false end -- 修改目标地址的值(英雄ID) local edits = {} _72Bian_Data = {} for _, addr in ipairs(targetAddrs) do local orig = gg.getValues({{address = addr, flags = gg.TYPE_DWORD}})[1].value table.insert(_72Bian_Data, {address = addr, flags = gg.TYPE_DWORD, originalValue = orig}) table.insert(edits, {address = addr, flags = gg.TYPE_DWORD, value = targetID}) end gg.setValues(edits) _72Bian_Active = true _72Bian_TargetID = targetID showCloudNotify("72变", string.format("已开启(特征码101模式),英雄ID修改为 %d,共修改 %d 处", targetID, #edits), true) gg.clearResults() return true end function _72Bian_Disable() if not _72Bian_Active then showCloudNotify("72变", "未开启,无需关闭", false) return end if #_72Bian_Data == 0 then _72Bian_Active = false showCloudNotify("72变", "无数据可恢复", false) return end local restoreList = {} for _, item in ipairs(_72Bian_Data) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) _72Bian_Data = {} _72Bian_Active = false showCloudNotify("72变", "已关闭,已恢复原始英雄", true) end function SeventyTwo_Modify(targetID) return _72Bian_Enable(targetID) end function SeventyTwo_Restore() _72Bian_Disable() end function new72Bian_set(targetID) if _72Bian_Active and _72Bian_TargetID == targetID then showCloudNotify("72变", "已是该英雄,无需重复修改", false) return true end if _72Bian_Active then _72Bian_Disable() end return _72Bian_Enable(targetID) end function SeventyTwo_Custom() local input = gg.prompt({"请输入英雄ID(数字)"}, {""}, {"number"}) if input and input[1] then local id = tonumber(input[1]) if id then _72Bian_TargetID = id if _72Bian_Active then _72Bian_Enable(id) else showCloudNotify("72变", "目标ID已保存为 " .. id .. ",请开启开关生效", true) end else showCloudNotify("72变", "输入无效", false) end end end function ShowHeroIDTable() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "英雄ID参考表(完整版)", "━━━ 初始角色 ━━━\n" .. "1-孙悟空(原皮) 2-唐僧 3-猪八戒 4-沙悟净\n\n" .. "━━━ 传说/限定英雄 ━━━\n" .. "40-通天教主 41-通天教主(皮肤) 51-斗战胜佛 52-斗战胜佛(皮肤)\n" .. "61-后羿 62-后羿(皮肤) 71-六耳猕猴 72-六耳猕猴(皮肤)\n" .. "80-真武大帝 81-真武大帝(皮肤) 89-东皇太一 90-东皇太一(皮肤)\n" .. "98-帝俊 99-帝俊(皮肤)\n\n" .. "━━━ 其他英雄 ━━━\n" .. "103-鹿 104-鹿(皮肤) 107-伏羲 108-女土蝠 109-女土蝠(皮肤)\n\n" .. "━━━ 使用说明 ━━━\n" .. "1️⃣ 必须在训练营或关卡内使用\n" .. "2️⃣ 孙悟空必须穿原皮肤\n" .. "3️⃣ 修改后切图或下一关会失效,需重新开启\n" .. "4️⃣ 点击【恢复原始英雄】可改回孙悟空(1)", "知道了") end) end) end function ShowSeventyTwoInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "72变功能使用说明", "━━━ 功能原理 ━━━\n" .. "通过修改内存中的英雄ID数据,实现角色替换\n\n" .. "━━━ 使用步骤 ━━━\n" .. "1️⃣ 进入训练营或任意关卡\n" .. "2️⃣ 孙悟空必须装备【原皮肤】(重要!)\n" .. "3️⃣ 点击「自定义修改」输入英雄ID\n" .. " 或直接点击快捷开关(如:变通天教主)\n" .. "4️⃣ 修改成功后立即生效\n\n" .. "━━━ 注意事项 ━━━\n" .. "⚠️ 修改后切图、下一关或死亡后会失效\n" .. "⚠️ 失效后重新点击开关即可\n" .. "⚠️ 本功能不冻结、不保存地址\n" .. "⚠️ 关闭脚本或重启游戏自动恢复\n" .. "⚠️ 部分英雄技能可能不完整,属正常现象\n\n" .. "━━━ 恢复方法 ━━━\n" .. "点击【恢复原始英雄】即可变回孙悟空(1)", "知道了") end) end) end -- 佛光美化 local DEFAULT_BUDDHA_SKILL = 13678 local JIANGMO_SKILL = 13166 function BuddhaLight_On() if BUDDHA_LIGHT_ACTIVE then showCloudNotify("佛光美化","已开启",false) return end gg.clearResults() gg.setRanges(2080896) gg.searchNumber("1635084391", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("佛光美化","未找到佛光数据",false) gg.clearResults() return end local results = gg.getResults(count) gg.clearResults() local filtered = {} local tmp = {} for i, v in ipairs(results) do table.insert(tmp, {address = v.address + 4, flags = gg.TYPE_DWORD}) end tmp = gg.getValues(tmp) for i, val in ipairs(tmp) do if val.value == JIANGMO_SKILL then table.insert(filtered, results[i]) end end if #filtered == 0 then showCloudNotify("佛光美化","未找到降魔之光技能",false) gg.clearResults() return end BUDDHA_LIGHT_DATA = {} for i, v in ipairs(filtered) do table.insert(BUDDHA_LIGHT_DATA, {address = v.address + 4, originalValue = JIANGMO_SKILL, flags = gg.TYPE_DWORD}) end local modifyList = {} for i, item in ipairs(BUDDHA_LIGHT_DATA) do table.insert(modifyList, {address = item.address, flags = item.flags, value = DEFAULT_BUDDHA_SKILL}) end gg.setValues(modifyList) BUDDHA_LIGHT_ACTIVE = true showCloudNotify("佛光美化","已开启(降魔→双龙)",true) gg.clearResults() end function BuddhaLight_Off() if not BUDDHA_LIGHT_ACTIVE then showCloudNotify("佛光美化","未开启",false) return end if not BUDDHA_LIGHT_DATA then showCloudNotify("佛光美化","未找到原始数据",false) BUDDHA_LIGHT_ACTIVE = false return end local restoreList = {} for i, item in ipairs(BUDDHA_LIGHT_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) BUDDHA_LIGHT_DATA = nil BUDDHA_LIGHT_ACTIVE = false showCloudNotify("佛光美化","已关闭",true) end function BuddhaLight_Custom() local input = gg.prompt({"请输入技能代码(双龙戏珠13678,琉璃法环14190,菩提圣印14446,万法归宗14702)"},{tostring(DEFAULT_BUDDHA_SKILL)},{"number"}) if input == nil then showCloudNotify("自定义","已取消",false) return end local newCode = tonumber(input[1]) if not newCode then showCloudNotify("错误","请输入有效数字",false) return end if not BUDDHA_LIGHT_ACTIVE then showCloudNotify("错误","请先开启佛光美化",false) return end if not BUDDHA_LIGHT_DATA then showCloudNotify("错误","未找到佛光数据",false) return end local modifyList = {} for i, item in ipairs(BUDDHA_LIGHT_DATA) do table.insert(modifyList, {address = item.address, flags = item.flags, value = newCode}) end gg.setValues(modifyList) showCloudNotify("佛光美化","技能已自定义为"..newCode,true) end -- 无限跳跃 function InfiniteJump_On() if INFINITE_JUMP_ACTIVE then showCloudNotify("无限跳跃","已开启",false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(750, 4) local count = gg.getResultCount() if count == 0 then showCloudNotify("无限跳跃","未找到特征",false) gg.clearResults() return end local results = gg.getResults(count) local addrs = {} for _, r in ipairs(results) do addrs[#addrs + 1] = {address = r.address - 32, flags = 4} end local values = gg.getValues(addrs) local filtered = {} for i, v in ipairs(values) do if v.value == 10 then filtered[#filtered + 1] = results[i] end end if #filtered == 0 then showCloudNotify("无限跳跃","特征匹配失败",false) gg.clearResults() return end INFINITE_JUMP_LIST = {} local freezeItems = {} for _, addrInfo in ipairs(filtered) do local targetAddr = addrInfo.address - 56 local item = {address = targetAddr, flags = 4, value = 0, freeze = true} freezeItems[#freezeItems + 1] = item INFINITE_JUMP_LIST[#INFINITE_JUMP_LIST + 1] = item end gg.addListItems(freezeItems) INFINITE_JUMP_ACTIVE = true showCloudNotify("无限跳跃","已开启(冻结"..#freezeItems.."处)",true) gg.clearResults() end function InfiniteJump_Off() if not INFINITE_JUMP_ACTIVE then showCloudNotify("无限跳跃","未开启",false) return end if INFINITE_JUMP_LIST then for _, item in ipairs(INFINITE_JUMP_LIST) do gg.removeListItems({item}) end INFINITE_JUMP_LIST = nil end INFINITE_JUMP_ACTIVE = false showCloudNotify("无限跳跃","已关闭",true) end -- 定怪功能 function MonsterFix_Once() gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(750, 4) local count = gg.getResultCount() if count == 0 then gg.clearResults() return end local results = gg.getResults(count) local validAddrs = {} for _, v in ipairs(results) do local val = gg.getValues({{address = v.address - 32, flags = gg.TYPE_DWORD}})[1].value if val == 10 then val = gg.getValues({{address = v.address + 4, flags = gg.TYPE_DWORD}})[1].value if val == -491520 then val = gg.getValues({{address = v.address + 132, flags = gg.TYPE_DWORD}})[1].value if val == -425984 then table.insert(validAddrs, v.address) end end end end if #validAddrs == 0 then gg.clearResults() return end local writeList = {} for _, addr in ipairs(validAddrs) do table.insert(writeList, {address = addr + 496, flags = gg.TYPE_DWORD, value = 1}) end gg.setValues(writeList) gg.clearResults() end function StartMonsterFixLoop() if MONSTER_FIX_ACTIVE then showCloudNotify("定怪","循环已在运行",false) return end MONSTER_FIX_ACTIVE = true showCloudNotify("定怪","已开启,每"..MONSTER_FIX_INTERVAL.."秒执行",true) local loop_thread = function() while MONSTER_FIX_ACTIVE do MonsterFix_Once() if MONSTER_FIX_ACTIVE then gg.sleep(MONSTER_FIX_INTERVAL * 1000) end end showCloudNotify("定怪","已停止",true) end pcall(loop_thread) end function StopMonsterFixLoop() if not MONSTER_FIX_ACTIVE then showCloudNotify("定怪","未运行",false) return end MONSTER_FIX_ACTIVE = false showCloudNotify("定怪","已关闭",true) end -- ==================== 活动专区 ==================== -- 打地鼠增加时长(原极速版,正式版) function WhackAMole_On() if WHACK_A_MOLE_DATA then showCloudNotify("打地鼠增加时长", "已开启,无需重复操作", false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) local searchValue = -1829587348619263 local verifyValue = -2111062325329920 local modifyValue = -8000 gg.searchNumber(tostring(searchValue), gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1) local results = gg.getResults(9999990) if #results == 0 then showCloudNotify("打地鼠增加时长", "未找到匹配值", false) gg.clearResults() return end local saveList = {} local modifyList = {} for _, result in ipairs(results) do local verifyAddr = result.address + 40 local verifyVal = gg.getValues({{address = verifyAddr, flags = gg.TYPE_QWORD}})[1].value if verifyVal == verifyValue then local targetAddr = result.address + 64 local currentVal = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value if currentVal > 1 and currentVal < 2000 then table.insert(saveList, { address = targetAddr, flags = gg.TYPE_DWORD, originalValue = currentVal }) table.insert(modifyList, { address = targetAddr, flags = gg.TYPE_DWORD, value = modifyValue }) end end end gg.clearResults() if #modifyList == 0 then showCloudNotify("打地鼠增加时长", "验证通过但无符合条件地址(需 >1 且 <2000)", false) return end gg.setValues(modifyList) WHACK_A_MOLE_DATA = saveList showCloudNotify("打地鼠增加时长", "已开启,修改 " .. #modifyList .. " 处(不冻结)", true) end function WhackAMole_Off() if not WHACK_A_MOLE_DATA then showCloudNotify("打地鼠增加时长", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(WHACK_A_MOLE_DATA) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue }) end gg.setValues(restoreList) WHACK_A_MOLE_DATA = nil showCloudNotify("打地鼠增加时长", "已关闭,已恢复原始值", true) end -- ==================== v1.8 新增:显示宽屏按键(不冻结) ==================== function WideScreen_On() if WIDE_SCREEN_DATA then showCloudNotify("显示宽屏按键", "已开启,无需重复操作", false) return end gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber('904136849', gg.TYPE_DWORD) local resultCount = gg.getResultCount() if resultCount == 0 then showCloudNotify("显示宽屏按键", "未找到任何结果,请确保在坠龙战斗内开启", false) return end local results = gg.getResults(resultCount) local modifyList = {} local recordList = {} for i, v in ipairs(results) do local targetAddr = v.address + 56 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(recordList, {address = targetAddr, flags = gg.TYPE_DWORD, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257}) end if #modifyList == 0 then showCloudNotify("显示宽屏按键", "未生成有效修改项", false) return end gg.setValues(modifyList) WIDE_SCREEN_DATA = recordList showCloudNotify("显示宽屏按键", "已开启,共修改 " .. #modifyList .. " 处", true) gg.clearResults() end function WideScreen_Off() if not WIDE_SCREEN_DATA then showCloudNotify("显示宽屏按键", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(WIDE_SCREEN_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) WIDE_SCREEN_DATA = nil showCloudNotify("显示宽屏按键", "已关闭,数值已恢复", true) end -- ==================== v1.9 新增:显示变速按键(冒险关卡) ==================== function SpeedButton_On() if SPEED_BUTTON_DATA then showCloudNotify("显示变速按键", "已开启,无需重复操作", false) return end gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber('848467071', gg.TYPE_DWORD) local resultCount = gg.getResultCount() if resultCount == 0 then showCloudNotify("显示变速按键", "未找到任何结果,请确保在冒险关卡内开启", false) return end local results = gg.getResults(resultCount) local modifyList = {} local recordList = {} for i, v in ipairs(results) do local targetAddr = v.address + 68 local orig = gg.getValues({{address = targetAddr, flags = gg.TYPE_DWORD}})[1].value table.insert(recordList, {address = targetAddr, flags = gg.TYPE_DWORD, originalValue = orig}) table.insert(modifyList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 257}) end if #modifyList == 0 then showCloudNotify("显示变速按键", "未生成有效修改项", false) return end gg.setValues(modifyList) SPEED_BUTTON_DATA = recordList showCloudNotify("显示变速按键", "已开启,共修改 " .. #modifyList .. " 处", true) gg.clearResults() end function SpeedButton_Off() if not SPEED_BUTTON_DATA then showCloudNotify("显示变速按键", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(SPEED_BUTTON_DATA) do table.insert(restoreList, {address = item.address, flags = item.flags, value = item.originalValue}) end gg.setValues(restoreList) SPEED_BUTTON_DATA = nil showCloudNotify("显示变速按键", "已关闭,数值已恢复", true) end -- ==================== 刷文碟(单次执行,不保存列表) ==================== function ShuaWenDie_On() gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber('4294541312', gg.TYPE_QWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("刷文碟", "未找到特征值 4294541312", false) gg.clearResults() return end local results = gg.getResults(count) local modified = 0 for _, v in ipairs(results) do local addr = v.address local check1 = gg.getValues({{address = addr - 500, flags = gg.TYPE_QWORD}}) if check1[1].value == -2111062325329920 then local check2 = gg.getValues({{address = addr + 440, flags = gg.TYPE_QWORD}}) if check2[1].value == 8589443072 then gg.setValues({{address = addr + 436, flags = gg.TYPE_DWORD, value = 16}}) modified = modified + 1 end end end gg.clearResults() if modified > 0 then showCloudNotify("刷文碟", "已修改 " .. modified .. " 处(单次执行,无需关闭)", true) else showCloudNotify("刷文碟", "没有符合条件的地址(验证1或2不通过)", false) end end function ShuaWenDie_Off() showCloudNotify("刷文碟", "此功能为单次执行,无需关闭", false) end -- ==================== v2.3 新增:全员无敌(开关式) ==================== function AllInvincible_On() if ALL_INVINCIBLE_DATA then showCloudNotify("全员无敌", "已开启,无需重复操作", false) return end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber(750, gg.TYPE_DWORD) if gg.getResultCount() == 0 then showCloudNotify("全员无敌", "未找到特征数据,请确保在关卡内", false) gg.clearResults() return end local results = gg.getResults(gg.getResultCount()) local addrs = {} for i, v in ipairs(results) do addrs[i] = { address = v.address + 736, flags = gg.TYPE_DWORD } end local values = gg.getValues(addrs) local validResults = {} for i, val in ipairs(values) do if val.value == 1 then table.insert(validResults, results[i]) end end if #validResults == 0 then showCloudNotify("全员无敌", "未找到符合条件的地址(偏移+736处不为1)", false) gg.clearResults() return end local savedData = {} local modifyList = {} for _, res in ipairs(validResults) do local addr = res.address + 736 local orig = gg.getValues({{ address = addr, flags = gg.TYPE_DWORD }})[1].value table.insert(savedData, { address = addr, originalValue = orig, flags = gg.TYPE_DWORD }) table.insert(modifyList, { address = addr, flags = gg.TYPE_DWORD, value = 2 }) end gg.setValues(modifyList) ALL_INVINCIBLE_DATA = savedData showCloudNotify("全员无敌", "已开启,修改了 " .. #modifyList .. " 处", true) gg.clearResults() end function AllInvincible_Off() if not ALL_INVINCIBLE_DATA then showCloudNotify("全员无敌", "未开启,无需关闭", false) return end if #ALL_INVINCIBLE_DATA > 0 then local restoreList = {} for _, item in ipairs(ALL_INVINCIBLE_DATA) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue }) end gg.setValues(restoreList) showCloudNotify("全员无敌", "已关闭,恢复了 " .. #restoreList .. " 处", true) else showCloudNotify("全员无敌", "没有可恢复的数据", false) end ALL_INVINCIBLE_DATA = nil gg.clearResults() end -- ==================== v2.6 全员秒杀无冷却(循环模式,500ms) ==================== function AllSecondKill_On() if ALL_SECOND_KILL_LOOP_ACTIVE then showCloudNotify("全员秒杀无冷却", "循环已在运行,无需重复开启", false) return end ALL_SECOND_KILL_LOOP_ACTIVE = true showCloudNotify("全员秒杀无冷却", "循环已启动,每500ms执行一次", true) local loop_thread = function() while ALL_SECOND_KILL_LOOP_ACTIVE do gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("30000", gg.TYPE_DWORD) if gg.getResultCount() > 0 then local results = gg.getResults(gg.getResultCount()) local validAddrs = {} for _, v in ipairs(results) do local chk = gg.getValues({{address = v.address + 8, flags = gg.TYPE_DWORD}}) if chk[1].value == 20000 then table.insert(validAddrs, v.address) end end if #validAddrs > 0 then local modifyList = {} for _, addr in ipairs(validAddrs) do table.insert(modifyList, {address = addr - 112, flags = gg.TYPE_DWORD, value = 9999}) table.insert(modifyList, {address = addr - 128, flags = gg.TYPE_DWORD, value = 1}) end gg.setValues(modifyList) end end gg.clearResults() if ALL_SECOND_KILL_LOOP_ACTIVE then gg.sleep(500) end end showCloudNotify("全员秒杀无冷却", "循环已停止", true) end pcall(loop_thread) end function AllSecondKill_Off() if not ALL_SECOND_KILL_LOOP_ACTIVE then showCloudNotify("全员秒杀无冷却", "循环未运行,无需关闭", false) return end ALL_SECOND_KILL_LOOP_ACTIVE = false showCloudNotify("全员秒杀无冷却", "正在停止循环...", false) end -- ==================== 竞技专区 ==================== -- 特征码模式函数(左入坑-小数组) function LeftRoleFeature_On() if leftRoleFeatureData then showCloudNotify("左边角色入坑", "特征码模式已开启,无需重复", false) return true end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("2139095040", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then return false end local results = gg.getResults(math.min(count, 2000)) local validEntries = {} local readList = {} for i, v in ipairs(results) do local addr = v.address table.insert(readList, {address = addr + 0x3C, flags = gg.TYPE_DWORD}) table.insert(readList, {address = addr + 0x34, flags = gg.TYPE_DWORD}) table.insert(readList, {address = addr + 0x10, flags = gg.TYPE_DWORD}) end local allVals = gg.getValues(readList) if not allVals then return false end local idx = 1 for i = 1, #results do local sub1 = allVals[idx].value local sub2 = allVals[idx+1].value local target = allVals[idx+2].value idx = idx + 3 if sub1 == -2147483648 and sub2 == 1065353216 then table.insert(validEntries, { address = results[i].address + 0x10, currentValue = target }) end end gg.clearResults() if #validEntries == 0 then return false end table.sort(validEntries, function(a, b) return a.currentValue < b.currentValue end) local total = #validEntries local splitIndex = math.floor(total / 2) local smallGroup = {} for i = 1, splitIndex do table.insert(smallGroup, validEntries[i]) end if #smallGroup == 0 then return false end local modifyList = {} local recordList = {} for _, entry in ipairs(smallGroup) do table.insert(recordList, { address = entry.address, flags = gg.TYPE_DWORD, originalValue = entry.currentValue }) table.insert(modifyList, { address = entry.address, flags = gg.TYPE_DWORD, value = 1145111210, freeze = true }) end gg.setValues(modifyList) gg.addListItems(modifyList) leftRoleFeatureData = recordList showCloudNotify("左边角色入坑", string.format("特征码模式(小数组)已开启,修改 %d 处并冻结", #modifyList), true) return true end function LeftRoleFeature_Off() if not leftRoleFeatureData then return end local restoreList = {} for _, item in ipairs(leftRoleFeatureData) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue, freeze = false }) end gg.setValues(restoreList) local currentList = gg.getListItems() for _, item in ipairs(leftRoleFeatureData) do for _, li in ipairs(currentList) do if li.address == item.address and li.flags == item.flags then gg.removeListItems({li}) break end end end leftRoleFeatureData = nil showCloudNotify("左边角色入坑", "特征码模式已关闭,已恢复原值并移除冻结", true) end -- 特征码模式函数(右入坑-大数组) function RightRoleFeature_On() if rightRoleFeatureData then showCloudNotify("右边角色入坑", "特征码模式已开启,无需重复", false) return true end gg.clearResults() gg.setRanges(gg.REGION_C_ALLOC | gg.REGION_OTHER) gg.searchNumber("2139095040", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then return false end local results = gg.getResults(math.min(count, 2000)) local validEntries = {} local readList = {} for i, v in ipairs(results) do local addr = v.address table.insert(readList, {address = addr + 0x3C, flags = gg.TYPE_DWORD}) table.insert(readList, {address = addr + 0x34, flags = gg.TYPE_DWORD}) table.insert(readList, {address = addr + 0x10, flags = gg.TYPE_DWORD}) end local allVals = gg.getValues(readList) if not allVals then return false end local idx = 1 for i = 1, #results do local sub1 = allVals[idx].value local sub2 = allVals[idx+1].value local target = allVals[idx+2].value idx = idx + 3 if sub1 == -2147483648 and sub2 == 1065353216 then table.insert(validEntries, { address = results[i].address + 0x10, currentValue = target }) end end gg.clearResults() if #validEntries == 0 then return false end table.sort(validEntries, function(a, b) return a.currentValue < b.currentValue end) local total = #validEntries local splitIndex = math.floor(total / 2) local bigGroup = {} for i = splitIndex + 1, total do table.insert(bigGroup, validEntries[i]) end if #bigGroup == 0 then return false end local modifyList = {} local recordList = {} for _, entry in ipairs(bigGroup) do table.insert(recordList, { address = entry.address, flags = gg.TYPE_DWORD, originalValue = entry.currentValue }) table.insert(modifyList, { address = entry.address, flags = gg.TYPE_DWORD, value = 1145111210, freeze = true }) end gg.setValues(modifyList) gg.addListItems(modifyList) rightRoleFeatureData = recordList showCloudNotify("右边角色入坑", string.format("特征码模式(大数组)已开启,修改 %d 处并冻结", #modifyList), true) return true end function RightRoleFeature_Off() if not rightRoleFeatureData then return end local restoreList = {} for _, item in ipairs(rightRoleFeatureData) do table.insert(restoreList, { address = item.address, flags = item.flags, value = item.originalValue, freeze = false }) end gg.setValues(restoreList) local currentList = gg.getListItems() for _, item in ipairs(rightRoleFeatureData) do for _, li in ipairs(currentList) do if li.address == item.address and li.flags == item.flags then gg.removeListItems({li}) break end end end rightRoleFeatureData = nil showCloudNotify("右边角色入坑", "特征码模式已关闭,已恢复原值并移除冻结", true) end -- 指针模式函数(左入坑) function LeftRolePointer_On() local module_name = "libcocos2djs.so" local offsets = {0x8B50, 0x40, 0x38, 0x8, 0x0, 0x28} local target_value = 1145111210 local val_flag = gg.TYPE_DWORD local ranges = gg.getRangesList(module_name) local bss_start = nil if ranges and #ranges > 0 then for _, v in ipairs(ranges) do if string.find(v.name, "bss") then bss_start = v.start break end end end if bss_start then local is_64bit = false for _, v in ipairs(ranges) do if string.find(v.name, "64") or v.start > 0xFFFFFFFF then is_64bit = true break end end local ptr_flag = is_64bit and gg.TYPE_QWORD or gg.TYPE_DWORD local current_addr = bss_start + offsets[1] local pointer_ok = true for i = 2, #offsets do local result = gg.getValues({{address = current_addr, flags = ptr_flag}}) if not result or not result[1] then pointer_ok = false break end local ptr = result[1].value if ptr == 0 or ptr == nil then pointer_ok = false break end current_addr = ptr + offsets[i] end if pointer_ok then local orig = gg.getValues({{address = current_addr, flags = val_flag}})[1].value leftRoleData = {address = current_addr, flags = val_flag, originalValue = orig} local mod = {address = current_addr, flags = val_flag, value = target_value, freeze = true} gg.setValues({mod}) gg.addListItems({mod}) showCloudNotify("左边角色入坑", "指针模式已修改", true) return true end end return false end -- 指针模式函数(右入坑) function RightRolePointer_On() local module_name = "libcocos2djs.so" local offsets = {0x8B50, 0x40, 0x38, 0x8, 0x8, 0x28} local target_value = 1145111210 local val_flag = gg.TYPE_DWORD local ranges = gg.getRangesList(module_name) local bss_start = nil if ranges and #ranges > 0 then for _, v in ipairs(ranges) do if string.find(v.name, "bss") then bss_start = v.start break end end end if bss_start then local is_64bit = false for _, v in ipairs(ranges) do if string.find(v.name, "64") or v.start > 0xFFFFFFFF then is_64bit = true break end end local ptr_flag = is_64bit and gg.TYPE_QWORD or gg.TYPE_DWORD local current_addr = bss_start + offsets[1] local pointer_ok = true for i = 2, #offsets do local result = gg.getValues({{address = current_addr, flags = ptr_flag}}) if not result or not result[1] then pointer_ok = false break end local ptr = result[1].value if ptr == 0 or ptr == nil then pointer_ok = false break end current_addr = ptr + offsets[i] end if pointer_ok then local orig = gg.getValues({{address = current_addr, flags = val_flag}})[1].value rightRoleData = {address = current_addr, flags = val_flag, originalValue = orig} local mod = {address = current_addr, flags = val_flag, value = target_value, freeze = true} gg.setValues({mod}) gg.addListItems({mod}) showCloudNotify("右边角色入坑", "指针模式已修改", true) return true end end return false end -- 主开关函数(根据模式变量执行) function LeftRoleEnter_On() local executed = false if PC_MODE_ENABLED then if LeftRoleFeature_On() then executed = true end end if MOBILE_MODE_ENABLED then if LeftRolePointer_On() then executed = true end end if executed then showCloudNotify("左边角色入坑", "已执行选中的搜索模式", true) else showCloudNotify("左边角色入坑", "未找到有效修改,请检查开关或环境", false) end end function LeftRoleEnter_Off() local restored = false if leftRoleData then gg.setValues({{address = leftRoleData.address, flags = leftRoleData.flags, value = leftRoleData.originalValue, freeze = false}}) local currentList = gg.getListItems() for _, li in ipairs(currentList) do if li.address == leftRoleData.address and li.flags == leftRoleData.flags then gg.removeListItems({li}) break end end leftRoleData = nil restored = true end if leftRoleFeatureData then LeftRoleFeature_Off() restored = true end if restored then showCloudNotify("左边角色入坑", "已关闭,所有修改已恢复并移除冻结", true) else showCloudNotify("左边角色入坑", "未开启,无需关闭", false) end end function RightRoleEnter_On() local executed = false if PC_MODE_ENABLED then if RightRoleFeature_On() then executed = true end end if MOBILE_MODE_ENABLED then if RightRolePointer_On() then executed = true end end if executed then showCloudNotify("右边角色入坑", "已执行选中的搜索模式", true) else showCloudNotify("右边角色入坑", "未找到有效修改,请检查开关或环境", false) end end function RightRoleEnter_Off() local restored = false if rightRoleData then gg.setValues({{address = rightRoleData.address, flags = rightRoleData.flags, value = rightRoleData.originalValue, freeze = false}}) local currentList = gg.getListItems() for _, li in ipairs(currentList) do if li.address == rightRoleData.address and li.flags == rightRoleData.flags then gg.removeListItems({li}) break end end rightRoleData = nil restored = true end if rightRoleFeatureData then RightRoleFeature_Off() restored = true end if restored then showCloudNotify("右边角色入坑", "已关闭,所有修改已恢复并移除冻结", true) else showCloudNotify("右边角色入坑", "未开启,无需关闭", false) end end -- ==================== 竞技专区查看详细说明 ==================== function ShowJingJiInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "竞技专区使用说明", "━━━ 左边角色入坑 ━━━\n" .. "进去后再开\n" .. "开启后左边角色掉入坑。\n\n" .. "━━━ 右边角色入坑 ━━━\n" .. "进去后再开\n" .. "开启后右边角色掉入坑。\n\n" .. "━━━ 模式切换 ━━━\n" .. "通过上方复选框选择「电脑模式」或「手机模式」\n" .. "电脑模式=电脑上用,手机模式=手机上用\n\n" .. "━━━ 全员秒杀无冷却 ━━━\n" .. "循环模式:开启后每隔500ms自动修改,关闭停止。") end) end) end -- ==================== 使用说明(原有) ==================== function ShowWukongInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "悟空功能说明", "秒杀在准备战斗时开启,无敌在地图内开启,新秒杀进入战斗后开\n" .. "强普技能替换(开关式):开启后替换普攻为指定技能代码(默认8660),可自定义。", "知道了") end) end) end function ShowFaBaoInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "法宝秒怪说明", "装备对应法宝后点击按钮即可,一局一开", "知道了") end) end) end function ShowZuilongInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "坠龙之地说明", "模型透视:拖动地图可见敌人模型\n秒水晶:秒左边/右边水晶\n聚怪:所有怪物聚集在龙坑\n" .. "穿图:分机效果\n宽屏按键:进坠龙战斗后开(训练营无效),开启后屏幕下方会多出一个宽屏缩放按键\n" .. "法宝无冷却\n技能无蓝耗+无冷却(合并开关)\n坠龙角色无敌\n" .. "72变改英雄:训练营使用,悟空必须带原皮\n内购三生锤:价格变为-999999\n" .. "刷成就:修改击杀数和助攻数,用来刷mvp和助攻的成就,不会分机", "知道了") end) end) end function ShowInstantPassInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "冒险专区", "秒过功能:只能过部分主线,特殊地形\n" .. "猴子无敌秒:悟空带分身被动,开启后猴子无法被攻击,最后一次普攻秒全图\n" .. "通天神猴:准备战斗界面开启,开启后全图生效\n" .. "悟空强普替换:悟空带分身被动,默认8660,伏羲大招,悟空最后一次普攻触发\n" .. "全员技能无冷却:图内开,开启后全员技能和法宝无冷却\n" .. "定怪:图内图外都可以开,开启后怪物不会攻击\n" .. "全员无敌:开关式,在关卡内开启,令所有角色(包括敌人?)无敌,适用于需要全员生存的场景。\n\n" .. "━━━ 全员秒杀无冷却 ━━━\n" .. "循环模式:开启后每隔500ms自动搜索并修改,关闭停止。") end) end) end function ShowAdventureInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "无视地形秒过说明", "无视地形秒过能秒过全部主线\n" .. "直接开\n" .. "支持元素、镇妖塔、试炼房等\n\n" .. "⚡增强版新特性:必定触发入侵奖励", "知道了") end) end) end function ShowEntertainmentInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "娱乐功能说明", "游戏加速用于活动\n全局加速过检测稳定\n佛光美化(降魔之光改双龙戏珠)\n" .. "无限跳跃(关卡内开启后可以无限跳跃)\n火焰山替换主线关卡:双人组队替换关卡,请在组队界面再开启\n" .. "显示变速按键:冒险关卡内开启,显示变速按钮\n" .. "GM模式:开启后进入GM状态\n" .. "卖道具:自定义输入值后,自动写入(输入值-1)到道具价格\n" .. "视奸模式(单次执行):点击开启后,执行一次修改,实现查看陌生人状态、可切磋、强制私聊效果", "知道了") end) end) end function ShowGeneralInstructions() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "脚本使用说明", "造梦西游外传 v2.8(新增卖道具功能)\n适配 iQOO、vivo 等直装设备\n" .. "功能分页:公告、悬浮窗功能、秒过功能、冒险专区、竞技专区、法宝功能、坠龙之地、活动专区、娱乐功能、万能修改、设置\n" .. "请勿在竞技模式下使用", "知道了") end) end) end -- ==================== 修改体力值(开关式) ==================== function PoolEnergy_On() if POOL_ENERGY_ADDRS and #POOL_ENERGY_ADDRS > 0 then showCloudNotify("修改体力值", "已开启,无需重复", false) return end gg.clearResults() gg.setRanges(gg.REGION_OTHER) gg.searchNumber("50~60", gg.TYPE_DWORD) local resultCount = gg.getResultsCount() if resultCount == 0 then showCloudNotify("修改体力值", "未找到匹配数值(50~60)", false) return end local results = gg.getResults(resultCount) if not results or #results == 0 then showCloudNotify("修改体力值", "获取结果失败", false) return end local readList = {} for i, v in ipairs(results) do table.insert(readList, {address = v.address - 4, flags = gg.TYPE_DWORD}) table.insert(readList, {address = v.address + 4, flags = gg.TYPE_DWORD}) end local readValues = gg.getValues(readList) if not readValues then showCloudNotify("修改体力值", "读取内存失败", false) return end local modifyList = {} local addrList = {} for i = 1, #results do local idx1 = (i - 1) * 2 + 1 local idx2 = (i - 1) * 2 + 2 local val1 = readValues[idx1] local val2 = readValues[idx2] if val1 and val2 then local check1 = val1.value local check2 = val2.value if check1 >= -262050 and check1 <= -200000 and check2 == -491520 then local targetAddr = results[i].address table.insert(modifyList, {address = targetAddr, flags = gg.TYPE_DWORD, value = 9999}) table.insert(addrList, {address = targetAddr, flags = gg.TYPE_DWORD}) end end end if #modifyList == 0 then showCloudNotify("修改体力值", "未找到完全符合偏移条件的地址", false) return end local setResult = gg.setValues(modifyList) if setResult then POOL_ENERGY_ADDRS = addrList showCloudNotify("修改体力值", "已开启,修改 " .. #modifyList .. " 处为 9999", true) else showCloudNotify("修改体力值", "写入失败,请检查权限", false) end gg.clearResults() end function PoolEnergy_Off() if not POOL_ENERGY_ADDRS or #POOL_ENERGY_ADDRS == 0 then showCloudNotify("修改体力值", "未开启,无需关闭", false) return end local restoreList = {} for _, item in ipairs(POOL_ENERGY_ADDRS) do table.insert(restoreList, {address = item.address, flags = item.flags, value = 0}) end gg.setValues(restoreList) POOL_ENERGY_ADDRS = nil showCloudNotify("修改体力值", "已关闭,所有地址改回 0", true) end -- ==================== 更新后的公告(ShowNotice) ==================== function ShowNotice() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "公告", "造梦西游外传多功能脚本 v2.8\n\n✨ 更新 v2.8:\n" .. "✅ 新增「卖道具」功能(娱乐功能分页)\n" .. "✅ 自定义输入数值,自动写入(输入值-1)\n" .. "✅ 泳池修改重构\n" .. "✅ 新增「修改体力值」开关(活动专区)\n" .. "✅ 新增「泳池二合一」总开关(活动专区),一键同时执行体力+分数修改\n" .. "✅ 优化使用说明\n\n" .. "🔧 其他功能保持稳定", "知道了") end) end) end -- 自动过检测 function AutoBypass() gg.clearResults() gg.setRanges(gg.REGION_OTHER) gg.searchNumber("1749250921;7627109", gg.TYPE_DWORD) local count = gg.getResultCount() if count == 0 then showCloudNotify("自动过检测","未找到特征值",false) return end local results = gg.getResults(count) for i = 1, #results do results[i].value = 0 results[i].freeze = false end gg.setValues(results) gg.clearResults() showCloudNotify("自动过检测","已执行,修改 "..count.." 个值",true) end -- ==================== 更新后的启动弹窗公告(MaterialAlert) ==================== local function MaterialAlert() local alertBuilder = MaterialAlertDialogBuilder(context) alertBuilder.setTitle("公告") alertBuilder.setMessage([[ 造梦西游外传 v2.8 (64位流畅版) - 新增卖道具功能 🌟 核心优点:更流畅、更稳定 🔧 专为64位游戏优化,运行丝滑 ✨ 悬浮窗功能:秒左、秒右、透视、聚怪、穿图 ✨ 泳池分数修改:开启后直接变成800分 ✨ 新增「修改体力值」:开启改9999,关闭改0 ✨ 新增「泳池二合一」总开关(活动专区) 请勿破坏游戏平衡 ]]) alertBuilder.setPositiveButton("确定") local LayoutParams = luajava.bindClass('android.view.WindowManager$LayoutParams') local alert = alertBuilder.create() alert.getWindow().setType(gg.ANDROID_SDK_INT >= 26 and LayoutParams.TYPE_APPLICATION_OVERLAY or LayoutParams.TYPE_PHONE) alert.show() end luajava.runOnUiThread(MaterialAlert) gg.sleep(500) AutoBypass() -- ==================== UI 配置 ==================== _ENV["悬浮窗图标"] = 'https://patchwiki.biligame.com/images/ys/2/29/4k98v9sdrrkrxw8vxfdxll42bdi3czo.png' _ENV["标题"] = '造梦西游外传 v2.8' _ENV["分页"] = { '公告', '悬浮窗功能', '秒过功能', '冒险专区', '竞技专区', '法宝功能', '坠龙之地', '活动专区', '娱乐功能', '万能修改', '设置' } init() uistart({ -- 公告页 { CAtext('造梦西游外传多功能脚本 v2.8', '#FF6B35', '16sp', true), CAbutton('手动过检测', AutoBypass, '#2196F3'), CAtext('━━ 最新更新 ━━', '#FF9800', '12sp', true), CAtext('✅ 新增「卖道具」功能(娱乐功能页)', '#4CAF50', '12sp'), CAtext('✅ 泳池修改重构', '#4CAF50', '12sp'), CAtext('✅ 新增「修改体力值」开关(活动专区)', '#4CAF50', '12sp'), CAtext('✅ 新增「泳池二合一」总开关(活动专区)', '#4CAF50', '12sp'), CAtext('✅ 新增「全员秒杀无冷却」循环模式(竞技&冒险)', '#4CAF50', '12sp'), CAtext('✅ 新增「三生锤无敌属性」开关(坠龙之地)', '#4CAF50', '12sp'), CAtext('✅ 新增「竞技专区」分页(左右角色入坑)', '#4CAF50', '12sp'), CAtext('✅ 新增「全员无敌」开关(冒险专区)', '#4CAF50', '12sp'), CAtext('✅ 新增「视奸模式」开关(娱乐功能页)', '#4CAF50', '12sp'), CAtext('✅ 新增「刷文碟」开关(活动专区)', '#4CAF50', '12sp'), CAtext('✅ 新增「GM模式」开关(娱乐功能页)', '#4CAF50', '12sp'), CAtext('━━ 注意事项 ━━', '#FF9800', '12sp', true), CAtext('⚠️ 请勿在竞技模式下使用', '#F44336', '12sp'), CAbutton('查看详细公告', ShowNotice, '#4CAF50'), }, -- 悬浮窗功能页 { CAtext('🖥️ 快捷悬浮窗控制', '#673AB7', '16sp', true), CAtext('每个开关独立控制对应悬浮窗的显示/隐藏,悬浮窗可拖拽,点击切换功能状态', '#666666', '12sp'), CAtext('━━ 水晶秒杀 ━━', '#FF9800', '12sp', true), CAswitch('显示「秒左」悬浮窗', function() showSwitch("秒左") end, function() hideSwitch("秒左") end), CAswitch('显示「秒右」悬浮窗', function() showSwitch("秒右") end, function() hideSwitch("秒右") end), CAtext('━━ 常用功能 ━━', '#FF9800', '12sp', true), CAswitch('显示「透视」悬浮窗', function() showSwitch("透视") end, function() hideSwitch("透视") end), CAswitch('显示「聚怪」悬浮窗', function() showSwitch("聚怪") end, function() hideSwitch("聚怪") end), CAswitch('显示「穿图」悬浮窗', function() showSwitch("穿图") end, function() hideSwitch("穿图") end), CAtext('━━ 模式切换悬浮窗 ━━', '#FF9800', '12sp', true), CAswitch('显示「电脑模式」悬浮窗', function() showSwitch("电脑模式") end, function() hideSwitch("电脑模式") end), CAswitch('显示「手机模式」悬浮窗', function() showSwitch("手机模式") end, function() hideSwitch("手机模式") end), CAtext('━━ 提示 ━━', '#4CAF50', '12sp', true), CAtext('注意:悬浮窗需要悬浮权限,如不显示请检查权限', '#2196F3', '12sp'), CAbutton('隐藏全部悬浮窗', function() hideAllSwitches() end, '#F44336'), }, -- 秒过功能页 { CAtext('🏔️ 稳定秒过', '#4CAF50', '16sp', true), CAbutton('无视地形秒过', TerrainIgnorePass, '#4CAF50'), CAtext('━━ 循环功能 ━━', '#FF9800', '12sp', true), CAswitch('循环无视地形秒过', StartLoopTerrainIgnorePass, StopLoopTerrainIgnorePass), CAbutton('设置循环间隔', SetTerrainLoopInterval, '#9C27B0'), CAbutton('查看详细说明', ShowAdventureInstructions, '#4CAF50'), }, -- 冒险专区 { CAtext('⚡ 冒险专区', '#8BC34A', '16sp', true), CAbutton('秒过功能', InstantPass, '#4CAF50'), CAswitch('循环秒过', StartLoopInstantPass, StopLoopInstantPass), CAbutton('设置循环时间', SetLoopInterval, '#9C27B0'), CAswitch('猴子无敌秒(无敌+秒杀)', MonkeyInvincibleKill_On, MonkeyInvincibleKill_Off), CAtext('━━ 通天神猴 ━━', '#FF9800', '12sp', true), CAswitch('🐒 通天神猴', MonkeySkillReplace_On, MonkeySkillReplace_Off), CAtext('提示:开启后替换普攻和技能为通天效果,退出关卡后依然有效。关闭则恢复原技能。', '#666666', '10sp'), CAtext('━━ 悟空功能 ━━', '#FF9800', '12sp', true), CAswitch('悟空强普替换', WukongStrongReplace_On, WukongStrongReplace_Off), CAbutton('⚙️ 自定义技能代码', SetWukongStrongReplaceValue, '#9C27B0'), CAtext('当前代码: ' .. WUKONG_STRONG_REPLACE_VALUE, '#2196F3', '12sp'), CAbutton('📖 悟空功能说明', ShowWukongInstructions, '#4CAF50'), CAtext('━━ 全技能无冷却 ━━', '#FF9800', '12sp', true), CAswitch('全员技能无冷却', AllNoCooldown_On, AllNoCooldown_Off), CAtext('━━ 定怪功能 ━━', '#FF9800', '12sp', true), CAswitch('定怪', StartMonsterFixLoop, StopMonsterFixLoop, '冻结怪物无法行动'), CAtext('━━ 全员无敌 ━━', '#FF9800', '12sp', true), CAswitch('全员无敌(开关式)', AllInvincible_On, AllInvincible_Off, '在关卡内开启,所有角色无敌'), CAtext('━━ 秒杀辅助 ━━', '#FF9800', '12sp', true), CAswitch('全员秒杀无冷却(循环)', AllSecondKill_On, AllSecondKill_Off), CAbutton('查看详细说明', ShowInstantPassInstructions, '#4CAF50'), }, -- ==================== 竞技专区 ==================== { CAtext('🏆 竞技专区', '#FF5722', '16sp', true), CAtext('━━ 搜索模式(勾选启用) ━━', '#FF9800', '12sp', true), CAcheck({ { "💻 电脑模式", function() PC_MODE_ENABLED = true showCloudNotify("模式", "电脑模式已开启", true) local s = allSwitches["电脑模式"] if s then s.setState(true) end end, function() PC_MODE_ENABLED = false showCloudNotify("模式", "电脑模式已关闭", true) local s = allSwitches["电脑模式"] if s then s.setState(false) end end }, { "📱 手机模式", function() MOBILE_MODE_ENABLED = true showCloudNotify("模式", "手机模式已开启", true) local s = allSwitches["手机模式"] if s then s.setState(true) end end, function() MOBILE_MODE_ENABLED = false showCloudNotify("模式", "手机模式已关闭", true) local s = allSwitches["手机模式"] if s then s.setState(false) end end }, }), CAtext('━━ 角色入坑 ━━', '#FF9800', '12sp', true), CAswitch('左边入坑', LeftRoleEnter_On, LeftRoleEnter_Off), CAswitch('右边入坑', RightRoleEnter_On, RightRoleEnter_Off), CAtext('━━ 秒杀辅助 ━━', '#FF9800', '12sp', true), CAswitch('全员秒杀无冷却(循环)', AllSecondKill_On, AllSecondKill_Off), CAbutton('查看详细说明', ShowJingJiInstructions, '#4CAF50'), }, -- 法宝功能 { CAtext('✨ 法宝秒怪', '#9C27B0', '16sp', true), CAbutton('镇魂萧二阶秒怪', FaBao_ZhenHunXiaoErJie, '#4CAF50'), CAbutton('镇魂萧一阶秒怪', FaBao_ZhenHunXiaoYiJie, '#4CAF50'), CAbutton('云阳板一阶秒怪', FaBao_YunYangBanYiJie, '#4CAF50'), CAbutton('云阳板二阶秒怪', FaBao_YunYangBanErJie, '#4CAF50'), CAbutton('枯叶灵一阶秒怪', FaBao_KuYeLingYiJie, '#4CAF50'), CAbutton('枯叶灵二阶秒怪', FaBao_KuYeLingErJie, '#4CAF50'), CAbutton('魁花篮一阶秒怪', FaBao_KuiHuaLanYiJie, '#4CAF50'), CAbutton('魁花篮二阶秒怪', FaBao_KuiHuaLanErJie, '#4CAF50'), CAbutton('查看详细说明', ShowFaBaoInstructions, '#2196F3'), }, -- 坠龙之地 { CAtext('⚔️ 坠龙之地', '#FF5722', '16sp', true), CAswitch('模型透视', ModelPenetration_On, ModelPenetration_Off, '不分机'), CAbutton('秒左边水晶', Zuilong_LeftKill_On, '#2196F3'), CAbutton('秒右边水晶', Zuilong_RightKill_On, '#2196F3'), CAswitch('显示宽屏按键', WideScreen_On, WideScreen_Off), CAtext(' 开启后屏幕下方会多出一个宽屏缩放按钮', '#666666', '10sp'), CAswitch('聚怪', Zuilong_Gather_On, Zuilong_Gather_Off, '将怪物聚集到龙坑'), CAswitch('无蓝耗 + 全员无冷却', BothOn, BothOff), CAswitch('坠龙角色无敌', ZuilongRoleInvincible_On, ZuilongRoleInvincible_Off), CAbutton('内购三生锤', InternalBloodsucker, '#2196F3'), CAswitch('🔨 三生锤无敌属性', SanShengChui_On, SanShengChui_Off, '开关式,修改12处属性为99999'), CAswitch('穿图', StepByStep_Enable, StepByStep_Disable, '开启后达到分机效果'), CAbutton('刷成就(单次执行)', Achievement_Once, '#4CAF50'), CAbox({ '72变(英雄修改)', CAtext('当前目标ID: ' .. (_72Bian_TargetID or 40), '#FF9800', '12sp'), CAtext('━━ 一键变身上古英雄 ━━', '#FF9800', '12sp', true), CAswitch('变通天教主 (40)', function() new72Bian_set(40) end, function() if _72Bian_Active and _72Bian_TargetID == 40 then _72Bian_Disable() end end), CAswitch('变帝俊 (98)', function() new72Bian_set(98) end, function() if _72Bian_Active and _72Bian_TargetID == 98 then _72Bian_Disable() end end), CAswitch('变伏羲 (107)', function() new72Bian_set(107) end, function() if _72Bian_Active and _72Bian_TargetID == 107 then _72Bian_Disable() end end), CAtext('━━ 一键变身其他英雄 ━━', '#FF9800', '12sp', true), CAswitch('变斗战胜佛 (51)', function() new72Bian_set(51) end, function() if _72Bian_Active and _72Bian_TargetID == 51 then _72Bian_Disable() end end), CAswitch('变后羿 (61)', function() new72Bian_set(61) end, function() if _72Bian_Active and _72Bian_TargetID == 61 then _72Bian_Disable() end end), CAswitch('变六耳猕猴 (71)', function() new72Bian_set(71) end, function() if _72Bian_Active and _72Bian_TargetID == 71 then _72Bian_Disable() end end), CAswitch('变真武大帝 (80)', function() new72Bian_set(80) end, function() if _72Bian_Active and _72Bian_TargetID == 80 then _72Bian_Disable() end end), CAswitch('变东皇太一 (89)', function() new72Bian_set(89) end, function() if _72Bian_Active and _72Bian_TargetID == 89 then _72Bian_Disable() end end), CAswitch('变鹿 (103)', function() new72Bian_set(103) end, function() if _72Bian_Active and _72Bian_TargetID == 103 then _72Bian_Disable() end end), CAswitch('变女土蝠 (108)', function() new72Bian_set(108) end, function() if _72Bian_Active and _72Bian_TargetID == 108 then _72Bian_Disable() end end), CAtext('━━ 自定义与恢复 ━━', '#FF9800', '12sp', true), CAswitch('开启72变(悟空改英雄)', function() local id = _72Bian_TargetID or 40 _72Bian_Enable(id) end, function() _72Bian_Disable() end ), CAbutton('自定义修改(输入ID)', SeventyTwo_Custom, '#9C27B0'), CAbutton('恢复原始英雄 (1)', SeventyTwo_Restore, '#F44336'), CAbutton('英雄ID查询表', ShowHeroIDTable, '#607D8B'), CAbutton('📖 72变使用说明', ShowSeventyTwoInstructions, '#4CAF50'), }), CAbutton('查看详细说明', ShowZuilongInstructions, '#4CAF50'), }, -- 活动专区 { CAtext('🎉 活动专区', '#E91E63', '16sp', true), CAtext('━━ 打地鼠功能 ━━', '#FF9800', '12sp', true), CAswitch('⏱️ 打地鼠增加时长', WhackAMole_On, WhackAMole_Off), CAbutton('📖 打地鼠使用说明', function() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "打地鼠增加时长使用说明", "本功能为原极速版优化而来,开启后打地鼠时间显著增加,可轻松拿高分。\n" .. "若搜索不到则说明不兼容,请重试或重启游戏。\n\n" .. "⚠️ 开关式,关闭时自动恢复原始值。", "知道了") end) end) end, '#4CAF50'), CAswitch('🍙 吃粽子刷分(撞桌211分)', EatZongzi_On, EatZongzi_Off), CAbutton('📖 查看吃粽子刷分说明', ShowEatZongziInstructions, '#2196F3'), CAtext('━━ 泳池修改 ━━', '#FF9800', '12sp', true), -- 二合一总开关(放在上面) CAswitch('🌟 泳池二合一', function() PoolEnergy_On() PoolModify_On() end, function() PoolEnergy_Off() end ), -- 下面两个并排复选框(类似竞技专区) CAcheck({ { "修改体力", function() PoolEnergy_On() end, function() PoolEnergy_Off() end }, { "修改分数", function() PoolModify_On() end, function() PoolModify_Off() end } }), CAbutton('📖 查看泳池修改说明', ShowPoolModifyInstructions, '#2196F3'), CAtext('━━ 刷文碟(坠龙之地) ━━', '#FF9800', '12sp', true), CAswitch('刷文碟', ShuaWenDie_On, ShuaWenDie_Off), CAbutton('📖 刷文碟使用说明', function() luajava.runOnUiThread(function() pcall(function() AlGuiDialogBox.showTextDiaLog(context, "刷文碟使用说明", "什么对局都可以,进游戏后开启功能等待通知提醒即可(可能比较久3到5分钟具体等通知,开的过程可以战斗,不会分机)", "知道了") end) end) end, '#4CAF50'), }, -- 娱乐功能 { CAtext('🎮 娱乐功能', '#9C27B0', '16sp', true), CAswitch('游戏加速', GameSpeed_On, GameSpeed_Off, '活动使用'), CAtext('当前游戏加速倍速: ' .. (GAME_SPEED_VALUE or 3) .. ' 倍', '#FF9800', '12sp'), CAbutton('⚙️ 设置游戏加速倍速', SetGameSpeedValue, '#9C27B0'), CAswitch('全局加速', GlobalSpeed_On, GlobalSpeed_Off, '过检测'), CAtext('当前全局加速倍速: ' .. (GLOBAL_SPEED_MULTIPLIER or 3) .. ' 倍', '#FF9800', '12sp'), CAbutton('⚙️ 设置全局加速倍速', SetGlobalSpeedMultiplier, '#9C27B0'), CAswitch('无限跳跃', InfiniteJump_On, InfiniteJump_Off, '无限跳跃'), CAswitch('佛光美化(降魔→双龙)', BuddhaLight_On, BuddhaLight_Off), CAbutton('自定义佛光技能代码', BuddhaLight_Custom, '#2196F3'), CAswitch('火焰山替换主线关卡', FlameMountain_On, FlameMountain_Off, '替换组队关卡ID(默认1032火焰山)'), CAbutton('⚙️ 自定义关卡ID', SetFlameMountainID, '#9C27B0'), CAtext('当前关卡ID: ' .. FLAME_MOUNTAIN_ID, '#FF9800', '12sp'), CAswitch('显示变速按键(冒险关卡)', SpeedButton_On, SpeedButton_Off), CAswitch('GM模式', GM_On, GM_Off), CAtext('━━ 卖道具功能 ━━', '#FF9800', '12sp', true), CAswitch('🛒 自定义卖道具', MaiDongXi_On, MaiDongXi_Off), CAbutton('📖 查看使用说明', ShowMaiDongXiInstructions, '#2196F3'), CAtext('━━ 视奸模式 ━━', '#FF9800', '12sp', true), CAswitch('👀 视奸模式(单次执行)', Shijian_On, Shijian_Off, '点击开启执行一次,关闭无影响'), CAbutton('查看使用说明', ShowEntertainmentInstructions, '#4CAF50'), }, -- 万能修改 { CAtext('🛠️ 万能修改', '#607D8B', '16sp', true), CAbutton('启动万能修改', UniversalModify, '#2196F3'), CAbutton('一键恢复上次修改', RestoreLastModify, '#4CAF50'), CAbutton('查看攻略', ShowUniversalModifyInstructions, '#9C27B0'), }, -- 设置 { CAtext('⚙️ 设置', '#673AB7', '16sp', true), CAswitch('退出脚本', function() if SHIJIAN_BUSY then SHIJIAN_BUSY = false end if GAME_SPEED_ACTIVE then GameSpeed_Off() end if GLOBAL_SPEED_DATA then GlobalSpeed_Off() end if zuilong_gather_data then Zuilong_Gather_Off() end if step_active then StepByStep_Disable() end if BUDDHA_LIGHT_ACTIVE then BuddhaLight_Off() end if INFINITE_JUMP_ACTIVE then InfiniteJump_Off() end if MONKEY_INVINCIBLE_KILL_DATA then MonkeyInvincibleKill_Off() end if WUKONG_STRONG_REPLACE_ACTIVE then WukongStrongReplace_Off() end if MONKEY_SKILL_DATA then MonkeySkillReplace_Off() end if ALL_NO_COOLDOWN_DATA then AllNoCooldown_Off() end if NO_MANA_LIST_ITEMS then NoManaCost_Off() end if MODEL_PENETRATION_DATA then ModelPenetration_Off() end if FLAME_MOUNTAIN_DATA then FlameMountain_Off() end if ZUILONG_ROLE_INVINCIBLE_ACTIVE then ZuilongRoleInvincible_Off() end if MONSTER_FIX_ACTIVE then StopMonsterFixLoop() end if EAT_ZONGZI_DATA then EatZongzi_Off() end if POOL_MODIFY_ADDRS then PoolModify_Off() end if WHACK_A_MOLE_DATA then WhackAMole_Off() end if WIDE_SCREEN_DATA then WideScreen_Off() end if SPEED_BUTTON_DATA then SpeedButton_Off() end if GM_DATA or WaiZhuan64_GM_DATA then GM_Off() end if SHUA_WENDIE_DATA then ShuaWenDie_Off() end if ALL_INVINCIBLE_DATA then AllInvincible_Off() end if ALL_SECOND_KILL_LOOP_ACTIVE then AllSecondKill_Off() end if leftRoleData then LeftRoleEnter_Off() end if rightRoleData then RightRoleEnter_Off() end if SANSHENGCHUI_DATA then SanShengChui_Off() end if POOL_ENERGY_ADDRS then PoolEnergy_Off() end LAST_MODIFY_DATA = nil IS_LOOP_ACTIVE = false TERRAIN_LOOP_ACTIVE = false hideAllSwitches() Lock.unUi() end, function() end), CAtext('感谢方法提供过检测技术', '#2196F3', '14sp', true), CAtext('请勿破坏游戏平衡', '#666666', '12sp', true), }, }) -- 初始化悬浮窗(默认隐藏) initAllSwitches() -- 启动UI Lock.Ui(invoke, nil, function(err) print("UI错误:", err) end)