Shell Shockers advanced sounds

Change your weapon sounds - Shell Shockers

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