您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
9/16/2024, 8:34:24 PM
// ==UserScript== // @name Shell Shockers | Crosshair // @namespace Violentmonkey Scripts // @grant none // @version 5.0 // @author https://greasyfork.org/en/users/1361048-wish // @description 9/16/2024, 8:34:24 PM // @require https://unpkg.com/[email protected]/lib/guify.min.js // @license MIT; https://opensource.org/licenses/MIT // @match *://eggshooter.best/* // @match *://*.shellshock.io/* // @match *://*.shell.onlypuppy7.online/* // @match *://*.algebra.best/* // @match *://*.algebra.vip/* // @match *://*.biologyclass.club/* // @match *://*.deadlyegg.com/* // @match *://*.deathegg.world/* // @match *://*.eggboy.club/* // @match *://*.eggboy.xyz/* // @match *://*.eggcombat.com/* // @match *://*.egg.dance/* // @match *://*.eggfacts.fun/* // @match *://*.egghead.institute/* // @match *://*.eggisthenewblack.com/* // @match *://*.eggsarecool.com/* // @match *://*.geometry.best/* // @match *://*.geometry.monster/* // @match *://*.geometry.pw/* // @match *://*.geometry.report/* // @match *://*.hardboiled.life/* // @match *://*.hardshell.life/* // @match *://*.humanorganising.org/* // @match *://*.mathactivity.xyz/* // @match *://*.mathactivity.club/* // @match *://*.mathdrills.info/* // @match *://*.mathdrills.life/* // @match *://*.mathfun.rocks/* // @match *://*.mathgames.world/* // @match *://*.math.international/* // @match *://*.mathlete.fun/* // @match *://*.mathlete.pro/* // @match *://*.overeasy.club/* // @match *://*.risenegg.com/* // @match *://*.scrambled.tech/* // @match *://*.scrambled.today/* // @match *://*.scrambled.us/* // @match *://*.scrambled.world/* // @match *://*.shellshockers.club/* // @match *://*.shellshockers.life/* // @match *://*.shellshockers.site/* // @match *://*.shellshockers.us/* // @match *://*.shellshockers.world/* // @match *://*.shellshockers.xyz/* // @match *://*.shellsocks.com/* // @match *://*.softboiled.club/* // @match *://*.urbanegger.com/* // @match *://*.violentegg.club/* // @match *://*.violentegg.fun/* // @match *://*.yolk.best/* // @match *://*.yolk.life/* // @match *://*.yolk.rocks/* // @match *://*.yolk.tech/* // @match *://*.yolk.quest/* // @match *://*.yolk.today/* // @match *://*.zygote.cafe/* // @match *://*.shellshockers.best/* // @match *://*.eggboy.me/* // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/tweakpane.min.js // @require https://cdn.jsdelivr.net/npm/@tweakpane/[email protected]/dist/tweakpane-plugin-essentials.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js // // @run-at document-end // ==/UserScript== (function () { function waitForElement(selector) { return new Promise((resolve) => { const intervalId = setInterval(() => { const element = document.getElementById(selector); console.log("looking for", selector); if (element) { console.dir(`found: ${element}`); clearInterval(intervalId); resolve(element); } }, 100); }); } waitForElement("crosshairContainer").then((e) => { const tp = { mainCH: { color: "#fff", length: 0.8, width: 0.3, opacity: 0.7, border: "#000000", rotate: 0, }, middleDot: { opacity: 1, color: "#000", border: "#000", size: 0.3, round: false, shape: "Dot", length: 0.5, width: 0.5, }, paneSettings: { width: 300, tabout: "`", hidePanel: "h", }, }; function createFolders(NFolder) { let test = pane.addFolder({ title: NFolder, expanded: false, }); return test; } function createInput(folder, obj, property, options, callback) { const x = folder.addInput(obj, property, options).on("change", callback); return x; } const makeDraggable = function (element, notMenu) { if (element) { let offsetX, offsetY; element.addEventListener("mousedown", function (e) { const dragElement = function (e) { const x = ((e.clientX - offsetX) / unsafeWindow.innerWidth) * 100; const y = ((e.clientY - offsetY) / unsafeWindow.innerHeight) * 100; const maxX = 100 - (element.offsetWidth / unsafeWindow.innerWidth) * 100; const maxY = 100 - (element.offsetHeight / unsafeWindow.innerHeight) * 100; element.style.left = `${Math.max(0, Math.min(x, maxX))}%`; element.style.top = `${Math.max(0, Math.min(y, maxY))}%`; }; if (notMenu || e.target.classList.contains("tp-rotv_t")) { offsetX = e.clientX - element.getBoundingClientRect().left; offsetY = e.clientY - element.getBoundingClientRect().top; document.addEventListener("mousemove", dragElement); document.addEventListener("mouseup", function () { document.removeEventListener("mousemove", dragElement); }); e.preventDefault(); // Prevent text selection during drag } }); } }; function loadExistingSettings(name, target, callback) { const stuff = localStorage.getItem(name); if (stuff) { const parsed = JSON.parse(stuff); Object.assign(target, parsed); if (typeof callback === "function") callback(); } } function addInputWithValidation(folder, obj, property, label) { const df = structuredClone(obj[property]); folder.addInput(obj, property, { label: label }).on("change", (value) => { if (value.value.length > 1) { value.value = df; obj[property] = df; console.log(obj[property]); value.target.controller_.binding.value.rawValue_ = df; unsafeWindow.alert("Please enter a single key"); } else { const store = value.value.replace(/"/g, ""); localStorage.setItem(`tp-${property}`, store); } }); } const changeMainCH = (obj) => { const previousStyle = document.getElementById("custom-mainCH"); const containerCH = document.getElementById("crosshairContainer"); containerCH.style.transform = `rotate(${obj.rotate}deg)`; if (previousStyle) { previousStyle.remove(); } // Create a new stylesheet const style = document.createElement("style"); style.id = "custom-mainCH"; style.innerHTML = ` .crosshair { position: absolute; transform-origin: 50% top; top: 50%; border: solid 0.05em ${obj.border}; height: ${obj.length}em; opacity: ${obj.opacity}; transform: rotate(${obj.angle || 0}deg); } .crosshair.normal { left: calc(50% - ${obj.width / 2}em); background: ${obj.color}; width: ${obj.width}em; } .crosshair.powerful { left: calc(50% - ${obj.width / 2}em); background: red; width: ${obj.width}em; } .shotReticle.fill.normal { border-color: ${obj.color}; border-left: solid transparent; border-right: solid transparent; border-width: 0.18em; padding: 0.18em; } `; document.body.appendChild(style); }; const changeMiddleDot = (obj) => { const previousStyle = document.getElementById("custom-middleDot"); if (previousStyle) previousStyle.remove(); const dot = document.getElementById("reticleDot"); dot.innerHTML = ""; const style = document.createElement("style"); style.id = "custom-middleDot"; if (obj.shape === "plus") { style.innerHTML = ` #reticleDot { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 0; height: 0; background: none !important; border: none !important; opacity: ${obj.opacity}; } #reticleDot .bar { position: absolute; background-color: ${obj.color}; border: solid 0.05em ${obj.border} } #reticleDot .bar.horizontal { top: 50%; left: 50%; width: ${obj.width}px; height: ${obj.length}px; transform: translate(-50%, -50%) rotate(90deg); } #reticleDot .bar.vertical { left: 50%; top: 50%; width: ${obj.width}px; height: ${obj.length}px; transform: translate(-50%, -50%); } `; dot.innerHTML = ` <div class="bar horizontal"></div> <div class="bar vertical"></div> `; } else { style.innerHTML = ` #reticleDot { display: block; position: absolute; transform: translate(-50%, -50%); top: 50%; left: 50%; background-color: ${obj.color}; border: solid 0.05em ${obj.border}; width: ${obj.size}em; height: ${obj.size}em; opacity: ${obj.opacity}; ${obj.round ? "border-radius: 100%;" : ""} } `; } document.body.appendChild(style); }; const Tweakpane = window.Tweakpane; const pane = new Tweakpane.Pane({ title: "WISH", expanded: true, }); const paneEl = document.querySelector("div.tp-dfwv"); paneEl.style.zIndex = 1000; paneEl.style.width = `300px`; makeDraggable(document.querySelector(".tp-dfwv")); const folderMainCH = createFolders("Crosshair"); const folderMiddleDot = createFolders("Middle Dot"); const folderPaneSettings = createFolders("Panel Settings"); loadExistingSettings("tp-mainCH", tp.mainCH, () => changeMainCH(tp.mainCH)); loadExistingSettings("tp-middleDot", tp.middleDot, () => changeMiddleDot(tp.middleDot)); loadExistingSettings("tp-paneSettings", tp.paneSettings, () => { const paneEl = document.querySelector("div.tp-dfwv"); paneEl.style.width = `${tp.paneSettings.width}px`; }); createInput(folderMainCH, tp.mainCH, "color", { label: "Color" }, () => {}); createInput(folderMainCH, tp.mainCH, "border", { label: "Border Color" }, () => {}); createInput(folderMainCH, tp.mainCH, "length", { label: "Length", min: 0, max: 10, step: 0.1 }, () => {}); createInput(folderMainCH, tp.mainCH, "width", { label: "Width", min: 0, max: 10, step: 0.1 }, () => {}); createInput(folderMainCH, tp.mainCH, "opacity", { label: "Opacity", min: 0, max: 1, step: 0.01 }, () => {}); createInput(folderMainCH, tp.mainCH, "rotate", { label: "Rotate", min: 0, max: 360, step: 1.0 }, () => {}); folderMainCH.on("change", (data) => { localStorage.setItem("tp-mainCH", JSON.stringify(tp.mainCH)); changeMainCH(tp.mainCH); }); createInput(folderMiddleDot, tp.middleDot, "color", { label: "Color" }, () => {}); createInput(folderMiddleDot, tp.middleDot, "border", { label: "Border Color" }, () => {}); const s = createInput(folderMiddleDot, tp.middleDot, "size", { label: "Size", min: 0, max: 5, step: 0.1 }, () => {}); const r = createInput(folderMiddleDot, tp.middleDot, "round", { label: "Round" }, () => {}); createInput(folderMiddleDot, tp.middleDot, "opacity", { label: "Opacity", min: 0, max: 1, step: 0.01 }, () => {}); createInput( folderMiddleDot, tp.middleDot, "shape", { view: "list", label: "Shape", options: [ { text: "Dot", value: "dot" }, { text: "Plus", value: "plus" }, ], }, () => {} ); const i = createInput(folderMiddleDot, tp.middleDot, "length", { label: "Length", min: 0, max: 100, step: 1 }, () => {}); const x = createInput(folderMiddleDot, tp.middleDot, "width", { label: "Width", min: 0, max: 5, step: 0.1 }, () => {}); if (tp.middleDot.shape === "dot") { i.disabled = true; x.disabled = true; } else { s.disabled = true; r.disabled = true; } folderMiddleDot.on("change", (data) => { localStorage.setItem("tp-middleDot", JSON.stringify(tp.middleDot)); changeMiddleDot(tp.middleDot); // console.log(tp.middleDot); if (tp.middleDot.shape === "dot") { i.disabled = true; x.disabled = true; s.disabled = false; r.disabled = false; } else { i.disabled = false; x.disabled = false; s.disabled = true; r.disabled = true; } }); addInputWithValidation(folderPaneSettings, tp.paneSettings, "hidePanel", "Hide Panel"); addInputWithValidation(folderPaneSettings, tp.paneSettings, "tabout", "Tabout"); createInput(folderPaneSettings, tp.paneSettings, "width", { label: "Panel Width", min: 300, max: 1000, step: 1 }, () => {}); folderPaneSettings.on("change", (data) => { setTimeout(() => { const paneEl = document.querySelector("div.tp-dfwv"); paneEl.style.width = `${tp.paneSettings.width}px`; localStorage.setItem("tp-paneSettings", JSON.stringify(tp.paneSettings)); }, 1000); }); let oldPointerLock; let disable = () => { if (document.onpointerlockchange == null) return; oldPointerLock = document.onpointerlockchange; document.onpointerlockchange = null; document.exitPointerLock(); }; let enable = () => { if (document.onpointerlockchange) return; canvas.requestPointerLock(); document.onpointerlockchange = oldPointerLock; }; let handle = (event) => { let isPaused = vueApp?.game?.isPaused; let chatOpened = document.activeElement.id == "chatIn"; if (chatOpened || isPaused) return; // hopefully this also helps prevent people from spamming it let inGame = extern?.inGame; // uncertain if this is needed? if (!inGame) return; document.onpointerlockchange == null ? enable() : disable(); // toggle :blobshrug: }; document.addEventListener("keydown", (event) => { if (event.key === tp.paneSettings.hidePanel) { let chatOpened = document.activeElement.id == "chatIn"; if (chatOpened) return; const element = document.querySelector(".tp-dfwv"); element.style.display = element.style.display === "none" ? "block" : "none"; } if (event.key === tp.paneSettings.tabout) { handle(event); } }); }); })();