E-Better

Custom menu for Evades with many features for improvement.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

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

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name:ru      Эвадес но лучше
// @name         E-Better
// @version      0.1.5.5
// @description  Custom menu for Evades with many features for improvement.
// @author       Alertix(aka Failure, BubShurup), thanks to EtherCD(aka ✺Mistake✺) for helping and for making Map Filling for Beauty (https://github.com/EtherCD).
// @match        https://evades.online/
// @match        https://evades.io/
// @icon         https://u.cubeupload.com/FailureEvades/evadesactions.png
// @grant        none
// @run-at       document-idle
// @license      CC BY-NC-ND 4.0
// @description:ru      Меню в левом краю и всякие кнопки классные
// @namespace http://tampermonkey.net/
// ==/UserScript==


'use strict';
const customCSS = document.createElement('style');
customCSS.innerHTML = `
.changelog {
    float: left;
    width: 500px;
    height: 250px;
    color: #fff;
    border: 1px solid #585858;
    border-radius: 5px;
    position: relative;
    left: 40%;
    overflow: auto;
}

.button {
    background-color: #030303;
}

.button:hover {
    background: #121212
}

.button:disabled {
    background-color: #000000
}

.game-server {
    background-color: #030303;
}

.game-server:hover {
    background: #121212
}

.button {
    background-color: #030303;
}

.button:hover {
    background: #121212
}

.button:disabled {
    background-color: #000000
}

    .results-title {
        text-align: center;
        margin-top: 10px;
        margin-bottom: 50px;
        font-size: 65px;
        font-weight: 500;
        animation: rainbowText 4s infinite;
    }

    @keyframes rainbowText {
        0% {
            color: red;
        }
        16.666% {
            color: orange;
        }
        33.333% {
            color: yellow;
        }
        50% {
            color: green;
        }
        66.666% {
            color: blue;
        }
        83.333% {
            color: indigo;
        }
        100% {
            color: violet;
        }
    }

    #chat {
        width: 300px;
        height: 200px;
        background-color: #1a1a1a;
        position: fixed;
        bottom: 0;
        border: 2px solid #333;
        border-radius: 10px;
        overflow: hidden;
        z-index: 9998;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
    }

    #leaderboard,
    #subMenu,
    #cursorChangerSubMenu,
    #creditsSubMenu {
        z-index: 9999;
    }

    #chat-window {
        width: calc(100% - 4px);
        height: 165px;
        padding-bottom: 10px;
        overflow-y: auto;
        background-color: #2d2d2d;
        color: #ccc;
        font-family: Arial, sans-serif;
        position: relative;
    }

    #chat-input {
        width: calc(100% - 4px);
        height: 25px;
        padding: 5px;
        box-sizing: border-box;
        position: absolute;
        bottom: 0;
        border: none;
        background-color: #1a1a1a;
        color: #ccc;
        font-family: Arial, sans-serif;
        border-top: 2px solid #333;
    }

    #leaderboard.big {
        width: 230px;
    }

    .leaderboard-title {
        width: 100%;
        color: #f9f9f9;
        text-align: center;
        white-space: nowrap;
        font: 700 20px Tahoma, Arial, Verdana, Segoe, sans-serif;
        display: inline-block;

.header-ad {
    opacity: .0;
    height: 125px;
    width: 480px;
    text-align: center;
    display: none;
    margin: 0 auto
}

.left-ad {
    opacity: .0;
    float: left;
    display: none;
}

.right-ad {
    opacity: .0;
    float: right;
    display: none;
}

.box-ad {
    opacity: .0;
    float: right;
    position: relative;
    left: -62%;
    display: none;
    transform: translate(165%);
}
`;
document.head.appendChild(customCSS);

function initEBetter() {
	const menu = document.createElement('div')
	menu.setAttribute('id', 'customMenu')
	menu.style.position = 'fixed'
	menu.style.top = '50%'
	menu.style.left = '0'
	menu.style.transform = 'translateY(-50%)'
	menu.style.background = 'rgba(0, 0, 0, 0.7)'
	menu.style.width = '50px'
	menu.style.height = '100vh'
	menu.style.display = 'block'
	menu.style.transition = 'width 0.5s'

	const settingsButton = document.createElement('img')
	settingsButton.src = 'https://evades.io/options.8b56ab3c.png'
	settingsButton.alt = 'Settings'
	settingsButton.style.position = 'absolute'
	settingsButton.style.top = '10px'
	settingsButton.style.left = '10px'
	settingsButton.style.width = '30px'
	settingsButton.style.height = 'auto'
	settingsButton.style.cursor = 'pointer'
	settingsButton.addEventListener('click', function () {
		toggleSubMenu()
	})

	const cursorChangerButton = document.createElement('img')
	cursorChangerButton.src =
		'https://u.cubeupload.com/FailureEvades/CursorChanger.png'
	cursorChangerButton.alt = 'Cursor Changer'
	cursorChangerButton.style.position = 'absolute'
	cursorChangerButton.style.top = '55px'
	cursorChangerButton.style.left = '10px'
	cursorChangerButton.style.width = '30px'
	cursorChangerButton.style.height = 'auto'
	cursorChangerButton.style.cursor = 'pointer'
	cursorChangerButton.addEventListener('click', function () {
		toggleCursorChangerSubMenu()
	})

	const cursorChangerSubMenu = document.createElement('div')
	cursorChangerSubMenu.setAttribute('id', 'cursorChangerSubMenu')
	cursorChangerSubMenu.style.position = 'absolute'
	cursorChangerSubMenu.style.top = '55px'
	cursorChangerSubMenu.style.left = '50px'
	cursorChangerSubMenu.style.width = '0'
	cursorChangerSubMenu.style.height = '70px'
	cursorChangerSubMenu.style.background = 'rgba(0, 0, 0, 0.7)'
	cursorChangerSubMenu.style.transition = 'width 0.5s'
	cursorChangerSubMenu.style.overflow = 'hidden'

	const changeCursorButton = document.createElement('img')
	changeCursorButton.src =
		'https://u.cubeupload.com/FailureEvades/arrowIcon.png'
	changeCursorButton.alt = 'Change Cursor'
	changeCursorButton.style.color = '#ffffff'
	changeCursorButton.style.position = 'absolute'
	changeCursorButton.style.top = '5px'
	changeCursorButton.style.left = '20px'
	changeCursorButton.style.width = '20px'
	changeCursorButton.style.height = 'auto'
	changeCursorButton.style.cursor = 'pointer'
	changeCursorButton.addEventListener('click', function () {
		changeCursor()
	})

let isCrosshairActive = false;

cursorChangerButton.addEventListener('click', function () {
    toggleCursorChangerSubMenu();
    toggleCursorStyle();
})

function toggleCursorStyle() {
    const body = document.querySelector('body');
    if (!isCrosshairActive) {
        body.style.cursor = 'crosshair';
        applyCrosshairToAllElements();
        applyCrosshairToAllCSSStyles();
        isCrosshairActive = true;
    } else {
        body.style.cursor = 'auto';
        removeCrosshairFromAllElements();
        isCrosshairActive = false;
    }
}

function applyCrosshairToAllElements() {
    const allElements = document.querySelectorAll('*');
    allElements.forEach(element => {
        element.style.cursor = 'crosshair';
    });
}

function removeCrosshairFromAllElements() {
    const allElements = document.querySelectorAll('*');
    allElements.forEach(element => {
        element.style.cursor = 'auto';
    });
}

function applyCrosshairToAllCSSStyles() {
    const styleSheets = document.styleSheets;
    for (let i = 0; i < styleSheets.length; i++) {
        const rules = styleSheets[i].cssRules;
        for (let j = 0; j < rules.length; j++) {
            const rule = rules[j];
            if (rule instanceof CSSStyleRule) {
                if (rule.style.cursor === 'crosshair') {
                    rule.style.cursor = 'crosshair';
                }
            }
        }
    }
}



	const currentCursorText = document.createElement('div')
	currentCursorText.textContent = 'Current Cursor: Normal'
	currentCursorText.style.color = '#ffffff'
	currentCursorText.style.position = 'absolute'
	currentCursorText.style.top = '5px'
	currentCursorText.style.left = '50px'
	currentCursorText.style.padding = '5px'
	currentCursorText.style.display = 'inline-block'

	let currentCursor = 'normal'

	cursorChangerSubMenu.appendChild(currentCursorText)
	cursorChangerSubMenu.appendChild(changeCursorButton)

	function changeCursor() {
		const body = document.querySelector('body')
		if (currentCursor === 'normal') {
			body.style.cursor = 'crosshair'
			currentCursorText.textContent = 'Current Cursor: Crosshair'
			currentCursor = 'crosshair'
		} else {
			body.style.cursor = 'auto'
			currentCursorText.textContent = 'Current Cursor: Normal'
			currentCursor = 'normal'
		}
	}

	menu.appendChild(cursorChangerButton)
	document.body.appendChild(cursorChangerSubMenu)

	function toggleCursorChangerSubMenu() {
		if (cursorChangerSubMenu.style.width === '0px') {
			cursorChangerSubMenu.style.width = '200px'
		} else {
			cursorChangerSubMenu.style.width = '0'
		}
	}

	const creditsButton = document.createElement('img')
	creditsButton.src = 'https://evades.io/question.bc02e04b.png'
	creditsButton.alt = 'Credits'
	creditsButton.style.position = 'absolute'
	creditsButton.style.top = '100px'
	creditsButton.style.left = '10px'
	creditsButton.style.width = '30px'
	creditsButton.style.height = 'auto'
	creditsButton.style.cursor = 'pointer'
	creditsButton.addEventListener('click', function () {
		toggleCreditsSubMenu()
	})

	const creditsSubMenu = document.createElement('div')
	creditsSubMenu.setAttribute('id', 'creditsSubMenu')
	creditsSubMenu.style.position = 'absolute'
	creditsSubMenu.style.top = '100px'
	creditsSubMenu.style.left = '50px'
	creditsSubMenu.style.width = '0px'
	creditsSubMenu.style.height = '150px'
	creditsSubMenu.style.background = 'rgba(0, 0, 0, 0.7)'
	creditsSubMenu.style.transition = 'width 1.5s'
	creditsSubMenu.style.overflow = 'hidden'

	const currentCreditsText = document.createElement('div')
	currentCreditsText.textContent = 'Thanks to EtherCD(aka ✺Mistake✺) for helping and for making Map Filling for Beauty (https://github.com/EtherCD).'
	currentCreditsText.style.color = '#ffffff'
	currentCreditsText.style.position = 'absolute'
	currentCreditsText.style.top = '5px'
	currentCreditsText.style.left = '10px'
	currentCreditsText.style.padding = '5px'
	currentCreditsText.style.display = 'inline-block'

	creditsSubMenu.appendChild(currentCreditsText)

	menu.appendChild(creditsButton)
	document.body.appendChild(creditsSubMenu)

	function toggleCreditsSubMenu() {
		if (creditsSubMenu.style.width === '0px') {
			creditsSubMenu.style.width = '200px'
		} else {
			creditsSubMenu.style.width = '0'
		}
	}

	const subMenu = document.createElement('div')
	subMenu.setAttribute('id', 'subMenu')
	subMenu.style.position = 'absolute'
	subMenu.style.top = '0'
	subMenu.style.left = '50px'
	subMenu.style.width = '0'
	subMenu.style.height = '67px'
	subMenu.style.background = 'rgba(0, 0, 0, 0.7)'
	subMenu.style.transition = 'width 0.5s'
	subMenu.style.overflow = 'hidden'

const colorPickerButton = document.createElement('div');
colorPickerButton.style.display = 'flex';
colorPickerButton.style.alignItems = 'center';
colorPickerButton.style.cursor = 'pointer';
colorPickerButton.style.padding = '5px';
colorPickerButton.style.borderBottom = '1px solid #ccc';
colorPickerButton.textContent = "Change everybody's nick color to rainbow (clientside)";
colorPickerButton.style.color = '#ffffff';
colorPickerButton.style.transition = 'color 1s linear';

let rainbowTextColorInterval;

colorPickerButton.addEventListener('click', function () {
    if (!rainbowTextColorInterval) {
        rainbowTextColorInterval = setInterval(() => {
            let hue = Math.floor(Math.random() * 360);
            colorPickerButton.style.color = `hsl(${hue}, 100%, 50%)`;
        }, 50);
        changeNickColorToRainbow();
        colorPickerButton.textContent = "Stop changing nick color to rainbow";
    } else {
        clearInterval(rainbowTextColorInterval);
        rainbowTextColorInterval = null;
        colorPickerButton.style.color = '#ffffff';
        colorPickerButton.textContent = "Change everybody's nick color to rainbow (clientside)";
    }
});

function changeNickColorToRainbow() {
    const chatMessages = document.querySelectorAll('.chat-message-sender');
    chatMessages.forEach(function (message) {
        if (!isNickAlreadyColored(message)) {
            rainbowNickColor(message);
        }
    });
}

function isNickAlreadyColored(element) {
    return element.style.color !== '' && element.style.color !== 'inherit';
}

function rainbowNickColor(element) {
    let hue = 0;
    setInterval(() => {
        hue = (hue + 1) % 360;
        element.style.color = `hsl(${hue}, 100%, 50%)`;
    }, 50);
}

subMenu.appendChild(colorPickerButton);

	menu.appendChild(settingsButton)
	document.body.appendChild(menu)
	document.body.appendChild(subMenu)

	function toggleSubMenu() {
		if (subMenu.style.width === '0px') {
			subMenu.style.width = '200px'
		} else {
			subMenu.style.width = '0'
		}
	}

function changeNickColor(newColor) {
    const chatMessages = document.querySelectorAll('.chat-message-sender');
    chatMessages.forEach(function (message) {
        message.style.color = newColor;
        message.style.transition = 'color 1s linear';
        rainbowNickColor(message);
    });
}

function rainbowNickColor(element) {
    let hue = 0;
    setInterval(() => {
        hue = (hue + 1) % 360;
        element.style.color = `hsl(${hue}, 100%, 50%)`;
    }, 50);
}

	document.addEventListener('mousemove', function (event) {
		if (event.clientX < 20) {
			menu.style.display = 'block'
			menu.style.width = '150px'
		} else {
			menu.style.width = '50px'
		}
	})
}

// EtherCD's Map Filling for Beauty
window.EvadesME = {
	vars: {
		worlds: {
			'Central Core': ['#425a6d', 0.1],
			//'Catastrophic Core': ['#B00B1E', 0.1, () => Math.abs(Math.sin(Date.now() / 1000) * 0.15)],
			'Haunted Halls': ['#664B00', 0.1],
			'Peculiar Pyramid': ['#666600', 0.1],
			'Wacky Wonderland': ['#870080', 0.1],
			'Glacial Gorge': ['#005668', 0.1],
			'Vicious Valley': ['#4d6b40', 0.1],
			'Humongous Hollow': ['#663900', 0.1],
			'Elite Expanse': ['#2a3b4f', 0.1],
			'Endless Echo': ['#4168c4', 0.1],
			'Dangerous District': ['#680000', 0.1],
			'Quiet Quarry': ['#425a6d', 0.1],
			'Monumental Migration': ['#470066', 0.1],
			'Ominous Occult': ['#63838e', 0.1],
			'Frozen Fjord': ['#27494f', 0.1],
			'Restless Ridge': ['#a88b64', 0.1],
			'Toxic Territory': ['#5c5c5c', 0.1],
			'Magnetic Monopole': ['#bf00ff', 0.1],
			'Burning Bunker': ['#cc0000', 0.1],
			'Grand Garden': ['#6a9c49', 0.1],
			'Mysterious Mansion': ['#9c0ec7', 0.1],
			'Cyber Castle': ['#21bad9', 0.1],
			'Shifting Sands': ['#c88241', 0.1],
			'Infinite Inferno': ['#9b0606', 0.1],
			'Coupled Corridors': ['#bcad59', 0.1],
			'Withering Wasteland': ['#c45945', 0.1],
			'Dusty Depths': ['#825B37', 0.1],
		},
		worldsKeys: [],
	},

	replaces: [],

	addReplace(a, b) {
		this.replaces.push([a, b])
	},

	addReplaces() {
		this.addReplace(
			/prepareCanvas\(\w\)\{[\w\d\$="'.,;#?:\s\(\)]+\}/,
			`prepareCanvas(e) {
                  this.chat.style.visibility = 'visible';
                  this.leaderboard.style.visibility = 'visible';
                  this.context.fillStyle = '#333';
                  this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height);
                  if (window.EvadesME.vars.worldsKeys.includes(e.area.regionName)) {
                    this.context.fillStyle = window.EvadesME.vars.worlds[e.area.regionName][0];
                    this.context.globalAlpha = window.EvadesME.vars.worlds[e.area.regionName][2]
                      ? window.EvadesME.vars.worlds[e.area.regionName][2]()
                      : window.EvadesME.vars.worlds[e.area.regionName][1];
                    this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height);
                    this.context.globalAlpha = 1;
                  }
                  this.camera.centerOn(e.self.entity);
                }`
		)
		// this.addReplace(/=['"]#006b2c['"]/, `="#6B0063"`); // #006b66
		// this.addReplace(/=['"]#00ff6b['"]/, `="#e500ff"`); // #00fff4
	},

	init() {
		this.vars.worldsKeys = Object.keys(this.vars.worlds)
		this.addReplaces()
	},

	insertCode() {
		// From script by @Irudis: Evades Helper
		// commenting from alertix: HMMMM????? hacker??🤨
		let elem = Array.from(document.querySelectorAll('script')).filter(
			a => a.type === 'module' && a.src.match(/\/index\.[0-9a-f]{8}\.js/)
		)[0]
		if (!elem) return
		if (!navigator.userAgent.includes('Firefox')) elem.remove()
		let src = elem.src

		let req = new XMLHttpRequest()
		req.open('GET', src, false)
		req.send()
		let code = req.response
		for (const r in this.replaces)
			code = code.replace(this.replaces[r][0], this.replaces[r][1])

		let nScr = document.createElement('script')
		nScr.setAttribute('type', 'module')
		nScr.innerHTML = code
		document.body.appendChild(nScr)
		console.log('E-Better was loaded!')
		initEBetter()
	},

	// idk why did ethercd put that
	asAddonForTSMod() {
		console.log('Sorry, E-Better is not working with TS-Mod')
	},
}

window.EvadesME.init()
if (!window.tsmod) window.EvadesME.insertCode()
else window.EvadesME.asAddonForTSMod()
function setZoomTo100() {
	document.body.style.zoom = '100%'
}

initEBetter();