Melvor Ding

Sound is made when crops are ready, when a pet is dropped, and when your idle.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Melvor Ding
// @namespace   http://tampermonkey.net/
// @version     0.1.0
// @description Sound is made when crops are ready, when a pet is dropped, and when your idle.
// @description Special Thanks to TinyCoyote#1769, Visua#9999 for help with the code.
// @author      MrSapient
// @match       https://*.melvoridle.com/*
// @exclude     https://wiki.melvoridle.com*
// @noframes
// @grant       none
// ==/UserScript==

// settings
window.DingSettings = {
    // changes ding volume level for farming
    FARMING_DING: 0.1,
    // changes ding volume level for pet
    PET_DING: 0.1,
    // change ding volume level for idle
    IDLE_DING: 0.1,
    // changes the amount of time between dings while idle
    IDLE_TIME: 7500,

    // save settings to local storage
    save: () => {
        window.localStorage['DingSettings'] = window.JSON.stringify(window.DingSettings);
    }
};

// main script
function script() {

    ////////////////////
    /// Farming Ding ///
    ///////////////////
    let growCropsRef = window.growCrops;
    window.growCrops = (areaID, patchID) => {
        if (patchID === 0 && !newFarmingAreas[areaID].patches[patchID].hasGrown) {
            let ding = new Audio("https://www.myinstants.com/media/sounds/ding_5crN9DD.mp3");
            ding.volume = DingSettings.FARMING_DING;
            ding.play();
        }
        growCropsRef(areaID, patchID);
    }

    /////////////////
    /// Pet Ding ///
    ////////////////
    let petDropRef = window.unlockPet;
    window.unlockPet = (petID, offline=false) => {
        if (!petUnlocked[petID] === true) {
            let ding = new Audio("https://www.myinstants.com/media/sounds/censor-beep-1.mp3");
            ding.volume = DingSettings.PET_DING;
            ding.play();
        }
        petDropRef(petID, offline);
    }

    /////////////////
    /// Idle Ding ///
    /////////////////
    const idleRef = () => {
        if (offline.skill === null && !isInCombat) {
            let ding = new Audio("https://www.myinstants.com/media/sounds/taco-bell-bong-sfx.mp3");
            ding.volume = DingSettings.IDLE_DING;
            ding.play();
        }
    }

    setInterval(idleRef, DingSettings.IDLE_TIME)
}


// https://www.myinstants.com/media/sounds/wwe-ring-bell-no-crowd.mp3
// https://www.myinstants.com/media/sounds/ding_2.mp3



// inject the script
(function () {
    function injectScript(main) {
        const scriptElement = document.createElement('script');
        scriptElement.textContent = `try {(${main})();} catch (e) {console.log(e);}`;
        document.body.appendChild(scriptElement).parentNode.removeChild(scriptElement);
    }

    function loadScript() {
        if ((window.isLoaded && !window.currentlyCatchingUp)
            || (typeof unsafeWindow !== 'undefined' && unsafeWindow.isLoaded && !unsafeWindow.currentlyCatchingUp)) {
            // Only load script after game has opened
            clearInterval(scriptLoader);
            injectScript(script);
            // load settings from local storage
            if (window.localStorage['DingSettings'] !== undefined) {
                const stored = window.JSON.parse(window.localStorage['DingSettings']);
                Object.getOwnPropertyNames(stored).forEach(x => {
                    window.DingSettings[x] = stored[x];
                });
                window.DingSettings.save();
            }
            // regularly save settings to local storage
            setInterval(window.DingSettings.save, 1000)
        }
    }

    const scriptLoader = setInterval(loadScript, 200);
})();