Extra Sound Settings

Adds a better version of mute, that mutes everything but claps, pings and clicks. It also adds the ability to hear when people are typing within a certain range around you.

当前为 2021-06-27 提交的版本,查看 最新版本

// ==UserScript==
// @name         Extra Sound Settings
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Adds a better version of mute, that mutes everything but claps, pings and clicks. It also adds the ability to hear when people are typing within a certain range around you.
// @author       Zoltar
// @match        http://manyland.com/*
// @icon         https://cdn.discordapp.com/icons/852442189283983380/a_70793eeb1f509f9c4aa1021e5691fab4.webp
// @grant        GM.setValue
// @grant        GM.getValue
// ==/UserScript==

(function () {
    'use strict';

    // took this part from Eternity's mod
    async function loadObf() {
        if (typeof Deobfuscator == 'undefined')
            await $.getScript("https://cdn.jsdelivr.net/gh/parseml/many-deobf@latest/deobf.js")

    }
    // Parses smooth loader
    !async function loader() {
        let loading = setInterval(() => {
            if (typeof ig === "undefined") return
            else if (typeof ig.game === "undefined") return
            else if (typeof ig.game.screen === "undefined") return
            else if (ig.game.screen.x == 0) return
            else if (typeof Settings !== "function") return

            clearInterval(loading);
            loadObf().then(async () => {

                let pasteCheck = Deobfuscator.function(ig.game.player, 'Boolean(b&&b', true);
                let slotPass = Deobfuscator.object(ig.game, 'slots', true);
                let storedPasteCheck = ig.game.player[pasteCheck];


                ig.game.settings.add = Deobfuscator.function(ig.game.settings, 'Math.min(ig.system.scale,5)', true);
                ig.game.settings.header = Deobfuscator.function(ig.game.settings, 'text-transform: uppercase;', true);
                ig.game.settings.typeInterval = 1;


                // getPlayerChat depends on this
                Deobfuscator.findByType = (object, type, returnKey) => {

                    let keyFound = null;

                    Object.keys(object).forEach((i) => {
                        if (object[i] === null)
                            return;

                        if (object[i].constructor === type)
                            keyFound = returnKey ? i : object[i];
                    });

                    return keyFound;

                }


                const getPlayerChat = target => {
                    updatePlayers();
                    let chat = "";
                    ig.game.players.forEach(player => {
                        let playerId = Deobfuscator.variableByLength(ig.game.players[1], 24, true)
                        if (player[playerId] === target) {

                            let playerChat = Deobfuscator.object(player, 'player', false);
                            playerChat.object = Deobfuscator.findByType(playerChat, Array, false);

                            if (playerChat.object.length != 0) {
                                let index = playerChat.object.length - 1;
                                chat = Deobfuscator.findByType(playerChat.object[index], String, false);
                            }
                        }
                    });

                    return chat;
                }

                function getDistance(x1, y1, x2, y2) {
                    let xDistance = x2 - x1;
                    let yDistance = y2 - y1;

                    return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
                }


                ig.game.settings.betterMute = function () {
                    if (!this.btm) {

                        let whiteListedSounds = ["ping", "clap"];
                        if (ig.game.settings.tps) whiteListedSounds.push("click");


                        ig.game.player[pasteCheck] = function (a) {
                            if (a === "mutesPastes") return true;
                            var b = this.attachments[ig.game[slotPass].slots.WEARABLE];

                            return Boolean(b && b.attributes && b.attributes[a])
                        }

                        for (let sound of Object.keys(ig.game.sounds)) {
                            if (!whiteListedSounds.includes(sound)) {
                                ig.game.sounds[sound].volume = 0;

                            }
                        }
                        this.btm = !this.btm
                        GM.setValue("bettermute", this.btm);

                    } else {
                        ig.game.player[pasteCheck] = storedPasteCheck;
                        for (let sound of Object.keys(ig.game.sounds)) {
                            ig.game.sounds[sound].volume = 1;

                        }
                        this.btm = !this.btm;
                        GM.setValue("bettermute", this.btm);
                    }

                }

                ig.game.settings.typeSound = function () {

                    let chatBuffer = [{ id: "", message: "" }]
                    let chatterIds = [""];

                    if (!this.tps) {
                        ig.game.settings.typeInterval = setInterval(() => {
                            updatePlayers();
                            for (let player of ig.game.players) {
                                if (ig.game.players.length == 0) return;

                                let playerId = Deobfuscator.variableByLength(ig.game.players[1], 24, true)

                                if (getDistance(ig.game.player.pos.x, ig.game.player.pos.y, player.pos.x, player.pos.y) <= 230 && player[playerId] != ig.game.player.id) {
                                    if (!chatterIds.includes(player[playerId])) {
                                        chatBuffer.push({ id: player[playerId], message: getPlayerChat(player[playerId]) })
                                        chatterIds.push(player[playerId])
                                    }

                                    for (let chatter of chatBuffer) {
                                        if (chatter.id === player[playerId]) {

                                            if (chatter.message != getPlayerChat(player[playerId])) {
                                                ig.game.sounds.click.play();
                                            }
                                            chatter.message = getPlayerChat(player[playerId]);

                                        }
                                    }

                                }
                            }
                        }, 50)
                        this.tps = !this.tps;
                        GM.setValue("typesound", this.tps);

                    } else {
                        clearInterval(ig.game.settings.typeInterval);
                        this.tps = !this.tps;
                        GM.setValue("typesound", this.tps);
                    }


                }

                let btMuteSetting = await GM.getValue("bettermute");
                let typeSetting = await GM.getValue("typesound");

                ig.game.settings.btm = typeof btMuteSetting == 'undefined' ? ig.game.settings.btm = false : ig.game.settings.btm = btMuteSetting;
                ig.game.settings.tps = typeof typeSetting == 'undefined' ? ig.game.settings.tps = false : ig.game.settings.tps = typeSetting;
                
                
                if(ig.game.settings.btm) {
                    ig.game.settings.btm = !ig.game.settings.btm;
                    ig.game.settings.betterMute();

                }

                if(ig.game.settings.tps) {
                    ig.game.settings.tps = !ig.game.settings.tps;
                    ig.game.settings.typeSound();
                }

                // Making it compatiable with performance mod
                let splitCheck = ig.game.settings.openDialog.toString().split('function() {').length > 1 ? 'function() {' : 'function(){';
                let splitText = ig.game.settings.openDialog.toString().split(splitCheck)[1];
                let newFunction = splitText.split('a+="</div>";').join(`a += this.${ig.game.settings.header}("Sound Extras"); a += this.${ig.game.settings.add}("btm", "Better Mute", null, "ig.game.settings.betterMute()", this.btm); a += this.${ig.game.settings.add}("tps", "Typing Sound", null, "ig.game.settings.typeSound()", this.tps); a+="</div>";`)

                eval('ig.game.settings.openDialog = function(){ ' + newFunction);

            });
        }, 250)
    }()
})();