Melvor Ding

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

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

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