- // ==UserScript==
- // @name Shell Shockers Hide FPS
- // @license GPL-3.0
- // @version 1.3.1
- // @author wish?
- // @grant none
- // @run-at document-start
- // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
- // @require https://cdn.jsdelivr.net/npm/tweakpane@3.1.10/dist/tweakpane.min.js
- // @require https://cdn.jsdelivr.net/npm/@tweakpane/plugin-essentials@0.1.8/dist/tweakpane-plugin-essentials.min.js
- // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js
- // @description Hide FPS and uncap it (FAKE)
- //
- //
- // @match *://eggshooter.best/*
- // @match *://*.shellshock.io/*
- // @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/*
- // @namespace https://greasyfork.org/users/1361048
- // ==/UserScript==
-
- (function () {
- let originalReplace = String.prototype.replace;
-
- String.prototype.originalReplace = function () {
- return originalReplace.apply(this, arguments);
- };
-
- const originalXHROpen = XMLHttpRequest.prototype.open;
- const originalXHRGetResponse = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "response");
- let shellshockjs;
- XMLHttpRequest.prototype.open = function (...args) {
- const url = args[1];
- if (url && url.includes("js/shellshock.js")) {
- shellshockjs = this;
- }
- originalXHROpen.apply(this, args);
- };
- Object.defineProperty(XMLHttpRequest.prototype, "response", {
- get: function () {
- if (this === shellshockjs) {
- return applyLibertyMutual(originalXHRGetResponse.get.call(this));
- }
- return originalXHRGetResponse.get.call(this);
- },
- });
- //VAR STUFF
- let F = [];
- let H = {};
- let functionNames = [];
- let tp = {
- hideFPS: {
- hide: JSON.parse(localStorage.getItem('tp-hideFPS')) || false,
- min: JSON.parse(localStorage.getItem('tp-minFPS')) || 20,
- max: JSON.parse(localStorage.getItem('tp-maxFPS')) || 200,
- random: JSON.parse(localStorage.getItem('tp-randomFPS')) || false,
- }
- };
-
- function createFolders(NFolder) {
- let test = pane.addFolder({
- title: NFolder,
- expanded: false,
- });
- return test
- };
-
- function hideFPS(value) {
- let fpsCounter = document.querySelector('#FPS');
- if (value) {
- if (fpsCounter) {
- fpsCounter.style.display = 'none';
- }
- } else {
- fpsCounter.style.display = 'block';
- }
- };
-
- function randomise(min, max, active) {
- if (active) {
-
- const randomFPS = Math.floor(Math.random() * (max - min + 1)) + min;
-
- let fpsCounter = document.querySelector('#FPS');
- if (fpsCounter) {
- fpsCounter.textContent = randomFPS;
- }
- }
- };
-
- 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
- }
- });
- }
- };
-
- //scrambled... geddit????
- const getScrambled = function () {
- return Array.from({ length: 10 }, () => String.fromCharCode(97 + Math.floor(Math.random() * 26))).join("");
- };
- const createAnonFunction = function (name, func) {
- const funcName = getScrambled();
- window[funcName] = func;
- F[name] = window[funcName];
- functionNames[name] = funcName;
- };
-
- const findKeyWithProperty = function (obj, propertyToFind) {
- for (const key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (key === propertyToFind) {
- return [key];
- } else if (typeof obj[key] === "object" && obj[key] !== null && obj[key].hasOwnProperty(propertyToFind)) {
- return key;
- }
- }
- }
- // Property not found
- return null;
- };
- const fetchTextContent = function (url) {
- var xhr = new XMLHttpRequest();
- xhr.open("GET", url, false); // Make the request synchronous
- xhr.send();
- if (xhr.status === 200) {
- return xhr.responseText;
- } else {
- console.error("Error fetching text content. Status:", xhr.status);
- return null;
- }
- };
-
-
- const applyLibertyMutual = function (js) {
- let hash = CryptoJS.SHA256(js).toString(CryptoJS.enc.Hex);
- let clientKeys;
- onlineClientKeys = fetchTextContent("https://raw.githubusercontent.com/StateFarmNetwork/client-keys/main/statefarm_" + hash + ".json"); //credit: me :D
-
- clientKeys = JSON.parse(onlineClientKeys);
-
- H = clientKeys.vars;
-
- let injectionString = "";
-
- const modifyJS = function (find, replace) {
- let oldJS = js;
- js = js.originalReplace(find, replace);
- if (oldJS !== js) {
- console.log(
- "%cReplacement successful! Injected code: " + replace,
- "color: green; font-weight: bold; font-size: 0.6em; text-decoration: italic;"
- );
- } else {
- console.log(
- "%cReplacement failed! Attempted to replace " + find + " with: " + replace,
- "color: red; font-weight: bold; font-size: 0.6em; text-decoration: italic;"
- );
- }
- };
-
- console.log("%cATTEMPTING TO START ????", "color: magenta; font-weight: bold; font-size: 1.5em; text-decoration: underline;");
- const variableNameRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
- for (let name in H) {
- deobf = H[name];
- if (variableNameRegex.test(deobf)) {
- injectionString = `${injectionString}${name}: (() => { let variable = "value_undefined"; try { eval("variable = ${deobf};"); } catch (error) { return "value_undefined"; }; return variable; })(),`;
- } else {
-
- }
- }
- const f = function (varName) {
- return varName.replace("$", "\\$");
- };
- const FUNCTIONPARAM = new RegExp("function " + f(H._connectFail) + "\\(([a-zA-Z$_]+)\\)").exec(js)[1];
- console.log(injectionString);
- console.log(
- "%cSOUNDS INJECTION: INJECT VAR RETRIEVAL FUNCTION AND MAIN LOOP",
- "color: yellow; font-weight: bold; font-size: 1.2em; text-decoration: underline;"
- );
-
- modifyJS(H.SCENE + ".render", `window["${functionNames.retrieveFunctions}"]({${injectionString}},true)||${H.SCENE}.render`);
-
- console.log(H);
- return js;
- };
-
- createAnonFunction("retrieveFunctions", function (vars) {
- ss = vars;
- window.globalSS = ss;
-
- F.HIDEFPS();
- });
-
-
-
- createAnonFunction("HIDEFPS", function () {
- ss.PLAYERS.forEach((PLAYER) => {
- if (PLAYER.hasOwnProperty("ws")) {
- ss.MYPLAYER = PLAYER;
- };
- hideFPS(tp.hideFPS.hide);
- randomise(tp.hideFPS.min, tp.hideFPS.max, tp.hideFPS.random)
-
- });
-
- H.actor = findKeyWithProperty(ss.MYPLAYER, H.mesh);
- });
-
-
- const Tweakpane = window.Tweakpane;
- const pane = new Tweakpane.Pane({
- title: "Hide FPS",
- expanded: true,
- });
- const paneEl = document.querySelector("div.tp-dfwv");
- paneEl.style.zIndex = 1000;
- paneEl.style.width = "300px";
-
- function createInput(obj, property, options, callback) {
- pane.addInput(obj, property, options).on('change', callback)
- };
-
- makeDraggable(document.querySelector(".tp-dfwv"));
-
-
- createInput(tp.hideFPS, 'hide', {label: 'Hide FPS'}, (value) => {
- localStorage.setItem('tp-hideFPS', JSON.stringify(value.value));
- });
- createInput(tp.hideFPS, 'random', {label: 'Randomise FPS'}, (value) => {
- localStorage.setItem('tp-randomFPS', JSON.stringify(value.value))
- })
- createInput(tp.hideFPS, 'min', {label: 'Min FPS', view:'slider', min: 1, max: 999, step:1}, (value) => {
- localStorage.setItem('tp-minFPS', JSON.stringify(value.value))
- });
- createInput(tp.hideFPS, 'max', {label: 'Max FPS', view:'slider', min: 1, max: 999, step:1}, (value) => {
- localStorage.setItem('tp-maxFPS', JSON.stringify(value.value))
- });
-
-
- document.addEventListener('keydown', (e) => {
- if (e.key === 'h') {
- const element = document.querySelector('.tp-dfwv');
- element.style.display = element.style.display === 'none' ? 'block' : 'none';
- }
- })
-
-
- })();