Dragonrip Toolbar

Shortcut toolbar for Dragonrip.com

目前為 2025-04-20 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Dragonrip Toolbar
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  Shortcut toolbar for Dragonrip.com
// @author       Kronos1
// @match         *://*.dragonrip.com/*
// @icon         https://i.imgur.com/Vn0ku7D.png
// @grant        none
// @license      GPLv3 
// ==/UserScript==


(() => {
    'use strict';
    /* 
        Items in the tool bar
        Possible items: 
            - home, bank, prof, shop, combat, market, quests, events
            - mining, smithing, jewels, fishing, hunter, herbs, cooking, crafting, alchemy, slayer, summoning, explo, woodwork, magic, beastmatery
            - "|" = separator space
            - "[]"" = large spearator space

    */
    const toolbarItems = [
            'home',
            'bank', 
            'prof',
            'shop', 
            'combat',
            '|', 
            'mining', 
            'smithing', 
            'fishing', 
            'hunter', 
            'herbs', 
            'cooking', 
            'crafting', 
            'alchemy', 
            'woodwork',
            'beastmastery',
            '|',
            'market',
            'quests',
    ]

    const settings = {
        removeVanillaNavbar: true, // Remove game's original navbar element
    }
    
    // Data for link items
    const data = {

        links: {
            'home': { 
                label:'Home',
                url:'https://dragonrip.com/game/play.php',
                icon:'https://i.imgur.com/Vn0ku7D.png'
            },
            'bank': {
                label:'Bank',
                url:'https://dragonrip.com/game/bank.php',
                icon:'/game/images/icons/bank.png'
            },
            'prof': { // Professions/skills
                label:'Skills',
                url:'https://dragonrip.com/game/prof.php',
                icon:'/game/images/icons/prof.png'
            },
            'shop': { // General store
                label:'Shop',
                url:'https://dragonrip.com/game/shop.php',
                icon:'/game/images/icons/shop.png'
            },
            'combat': { //Fighting fields
                label:'Combat',
                url:'https://dragonrip.com/game/fighting.php',
                icon:'/game/images/icons/kova.png'
            },
            'quests': { 
                label:'Quests',
                url:'https://dragonrip.com/game/quest.php',
                icon:'/game/images/icons/quest.png'
            },
            'market': { 
                label:'Market',
                url:'https://dragonrip.com/game/market.php',
                icon:'/game/images/icons/market.png'
            },
            'events': { 
                label:'Events',
                url:'https://dragonrip.com/game/event.php',
                icon:'/game/images/icons/events.png'
            },
            'mining': {
                label:'Mining',
                url:'https://dragonrip.com/game/miningter.php',
                icon:'/game/images/bigicons/pick.png'
            },
            'smithing': {
                label:'Smith',
                url:'https://dragonrip.com/game/blacksm.php',
                icon:'/game/images/bigicons/anvil.png'
            },
            'fishing': {
                label:'Fish',
                url:'https://dragonrip.com/game/fish.php',
                icon:'/game/images/bigicons/fish.png'
            },
            'hunter': {
                label:'Hunter',
                url:'https://dragonrip.com/game/hunter.php',
                icon:'/game/images/bigicons/hunter.png'
            },
            'herbs': {
                label:'Herbs',
                url:'https://dragonrip.com/game/herbalism.php',
                icon:'/game/images/bigicons/herb.png'
            },
            'cooking': {
                label:'Cook',
                url:'https://dragonrip.com/game/cook.php',
                icon:'/game/images/bigicons/cook.png'
            },
            'crafting': {
                label:'Craft',
                url:'https://dragonrip.com/game/crafting.php',
                icon:'/game/images/bigicons/crafting.png'
            },
            'alchemy': {
                label:'Alch',
                url:'https://dragonrip.com/game/alchemy.php',
                icon:'/game/images/bigicons/poto.png'
            },
            'woodwork': {
                label:'Wood<br>work',
                url:'https://dragonrip.com/game/woodwork.php',
                icon:'/game/images/bigicons/wood.png'
            },

            'beastmastery': { 
                label:'Pets',
                url:'https://dragonrip.com/game/bmastery.php',
                icon:'/game/images/bigicons/petb.png'
            },
            'slayer': { 
                label:'Slayer',
                url:'https://dragonrip.com/game/slayer.php',
                icon:'/game/images/bigicons/slayme.png'
            },
            'summoning': { 
                label:'Summon',
                url:'https://dragonrip.com/game/summoning.php',
                icon:'/game/images/bigicons/sumo.png'
            },
            'explo': { 
                label:'Explore',
                url:'https://dragonrip.com/game/explo.php',
                icon:'/game/images/bigicons/explo.png'
            },
            'magic': { 
                label:'Magic',
                url:'https://dragonrip.com/game/magic.php',
                icon:'/game/images/bigicons/ench.png'
            },
            'jewels': { 
                label:'Events',
                url:'https://dragonrip.com/game/jewel.php',
                icon:'/game/images/bigicons/jewel.png'
            },
        }
    }


    const toolbarCss = `
        .dragonrip-toolbar-cont > * {
            -webkit-box-sizing: border-box;
            -moz-box-sizing: border-box;
            box-sizing: border-box;
            user-select:none;
        }

        .dragonrip-toolbar-cont {
            border-color: rgba(255,255,255,0.15);
            border-width:0px 1px;
            border-style:solid;
            width:100%;
            height:100px; 
            display:flex;
            xflex-wrap:wrap;
            align-items:center;
            justify-content:center;
            background-image: url('https://i.imgur.com/vjJ8ugC.jpeg');
            background-size:contain;
            padding:5px;
            box-shadow:inset 0px 0px 5px 3px rgba(0,0,0,0.99);
        }

        .dragonrip-toolbar-separator {
            width: 20px;
            height:100%;
        }

        .dragonrip-toolbar-separator-large {
            width: 50px;
            height:100%;
        }

        .dragonrip-toolbar-link-item {
            position:relative;
            width:50px;
            aspect-ratio:1/1;
            margin: 2px;
            display:flex;
            align-items: end;
            justify-content: center;
            cursor:pointer;
            border-style: solid;
            border-image-source: url('https://i.imgur.com/c7Oeu0F.png');
            border-image-slice: 70;
            border-image-width: 1em 1em;
            border-image-outset: 0;
            border-image-repeat: stretch;
            background-color:rgb(24, 24, 31);
            box-shadow: 2px 2px 2px 0px rgba(0,0,0,0.99);
            transition: all 0.05s;
            border-radius:2px;
        }

        .dragonrip-toolbar-link-item:hover {
            background-color:#0b0b2d;
            outline: 1px solid #00c867;
        }

        .dragonrip-toolbar-link-item > .image-cont {
            position:absolute;
            width:100%;
            height:100%;
            padding:5px;
        }

        .dragonrip-toolbar-link-item > .image-cont > .image {
            height:70%;
            aspect-ratio:1/1;
            filter: drop-shadow(0px 0px 2px aqua) drop-shadow(0px 0px 1px rgba(255,255,255, 0.0));
        }

        .dragonrip-toolbar-link-item > .label {
            width:100%;
            padding:1px 0px 3px 0px;
            text-align:center;
            color:white;
            text-shadow: 
                0px 0px 3px black,
                0px 0px 3px black,
                0px 0px 3px black,
                0px 0px 3px black,
                0px 0px 3px black,
                0px 0px 3px black,
                0px 0px 3px black
            ;
            z-index:1;
            font-size:0.7em;
            font-family:consolas,monospace;
            line-height:0.8;
        }
    `;

    const removeVanillaNavbarCss = `
        ul.navbar {
            display:none;
        }
    `;

    const log = console.log;

    const createToolbarItem = id => {
        const item = document.createElement('a');
        item.classList.add('dragonrip-toolbar-link-item');
        item.href = data.links[id].url;

        // Create image elem
        const imageCont = document.createElement('div');
        imageCont.classList.add('image-cont');
        const image = document.createElement('img');
        image.classList.add('image');
        image.src = data.links[id].icon;
        imageCont.append(image);

        // Create text label
        const label = document.createElement('div');
        label.classList.add('label');
        label.innerHTML = data.links[id].label;

        item.append(imageCont);
        item.append(label);
        return item;
    }

    const createSeparatorElem = () => {
        const elem = document.createElement('div');
        elem.classList.add('dragonrip-toolbar-separator');
        return elem;
    }

    const createLargeSeparatorElem = () => {
        const elem = document.createElement('div');
        elem.classList.add('dragonrip-toolbar-separator-large');
        return elem;
    }
    
    const createToolbar = () => {
        const toolbarCont = document.createElement('div');
        toolbarCont.classList.add('dragonrip-toolbar-cont');

        // Insert toolbar after the vanilla navbar
        const refNode = document.querySelector('body > ul.navbar');
        refNode.parentNode.insertBefore(toolbarCont, refNode.nextSibling);

        // Add link items based on the ordering specified in toolbarItems array
        for (const id of toolbarItems) {
            let item;

            if (id === '|') {
                item = createSeparatorElem();
            } else if (id === '[]') {
                item = createLargeSeparatorElem();
            } else {
                item = createToolbarItem(id)
            }

            toolbarCont.append(item);
        }
    }

    // Wait for game UI to load, then insert toolbar elem
    const waitForElem = () => {
        const checkElem = setInterval( () => {
            if (document.querySelector('ul.navbar') !== null) {
                clearInterval(checkElem); 
                createToolbar();
            }
        }, 5);
    }


    const setCustomCss = str => {
        const styleElem = document.createElement("style");
        styleElem.textContent = str;
        document.body.appendChild(styleElem);
    }


    setCustomCss(toolbarCss);
    if (settings.removeVanillaNavbar) { setCustomCss(removeVanillaNavbarCss); }
    

    waitForElem();
})();