Shell Shockers Hide FPS

Hide FPS and uncap it (FAKE)

当前为 2024-12-24 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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/[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
// @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';
    }
  })
 
 
})();