您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Some auto and enhance tools in CyberCode Online.
// ==UserScript== // @name CyberCode Online Tools (Deprecated) // @namespace - // @version 0.1.2-prototype-core-seperated-parameters // @description Some auto and enhance tools in CyberCode Online. // @author LianSheng // @match https://cybercodeonline.com/* // @grant none // ==/UserScript== (function () { 'use strict'; //////////////////////////////////////// const CONFIG = { targetLevel: 70, loggingLevel: 1, repairCycle: 20, run: true } //////////////////////////////////////// let calcTargetLevel = CONFIG.targetLevel; if (CONFIG.targetLevel % 10 === 0) { calcTargetLevel--; } let refreshChecker; let logType = { important: true, info: true, verbose: false, danger: true, error: true }; // 0: none, 1: info, 2: debug. let loggingLevel = CONFIG.loggingLevel; let lastPosition = { code: -1, type: "INIT" }; // common date: store all major variables. let commonData = {}; let lastTakeAll = 0; // timeout id let lastRepair = 0; // timestamp let lastRepairCount = 0; const repairCycle = CONFIG.repairCycle; // left bottom bar version status; let changeStatus = { originVer: "", changed: false }; commonData.run = {}; commonData.run.allowClick = CONFIG.run; /** * Do `element.click()` if allow click now. * @param {[Node]} element * @param {[boolean]} [force=false] */ commonData.run.click = (element, force=false) => { if(force) { element.click(); } else { if (commonData.run.allowClick) { element.click(); } } } // type: 0 string, 1 object function log(data, type = 0, more = "") { if (loggingLevel == 1) { let prefix = "[CCOT INFO]" if (type == 0) { console.log(`%c${prefix} %c${data}`, "color: lightblue", "color: default"); } } else if (loggingLevel == 2) { if (type == 0) { let prefix = "[CCOT INFO]" console.log(`%c${prefix} %c${data}`, "color: green", "color: default"); } else { let prefix = "[CCOT DEBUG]" let additionalMessage = ""; if (more != "") additionalMessage = `(${more})`; console.log(`%c${prefix} %c${additionalMessage}\n`, "color: orange", "color: default", data); } } } // check now scene. function checkScenario(container) { let all = container.innerText.replace(/\n/g, ""); let newPosition; if (all.includes("---- Nearby Enemies ----")) { newPosition = { code: 0, type: "Nearby Enemies" }; } else if (all.includes("---- You ----")) { newPosition = { code: 1, type: "Enemy Battle" }; } else if (all.includes("---- Enemy drops ----")) { newPosition = { code: 2, type: "Enemy Drops" }; } else if (all.includes("[Central Hub]") && all.includes("SHANGRI_LA_CITY_CENTER")) { newPosition = { code: 3, type: "SHANGRI_LA_CITY_CENTER" }; } else if (all.includes("exportclassWeaponSmithextendsNPC")) { newPosition = { code: 4, type: "WeaponSmith" }; } else if (all.includes("currentLocation=Location.HYPER_TRAIN_CENTRAL_STATION")) { newPosition = { code: 5, type: "MAIN_STATION" }; } else if (all.includes("---- Travel ----") && !all.includes("---- Market ----")) { newPosition = { code: 6, type: "SUB_STATION" }; } else { newPosition = { code: 999, type: "Unknown" }; } if (newPosition.code == lastPosition.code) { if ([1, 3, 4].includes(lastPosition.code)) { log(`Scenario Transfer: ${lastPosition.type} (${lastPosition.code}) -> ${newPosition.type} (${newPosition.code})`); lastPosition = newPosition; changeLeftBottomBarStatus(); return newPosition; } else { newPosition = { code: 999, type: "Unknown" }; return newPosition; } } else { log(`Scenario Transfer: ${lastPosition.type} (${lastPosition.code}) -> ${newPosition.type} (${newPosition.code})`); lastPosition = newPosition; changeLeftBottomBarStatus(); return newPosition; } } // change left bottom status string. function changeLeftBottomBarStatus() { let target = document.querySelector("div[class*=BottomBar_container] p:first-child"); let status; if (!changeStatus.changed) { changeStatus.changed = true; changeStatus.originVer = target.innerText; } if (commonData.run.allowClick) { status = "Running"; } else { status = "Ready"; } let progressEquals = Math.min(Math.floor((lastRepairCount / repairCycle) * 10), repairCycle, 9); let progressDash = Math.max(9 - progressEquals, 0); progressEquals = "<span>=</span>".repeat(progressEquals); progressDash = "-".repeat(progressDash); let progress = `CCOT: [${progressEquals}<span>></span>${progressDash}] (${lastRepairCount}/${repairCycle})`; let nowPlace = `${lastPosition.type} (#${lastPosition.code})`; let newStatus = `${changeStatus.originVer} | ${status} | ${progress} | ${nowPlace}`; target.innerHTML = newStatus; } // main function function main(mr) { let mainContainer = commonData.mainContainer; let click = commonData.run.click; let records = Object.values(mr); let filterTips; if (mr != "INIT") { filterTips = records.filter(each => { let modified = [...each.addedNodes].concat([...each.removedNodes])[0]; try { return modified.className.match("CodeToolTip_toolTip") != null } catch (e) { return false; } }); // log(`Refresh Checker Report: // There are total ${records.length} node(s) was changed. Includes: // - Tips : x${filterTips.length} // - Other: x${records.length - filterTips.length}`); // log(records, 1, "Mutation Records"); } else { filterTips = []; } // Exclude tips only. if (records.length > filterTips.length) { // {code: xxx, type: "xxxxx"} let nowScenario = checkScenario(mainContainer); let p = [...mainContainer.querySelectorAll("p")]; let p2 = [...mainContainer.querySelectorAll("p[class*=clickable]")]; if (nowScenario.code == 0) { log(lastRepairCount, 1); lastRepairCount++; clearTimeout(lastTakeAll); if (lastRepairCount >= repairCycle) { let action = p.filter(each => each.innerText == "backToCityCenter")[0]; click(action); } else { let target = calcTargetLevel; let action = p2.filter(each => each.innerText.includes(`_lv${target}`)); if (action.length > 0) { click(action[0]); } else { // Make sure to continue to trigger event of MutationObserver. log("Target level not found, back to city center. (Extremely rare.)"); let action = p.filter(each => each.innerText == "backToCityCenter")[0]; click(action); } } } else if (nowScenario.code == 1) { let action = p2.filter(each => each.innerText == "primaryAttack")[0]; click(action); } else if (nowScenario.code == 2) { // only take specific loot. let exclude = ["trash", "highQuality", "energyCell", "antiMatterCharge"]; let include = ["highQualityUpgrade"]; let loots = [...mainContainer.querySelectorAll("div[style*='cursor: pointer;'] p[style*='color: rgb(135, 189, 217);']")]; let skipExclude = loots.filter(each => { for (let i = 0; i < exclude.length; i++) { if (each.innerText.includes(exclude[i])) return false; } return true; }); let onlyInclude = loots.filter(each => { for (let i = 0; i < include.length; i++) { if (each.innerText.includes(include[i])) return true; } return false; }); let wannaTake = skipExclude.concat(onlyInclude); wannaTake = [...new Set(wannaTake)]; if (wannaTake.length > 0) { wannaTake.map(each => click(each)); } else { let action = p2.filter(each => each.innerText == "close")[0]; click(action); } lastTakeAll = setTimeout(() => { log("Reach inventory max, cannot take more drop. Closed."); let action = p2.filter(each => each.innerText == "close")[0]; click(action); }, 5000); } else if (nowScenario.code == 3) { if (lastPosition.code == -1 || Date.now() - lastRepair >= 60000 || lastRepairCount >= repairCycle) { let action = p.filter(each => each.innerText == "weaponSmith")[0]; click(action); lastRepair = Date.now(); } else { let action = p2.filter(each => each.innerText == "goToHyperTrainCentralStation")[0]; click(action); } } else if (nowScenario.code == 4) { if (Date.now() - lastRepair >= 60000 || lastRepairCount >= repairCycle) { // repair lastRepairCount = 0; let action = p2.filter(each => each.innerText == "repairAllEquipped"); if (action.length > 0) { log("Weapon Smith: repaired all equipments.") click(action[0]); } else { log("Weapon Smith: nothing to repair.") } } else { // back setTimeout(() => { let action = [...document.querySelectorAll("span[style*='color']")].filter(each => each.innerText == "Surrounding.ts")[0]; click(action); }, 1500); } } else if (nowScenario.code == 5) { let target = Math.floor(calcTargetLevel / 10); let action = p2.filter(each => each.innerText.includes("goTo"))[target]; click(action); } else if (nowScenario.code == 6) { let target = Math.floor((calcTargetLevel % 10 - 1) / 3); console.log(target); let action = p2.filter(each => each.innerText.includes("goTo"))[target]; click(action); } } } let id = setInterval(() => { let click = commonData.run.click; if (!refreshChecker && document.querySelector("div[style='flex-direction: row; flex: 1 1 0%;'] > div[style='flex: 1 1 0%;']")) { clearInterval(id); // Add Leftbar 'SET' button. let setHTML = `<div style="box-sizing: border-box; cursor: pointer; width: 100%; height: 50px; justify-content: center; align-items: center; position: relative; user-select: none;">SET</div>`; document.querySelector("div[class^='NavBar_navBar'] > div > div").insertAdjacentHTML("beforeend", setHTML); log(`Leftbar 'SET' button added.`); // Main Container commonData.mainContainer = document.querySelector("div[style='flex-direction: row; flex: 1 1 0%;'] > div[style='flex: 1 1 0%;']"); // Left Sidebar commonData.left = {}; commonData.left._buttonStat = document.querySelector("div[class^='NavBar_navBar'] > div > div > div:nth-child(1)"); commonData.left._buttonBranch = document.querySelector("div[class^='NavBar_navBar'] > div > div > div:nth-child(2)"); commonData.left._buttonMail = document.querySelector("div[class^='NavBar_navBar'] > div > div > div:nth-child(3)"); commonData.left._buttonDiscord = document.querySelector("div[class^='NavBar_navBar'] > div > div > div:nth-child(4)"); commonData.left.buttonSetting = document.querySelector("div[class^='NavBar_navBar'] > div > div > div:nth-child(5)"); commonData.left.container = document.querySelector("div[class^='NavBar_navBar'] > div:nth-child(2)"); // click event commonData.left.buttonSetting.onclick = () => { // using discord's container click(commonData.left._buttonDiscord, true); log(commonData.left, 1); // commonData.left._buttonDiscord.firstElementChild.style.display = "none"; let title = commonData.left.container.querySelector(":nth-child(1)"); let body = commonData.left.container.querySelector(":nth-child(2)"); let foot = commonData.left.container.querySelector(":nth-child(3)"); title.innerText = "Setting"; body.innerHTML = ""; foot.innerHTML = ""; } main("INIT"); refreshChecker = new MutationObserver(mr => { try { main(mr); } catch (e) { log(e.message); } }); refreshChecker.observe(commonData.mainContainer, { "childList": true, "subtree": true }); log(`Refresh checker binded.`); } }, 100); })();