// ==UserScript== // @name Shell Shockers advanced sounds // @description Change your weapon sounds - Shell Shockers // @license GPL-3.0 // @version 1.3.1 // @author wish? // @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/* // @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 // @namespace https://greasyfork.org/users/1361048 // @downloadURL none // ==/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 sounds = {}; let keyRetrieved = false; let weaponKey; let updatedKey; let myWeapon; //TWEAKPANE VARIABLES const tp = { soundsFolder: { crackshot: "default", "egg-k": "default", scrambler: "default", "free-ranger": "default", rpegg: "default", whipper: "default", "tri-hard": "default", pistol: "default", }, meleeSounds: { melee: 'default' }, bindsFolder: { hidePanel: localStorage.getItem('tp-hidePanel') || 'h', refreshSounds: localStorage.getItem('tp-refreshSounds') || 'g', } }; const savedFolder = JSON.parse(localStorage.getItem('customSounds')); if (savedFolder) { tp.soundsFolder = savedFolder } let updatedNeeded = false; //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 SOUNDS", "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}: (() => { try { return ${deobf}; } catch (error) { return "value_undefined"; } })(),`; } else { alert( "Message from the NO Devs: WARNING! The keys inputted contain non-variable characters! There is a possibility that this could run code unintended by the NO team, although possibly there is also a mistake. Do NOT proceed with using this, and report to the NO developers what is printed in the console." ); console.log("REPORT THIS IN THE DISCORD SERVER:", clientKeys); const crashplease = "balls"; crashplease = "balls2"; } } 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.SOUNDS(); }); createAnonFunction("SOUNDS", function () { ss.PLAYERS.forEach((PLAYER) => { if (PLAYER.hasOwnProperty("ws")) { ss.MYPLAYER = PLAYER; } if (ss.MYPLAYER) { const myWeapon = window.globalSS.MYPLAYER.weapon; if (!keyRetrieved) { Object.keys(myWeapon).forEach((key)=>{ const thing = myWeapon[key]; if (thing?.fireSound) { weaponKey = thing; updatedKey = key; window.globalKey = updatedKey; } }); } if (updatedNeeded) { if (weaponKey.standardMeshName === 'gun_m24') { weaponKey.fireSound = `gun_m24_${tp.soundsFolder.crackshot}` } if (weaponKey.standardMeshName === 'gun_eggk47') { weaponKey.fireSound = `gun_eggk47_${tp.soundsFolder['egg-k']}`; } if (weaponKey.standardMeshName === 'gun_dozenGauge') { weaponKey.fireSound = `gun_dozenGauge_${tp.soundsFolder['scrambler']}`; } if (weaponKey.standardMeshName === 'gun_csg1') { weaponKey.fireSound = `gun_csg1_${tp.soundsFolder['free-ranger']}`; } if (weaponKey.standardMeshName === 'gun_rpegg') { weaponKey.fireSound = `gun_rpegg_${tp.soundsFolder['rpegg']}`; } if (weaponKey.standardMeshName === 'gun_smg') { weaponKey.fireSound = `gun_smg_${tp.soundsFolder['whipper']}`; } if (weaponKey.standardMeshName === 'gun_aug') { weaponKey.fireSound = `gun_aug_${tp.soundsFolder['tri-hard']}`; } // MELEE globalSS.MYPLAYER.meleeWeapon[updatedKey].swingSounds = tp.meleeSounds['melee']; // PISTOL globalSS.MYPLAYER.weapons[1][updatedKey].fireSound = `gun_cluck9mm_${tp.soundsFolder['pistol']}`; updatedNeeded = false; } } }); H.actor = findKeyWithProperty(ss.MYPLAYER, H.mesh); }); // MAKE ELEMENT DRAGGABLE 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 } }); } }; //TWEAKPANE CODE const Tweakpane = window.Tweakpane; const pane = new Tweakpane.Pane({ title: "WISH", expanded: true, }); const paneEl = document.querySelector("div.tp-dfwv"); paneEl.style.zIndex = 100000; paneEl.style.width = "300px"; makeDraggable(document.querySelector(".tp-dfwv")); //FUNCTION TO CREATE FOLDERS function createFolders(NFolder) { let test = pane.addFolder({ title: NFolder, expanded: false, }); return test } // CREATE FOLDERS const soundsFolder = createFolders('Sounds'); const addSettings = createFolders('Additional Settings'); const bindsFolder = createFolders('Binds'); // ADD BLADES soundsFolder.addInput(tp.soundsFolder, "crackshot", { label: 'Crackshot', options: { Default: "fire", Valkyrie: "Valkyrie_fire", Chess: 'Chess_fire', Retro: 'Retro_fire', BadEgg: 'Badegg_fire', Cyborg: 'Cyborg_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Infernal: 'Infernal_fire', Quack: 'Quackshot_fire', Scavenger: 'Scavenger_fire', '8bit': 'fire_m24_8bit', 'Silenced (Fake)': '', }, }); soundsFolder.addInput(tp.soundsFolder, "egg-k", { label: 'Egg-k', options: { Default: "fire", Alien: "Alien_fire", Retro: 'Retro_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Infernal: 'Infernal_fire', Steambot: 'Steambot_fire', Valkyrie: 'Valkyrie_fire', Chocolate: 'Chocolate_fire', 'Infernal-2': 'Infernal2_fire' }, }); soundsFolder.addInput(tp.soundsFolder, "scrambler", { label: 'Scrambler', options: { Default: "fire", Irish: "Irish_fire", Retro: 'Retro_fire', Clouds: 'Clouds_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Fantasy: 'Fantasy_fire', Octopus: 'Octopus_fire', Infernal: 'Infernal_fire', Steambot: 'Steambot_fire', Valkyrie: 'Valkyrie_fire', Basketball: 'Basketball_fire', }, }); soundsFolder.addInput(tp.soundsFolder, "free-ranger", { label: 'Free-Ranger', options: { Default: "fire", Retro: 'Retro_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Infernal: 'Infernal_fire', 'Space-Egg': 'spaceEgg_fire', Steambot: 'Steambot_fire', Valkyrie: 'Valkyrie_fire', Shellpreme: 'Shellpreme_fire', RubberChicken: 'RubberChicken_fire', }, }); soundsFolder.addInput(tp.soundsFolder, "rpegg", { label: 'Rpegg', options: { Default: "fire", Retro: 'Retro_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Infernal: 'Infernal_fire', 'Skeleton': 'Skeleton_fire', Valkyrie: 'Valkyrie_fire', Christmas: 'Christmas_fire' }, }); soundsFolder.addInput(tp.soundsFolder, "whipper", { label: 'Whipper', options: { Default: "fire", Retro: 'Retro_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Pumpkin: 'Pumpkin_fire', Infernal: 'Infernal_fire', Valkyrie: 'Valkyrie_fire', 'Special-Turkey': 'SpecialTurkey_fire', }, }); soundsFolder.addInput(tp.soundsFolder, "tri-hard", { label: 'Tri-Hard', options: { Default: "fire", Cupid: 'Cupid_fire', Fusion: 'Fusion_fire', Retro: 'Retro_fire', Infernal: 'Infernal_fire', 'Techno': 'Techno_fire_a', 'Techno-B': 'Techno_fire_b', Valkyrie: 'Valkyrie_fire', Pumpkinpie: 'Pumpkinpie_fire', }, }); soundsFolder.addInput(tp.meleeSounds, "melee", { label: 'Melee', options: { Default: ["melee_whisk_a"], Carver: ['melee_carver'], Cup: ['melee_cup_a', 'melee_cup_b'], Eggpan: ['melee_eggpan'], Elf: ['melee_elf_a', 'melee_elf_b'], Fish: ['melee_gfish_a', 'melee_gfish_b'], Harrison: ['melee_harrison'], Infernal: ['melee_infernal'], Keytar: ['melee_keytar'], Mayan: ['melee_mayan'], Nutcracker: ['melee_nutcracker'], Pickleball: ['melee_pickleball'], Plunger: ['melee_plunger'], 'Proper-Fish (idk)': ['melee_properfish_a', 'melee_properfish_b'], Retro: ['melee_retro'], Rock: ['melee_rock'], Steambot: ['melee_steambot'], Techno: ['melee_techno'], Valkyrie: ['melee_valkyrie'], Zombie: ['melee_zombie'] }, }); soundsFolder.addInput(tp.soundsFolder, "pistol", { label: 'Pistol', options: { Default: "fire", Retro: 'Retro_fire', Camera: 'Camera_fire', Clouds: 'Clouds_fire', Fusion: 'Fusion_fire', Techno: 'Techno_fire', Infernal: 'Infernal_fire', 'Space-Egg': 'spaceEgg_fire', Steambot: 'Steambot_fire', Valkyrie: 'Valkyrie_fire', Megaphone: 'Megaphone_fire', 'Cubic-Castle': 'CubicCastles_fire' }, }); function refreshSounds() { updatedNeeded = true; // this updates the weapons keyRetrieved = false; // this will grab the key necessary } soundsFolder.on('change', (value) => { // console.log('Selected sound:', value); // console.log(tp.soundsFolder); refreshSounds() // Handle the sound change logic here localStorage.setItem('customSounds', JSON.stringify(tp.soundsFolder)) }); addSettings.addButton({ title: `Click if sounds didn\'t update`, }).on('click', () => { updatedNeeded = true; keyRetrieved = false; }); // BINDS FOLDER function addInputWithValidation(folder, obj, property, label) { folder.addInput(obj, property, { label: label }).on('change', (value) => { if (value.value.length > 1) { value.value = 'Enter toggle'; value.target.controller_.binding.value.rawValue_ = 'Enter toggle'; window.alert('Please enter a single key'); } else { const store = (value.value).replace(/"/g,'') localStorage.setItem(`tp-${property}`, store) } }); }; addInputWithValidation(bindsFolder, tp.bindsFolder, 'hidePanel', 'Hide Panel'); addInputWithValidation(bindsFolder, tp.bindsFolder, 'refreshSounds', 'Refresh Sounds'); document.addEventListener("keydown", (e) => { if (e.key === tp.bindsFolder.hidePanel) { paneEl.style.display = paneEl.style.display === "block" ? "none" : "block"; } if (e.key === tp.bindsFolder.refreshSounds) { refreshSounds() } }); })();