Dragonrip Toolbar

Shortcut toolbar for Dragonrip.com

当前为 2025-04-21 提交的版本,查看 最新版本

// ==UserScript==
// @name         Dragonrip Toolbar
// @namespace    http://tampermonkey.net/
// @version      1.0.11
// @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.
        Items created in 2 rows.
        The order and layout can be customized with empty slots (brackets []) or smaller spearator spaces (pipe |).
        Possible items: 
            - home, bank, prof, shop, combat, market, quests, events, dungeon
            - mining, smithing, jewels, fishing, hunter, herbs, cooking, crafting, alchemy, slayer, summoning, explo, woodwork, magic, beastmastery, slayer, explo, magic
            - | = separator space
            - [] = large spearator space

    */
    const toolbarItems = [
            'home', 'bank', 'prof','shop', 'combat', '|', 

            'mining', 'smithing',  'fishing',  'hunter', 'herbs', 'cooking', 
            'crafting', 'alchemy', 'woodwork', 'beastmastery', 'summoning', 'jewels', 
            
            '[]','market', 'quests', 'dungeon','events',

            '|','[]','[]','[]','[]','[]','[]','[]','[]','[]',
            'slayer', 'explo','magic',

    ]

    const settings = {
        removeVanillaNavbar: true, // Remove game's original navbar element
        smallerVanillaTopbars: true, // Make the player and game logo boxes smaller height
    }
    
    // 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'
            },
            'dungeon': { 
                label:'Dungeon',
                url:'https://dragonrip.com/game/dungeon.php',
                icon:'/game/images/icons/dung.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:'Jewels',
                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:120px; 
            display:flex;
            flex-wrap:wrap;
            align-items:center;
            justify-content:start;
            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),
                inset 0px 0px 0px 1px rgba(255, 255, 255, 0.15) 
            ;


        }

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

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

        .dragonrip-toolbar-link-item {
            position:relative;
            width:50px;
            height:50x;
            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: background-color 0.05s, outline 0.05s, transform 0.05s;
            border-radius:2px;
        }

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

        .dragonrip-toolbar-link-item.selected,
        .dragonrip-toolbar-link-item.selected:hover {
            background-color:#001f4d;
        }

        .dragonrip-toolbar-link-item:active {
            transform: translateY(3px);
        }

        .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 smallerVanillaTopbarsCss = `
        div.player {
            xborder:1px solid lime!important;
        }
        div.player > div.picture {
            width: 50px!important;
            height:50px!important;
            margin-right:30px!important;
        }
        div.player > div.picture > a > div.kovsd {
            xborder:1px solid lime!important;
            background-size:contain!important;
            width: 50px!important;
            height:50px!important;

            max-height: 50px!important;
            min-height: 50px!important;
            display:flex;
            flex-direction:column;
            justify-content: end;
        }

        div.player > div.picture > a > div.kovsd > span.amoutina {
            width:100%!important;
            margin-top: 0px!important;
            color:lime!important;
            color:#b133ff!important;
            font-family:consolas,monospace;
        }

        div.player > div.bar {
            padding-top:0px!important;
        }


        div.logo{
            xborder:1px solid lime!important;
            height:68px;
            display:flex;
            align-items:center;
            justify-content:center;
        }

        div.logo > br {
            height:0px!important;
        }

        div.logo > img {
            height:80%;
        }
    `;

    

    const log = console.log;


    const setItemHighlight = () => {
        const currentUrl = document.location.href;
        log(currentUrl)

        const dataItemIds = Object.getOwnPropertyNames(data.links);

        for (let i=0; dataItemIds.length; i++) {
            const itemId = dataItemIds[i];
            const itemUrl = data.links[itemId].url;

            if (currentUrl.includes(itemUrl)) {
                //Find item in HTML and add highlight class
                const domItems = document.querySelectorAll('.dragonrip-toolbar-cont > .dragonrip-toolbar-link-item');

                for (const domItem of domItems) {
                    const domItemId = domItem.getAttribute('data-id');
                    if (domItemId === itemId) {
                        domItem.classList.add('selected');
                    }
                }
            }
       
        }
    }
    

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

        // 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();
                setItemHighlight();
            }
        }, 5);
    }


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



    setCustomCss(toolbarCss);

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

    if (settings.smallerVanillaTopbars) { 
        setCustomCss(smallerVanillaTopbarsCss); 
    }
    

    waitForElem();
})();