ShellShockers -NO ADS- Aimbot & ESP

A simple ShellShockers mod menu

// ==UserScript==
// @name         ShellShockers -NO ADS- Aimbot & ESP
// @namespace    http://tampermonkey.net/
// @version      2024-01-21
// @description  A simple ShellShockers mod menu
// @author       You
// @match        https://shellshock.io/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=shellshock.io
// @grant        none
// ==/UserScript==

let keys = {};

let aimbotEnabled = false;
let aimbotOnRightMouse = false;
let espEnabled = false;
let showLines = false;
let showTeam = false;

const adList = [
    'shellshockers_respawn_banner-new_ad',
    'shellshockers_respawn_banner',
    'shellshockers_respawn_banner_2_ad',
    'shellshockers_respawn_banner_3_ad',
    'shellshockers_titlescreen',
    'shellshock-io_728x90_HP_wrap',
    'display-ad-header-home'
];
const classList = ['house-ad-wrapper'];

setInterval(function () {
    var count = adList.length;
    window.localStorage.setItem("lastPreRoll", Date.now() + 432e5);
    window.localStorage.setItem("showBigAd", Date.now() + 432e5);

    for (var i = 0; i < count; i++) {
        var adID = adList[i];
        var classID = classList[i];

        const element = document.getElementById(adID);
        const classElement = document.querySelector(classID);

        if (element !== null) {
            element.remove();
        }

        if (classElement !== null) {
            classElement.remove();
        }

        if (classElement == null && element == null) {
            continue;
        }

        if (typeof window?.extern?.account !== "undefined" && typeof vueApp !== "undefined") {
                        if (!vueApp.isUpgraded || !extern.account.isSubscriber) { vueApp.setAccountUpgraded(true, ""); extern.account.isSubscriber = true; }
                    }
    }
}, 10);

window.XMLHttpRequest = class extends window.XMLHttpRequest {

    open(method, url) {
        if (url.includes('shellshock.js')) {
            this.isScript = true;
        }

        return super.open(...arguments);
    }

    get response() {
        if (this.isScript) {
            let response = super.response;

            let babylonVarName,
				playersVarName,
				myPlayerVarName,
				sceneVarName,
				cullFuncName;

			const extractors = {
				BracketSingleQuote() {

					const matches = /([a-zA-Z_$0-9]+)\['([^']+)'\]\['([^']+)'\]\("[^"]+",{si/.exec( response );

					babylonVarName = matches[ 1 ];
					playersVarName = /[a-zA-Z_$0-9]+\['[^']+'\]\),!([a-zA-Z_$0-9]+)\[/.exec( response )[ 1 ];
					myPlayerVarName = /document\.pointerLockElement&&([^&]+)&&/.exec( response )[ 1 ];
					sceneVarName = /if\([a-zA-Z_$0-9]+\['[^']+'\]\(([a-zA-Z_$0-9]+),[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,null/.exec( response )[ 1 ];
					cullFuncName = /=([a-zA-Z_$0-9]+)\(this\['([^']+)'\],\.[0-9]+\)/.exec( response )[ 1 ];

					keys.MeshBuilder = matches[ 2 ];
					keys.CreateBox = matches[ 3 ];
					keys.CreateLines = /\['([^']+)'\]\("",{po/.exec( response )[ 1 ];
					keys.Vector3 = /new [a-zA-Z_$0-9]+\['([^']+)'\]\(\.5,\.5,\.5\),/.exec( response )[ 1 ];
					keys.actor = /this\['([^']+)'\]\['([^']+)'\]\.position,!/.exec( response )[ 1 ];
					keys.playing = /OPEN&&[a-zA-Z_$0-9]+\['([^']+)'\]/.exec( response )[ 1 ];

					keys.yaw = /\*=[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+\['([^']+)'\]=Math\.r/.exec( response )[ 1 ];
					keys.pitch = /\),[a-zA-Z_$0-9]+\['([^']+)'\]=Math\.max\(Math\.min/.exec( response )[ 1 ];
					keys.mesh = /,\.[0-9]+\);this\['([^']+)'\]\['([^']+)'\]\(/.exec( response )[ 1 ];

				},
				BracketDoubleQuote() { // might not be needed but just in case

					const matches = /([a-zA-Z_$0-9]+)\["([^"]+)"\]\["([^"]+)"\]\("[^"]+",{si/.exec( response );

					babylonVarName = matches[ 1 ];
					playersVarName = /[a-zA-Z_$0-9]+\["[^"]+"\]\),!([a-zA-Z_$0-9]+)\[/.exec( response )[ 1 ];
					myPlayerVarName = /document\.pointerLockElement&&([^&]+)&&/.exec( response )[ 1 ];
					sceneVarName = /if\([a-zA-Z_$0-9]+\["[^"]+"\]\(([a-zA-Z_$0-9]+),[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,null/.exec( response )[ 1 ];
					cullFuncName = /=([a-zA-Z_$0-9]+)\(this\["([^"]+)"\],\.[0-9]+\)/.exec( response )[ 1 ];

					keys.MeshBuilder = matches[ 2 ];
					keys.CreateBox = matches[ 3 ];
					keys.CreateLines = /\["([^"]+)"\]\("",{po/.exec( response )[ 1 ];
					keys.Vector3 = /new [a-zA-Z_$0-9]+\["([^"]+)"\]\(\.5,\.5,\.5\),/.exec( response )[ 1 ];
					keys.actor = /this\["([^"]+)"\]\["([^"]+)"\]\.position,!/.exec( response )[ 1 ];
					keys.playing = /OPEN&&[a-zA-Z_$0-9]+\["([^"]+)"\]/.exec( response )[ 1 ];

					keys.yaw = /\*=[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+\["([^"]+)"\]=Math\.r/.exec( response )[ 1 ];
					keys.pitch = /\),[a-zA-Z_$0-9]+\["([^"]+)"\]=Math\.max\(Math\.min/.exec( response )[ 1 ];
					keys.mesh = /,\.[0-9]+\);this\["([^"]+)"\]\["([^"]+)"\]\(/.exec( response )[ 1 ];

				},
				Dot() { // in case the shellshock devs revert back to dot syntax :skull:

					const matches = /([a-zA-Z_$0-9]+)\.([a-zA-Z_$0-9]+)\.([a-zA-Z_$0-9]+)\("[^"]+",{si/.exec( response );

					babylonVarName = matches[ 1 ];
					playersVarName = /[a-zA-Z_$0-9]+\.[a-zA-Z_$0-9]+\),!([a-zA-Z_$0-9]+)\[/.exec( response )[ 1 ];
					myPlayerVarName = /document\.pointerLockElement&&([^&]+)&&/.exec( response )[ 1 ];
					sceneVarName = /if\([a-zA-Z_$0-9]+\.[a-zA-Z_$0-9]+\(([a-zA-Z_$0-9]+),[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,null/.exec( response )[ 1 ];
					cullFuncName = /=([a-zA-Z_$0-9]+)\(this\.([a-zA-Z_$0-9]+),\.[0-9]+\)/.exec( response )[ 1 ];

					keys.MeshBuilder = matches[ 2 ];
					keys.CreateBox = matches[ 3 ];
					keys.CreateLines = /\.([a-zA-Z_$0-9]+)\("",{po/.exec( response )[ 1 ];
					keys.Vector3 = /new [a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)\(\.5,/.exec( response )[ 1 ];
					keys.actor = /this\.([a-zA-Z_$0-9]+)\.[a-zA-Z_$0-9]+\.position,!/.exec( response )[ 1 ];
					keys.playing = /OPEN&&[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)/.exec( response )[ 1 ];

					keys.yaw = /\*=[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)=Math\.r/.exec( response )[ 1 ];
					keys.pitch = /\),[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)=Math\.max\(Math\.min/.exec( response )[ 1 ];
					keys.mesh = /,\.[0-9]+\);this\.([a-zA-Z_$0-9]+)\.[a-zA-Z_$0-9]+\(/.exec( response )[ 1 ];

				}
			};

			const numExtractors = Object.keys( extractors ).length;
			let failures = 0;

			for ( const name in extractors ) {

				try {

					extractors[ name ]();
					break;

				} catch ( error ) {

					failures ++;
					if ( failures >= numExtractors ) {

						alert( 'Script failed to inject. Report the issue to the script developer.\n' + JSON.stringify( getVars(), undefined, 2 ) );
						return response;

					}

				}

			}

			function getVars() {

				return {
					babylonVarName,
					playersVarName,
					myPlayerVarName,
					playersVarName,
					sceneVarName,
					cullFuncName,
					keys
				};

			}

			response = String.prototype.replace.call( response, sceneVarName + '.render()', `

				window[ '${onUpdateFuncName}' ](
					${babylonVarName},
					${playersVarName},
					${myPlayerVarName}
				);

			${sceneVarName}.render()` );
			response = String.prototype.replace.call( response, `function ${cullFuncName}`, `

				function ${cullFuncName}() {

					return true;

				}

			function someFunctionWhichWillNeverBeUsedNow` );


            return response;
        }

        return super.response;
    }
};

// Aimbot and GUI creation
let createGUI = function() {
    this.gui = new guify({
        title: "<b>Mod Panel</b>",
        theme: "dark",
        align: "left",
        width: 300,
        barMode: "none",
        panelMode: "none",
        opacity: 0.9,
        root: window.container,
        open: true,
        components: {
            SetVisible: {
                type: "button",
                label: "Set Visible",
                onClick: () => this.gui.toggle()
            }
        }
    });

    var menuButton = this.gui.panel.menuButton;
    if (menuButton) {
        menuButton.style.opacity = 0.3;
    }

    this.gui.Register([{
        type: "folder",
        label: "GUI",
        open: false
    }]);

    this.gui.Register([{
        type: "folder",
        label: "Aimbot Hacks",
        open: false
    }]);

    this.gui.Register([{
        type: "checkbox",
        label: "Hide Menu Button",
        property: "buttonOP",
        onChange: function (bool) {
            menuButton.style.opacity = bool ? 0 : 0.3;
        }
    }], {
        folder: "GUI"
    });

    this.gui.Register([{
        type: "checkbox",
        label: "Aimbot",
        property: "aimbot12",
        onChange: function (bool) {
            aimbotEnabled = bool;
        }
    }, {
        type: "checkbox",
        label: 'Aimbot On Right Click (Aimbot Must Be Enabled)',
        property: "aimbot12",
        onChange: function (bool) {
            aimbotOnRightMouse = bool;
        }
    }, {
        type: "checkbox",
        label: "ESP",
        property: "esp12",
        onChange: function (bool) {
            espEnabled = bool;
        }
    }, {
        type: "checkbox",
        label: 'Show Lines (ESP must be enabled)',
        property: "esp12",
        onChange: function (bool) {
            showLines = bool;
        }
    }, {
        type: "checkbox",
        label: 'Show Teams (ESP must be enabled)',
        property: "team12",
        onChange: function (bool) {
            showTeam = bool;
        }
    }], {
        folder: "Aimbot Hacks"
    });
};

let script = document.createElement('script');
script.onload = function() {
    createGUI();
};
script.src = "https://unpkg.com/guify@0.12.0/lib/guify.min.js";
document.body.appendChild(script);





// from this point on all of the code is the hack


function fromCamel( text ) {

	const result = text.replace( /([A-Z])/g, ' $1' );
	return result.charAt( 0 ).toUpperCase() + result.slice( 1 );

}


let rightMouseDown = true;

function handleMouse( event ) {

	if ( event.button === 2 ) {

		rightMouseDown = event.type === 'pointerdown' ? true : false;

	}

}

window.addEventListener( 'pointerdown', handleMouse );
window.addEventListener( 'pointerup', handleMouse );



let initialized = false;
let lineOrigin, linesArray;
let colors;

const onUpdateFuncName = btoa( Math.random().toString( 32 ) );

window[ onUpdateFuncName ] = function ( BABYLON, players, myPlayer ) {

	if ( ! initialized ) {

		initialized = true;

		lineOrigin = new BABYLON[ keys.Vector3 ]();
		linesArray = [];

		colors = {
			enemy: new BABYLON.Color3( 1, 0, 0 ),
			team: new BABYLON.Color3( 0, 0, 1 ),
		};

	}

	lineOrigin.copyFrom( myPlayer[ keys.actor ][ keys.mesh ].position );

	const yaw = myPlayer[ keys.actor ][ keys.mesh ].rotation.y;
	lineOrigin.x += Math.sin( yaw );
	lineOrigin.z += Math.cos( yaw );
	lineOrigin.y += Math.sin( - myPlayer[ keys.pitch ] );

	for ( let i = 0; i < linesArray.length; i ++ ) {

		linesArray[ i ].playerExists = false;

	}

	for ( let i = 0; i < players.length; i ++ ) {

		const player = players[ i ];

		if ( ! player || player === myPlayer ) continue;

		if ( player.sphere === undefined ) {

			const material = new BABYLON.StandardMaterial( 'myMaterial', player[ keys.actor ].scene );
			material.wireframe = true;

			const sphere = BABYLON[ keys.MeshBuilder ][ keys.CreateBox ]( 'mySphere', { width: 0.5, height: 0.75, depth: 0.5 }, player[ keys.actor ].scene );
			sphere.material = material;
			sphere.position.y = 0.3;
			sphere.parent = player[ keys.actor ][ keys.mesh ];
			sphere.renderingGroupId = 1;

			player.sphere = sphere;

		}

		if ( player.lines === undefined ) {

			const options = {
				points: [ lineOrigin, player[ keys.actor ][ keys.mesh ].position ],
				updatable: true
			};

			const lines = options.instance = BABYLON[ keys.MeshBuilder ][ keys.CreateLines ]( 'lines', options, player[ keys.actor ].scene );
			lines.alwaysSelectAsActiveMesh = true;
			lines.renderingGroupId = 1;

			player.lines = lines;
			player.lineOptions = options;

			linesArray.push( lines );

		}

		player.lines.playerExists = true;
		player.lines = BABYLON[ keys.MeshBuilder ][ keys.CreateLines ]( 'lines', player.lineOptions );

		const isEnemy = myPlayer.team === 0 || myPlayer.team !== player.team;
		player.sphere.visibility = espEnabled && ( isEnemy || showTeam );
		player.lines.visibility = showLines && player[ keys.playing ] && ( isEnemy || showTeam );

		player.sphere.material.emissiveColor =
			player.sphere.material.diffuseColor =
			player.lines.color = isEnemy ? colors.enemy : colors.team;

	}

	for ( let i = 0; i < linesArray.length; i ++ ) {

		if ( ! linesArray[ i ].playerExists ) {

			linesArray[ i ].dispose();
			linesArray.splice( i, 1 );

		}

	}

	if ( aimbotEnabled && ( aimbotOnRightMouse ? rightMouseDown : true ) && myPlayer[ keys.playing ] ) {

		let minDistance = Infinity;
		let targetPlayer;

		for ( let i = 0; i < players.length; i ++ ) {

			const player = players[ i ];

			if ( player && player !== myPlayer && player[ keys.playing ] && ( myPlayer.team === 0 || player.team !== myPlayer.team ) ) {

				const distance = Math.hypot(
					getPos( player, 'x' ) - getPos( myPlayer, 'x' ),
					getPos( player, 'y' ) - getPos( myPlayer, 'y' ),
					getPos( player, 'z' ) - getPos( myPlayer, 'z' )
				);

				if ( distance < minDistance ) {

					minDistance = distance;
					targetPlayer = player;

				}

			}

		}

		if ( targetPlayer ) {

			const x = getPos( targetPlayer, 'x' ) - getPos( myPlayer, 'x' );
			const y = getPos( targetPlayer, 'y' ) - getPos( myPlayer, 'y' );
			const z = getPos( targetPlayer, 'z' ) - getPos( myPlayer, 'z' );

			myPlayer[ keys.yaw ] = Math.radAdd( Math.atan2( x, z ), 0 );
			myPlayer[ keys.pitch ] = - Math.atan2( y, Math.hypot( x, z ) ) % 1.5;

		}

	}

}

function getPos( player, component ) {

	return player[ keys.actor ][ keys.mesh ].position[ component ];

}