// ==UserScript==
// @name Key press visual representation
// @namespace http://tampermonkey.net/
// @version 5
// @description Shows what keys you are hitting, **press escape to open the menu** Can be useful for .io game streaming, tutorials, etc.
// @author MrBlank
// @match *://lolbeans.io/*
// @match *://*.moomoo.io/*
// @match *://moomoo.io/*
// @match *://sandbox.moomoo.io/*
// @match *://dev.moomoo.io/*
// @match *://*.smashkarts.io/*
// @match *://*.sploop.io/*
// @match *://*.yohoho.io/*
// @match *://*.brutal.io/*
// @match *://*.bonk.io/*
// @match *://*.florr.io/*
// @match *://*.copter.io/*
// @match *://*.defly.io/*
// @grant GM_setValue
// @grant GM_getValue
// @run-at document-end
// @icon https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3qlribLz6iUSvZNdelROWb7FlW5yGDJGgog&s
// ==/UserScript==
//PRESS ESCAPE TO OEPN THE MENU
(function() {
'use strict';
var styles = `
.key-press-menu {
position: fixed;
top: 20px;
right: 20px;
background-color: #f0f0f0;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
padding: 15px;
font-family: Arial, sans-serif;
z-index: 10000;
display: none;
resize: both;
overflow: auto;
min-width: 200px;
min-height: 150px;
max-width: 600px; /* Restrict max width */
max-height: 400px; /* Restrict max height */
}
.key-press-menu h3 {
margin-top: 0;
color: #333;
}
.key-press-menu input, .key-press-menu button, .key-press-menu select {
margin: 5px 0;
padding: 5px;
width: 100%;
box-sizing: border-box;
}
.key-press-menu button {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
.key-box {
position: fixed;
width: 50px;
height: 50px;
background-color: transparent;
border: 2px solid #333;
text-align: center;
line-height: 50px;
font-family: Arial, sans-serif;
font-weight: bold;
color: #333;
cursor: move;
user-select: none;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
`;
// Add styles to the document
var styleElement = document.createElement('style');
styleElement.textContent = styles;
document.head.appendChild(styleElement);
function createMenu() {
var menuContainer = document.createElement('div');
menuContainer.className = 'key-press-menu';
menuContainer.innerHTML = `
<h3>Key Press Settings</h3>
<input type="text" id="keyInput" placeholder="Enter key">
<input type="color" id="colorInput" value="#ff0000">
<button id="addKeyButton">Add Key</button>
<select id="removeKeySelect"></select>
<button id="removeKeyButton">Remove Selected Key</button>
`;
document.body.appendChild(menuContainer);
// Add key
document.getElementById('addKeyButton').addEventListener('click', function() {
var key = document.getElementById('keyInput').value.toUpperCase();
var color = document.getElementById('colorInput').value;
if (key && color) {
addKeyBox(key, color, {top: 100, left: 100});
document.getElementById('keyInput').value = '';
saveKeys();
updateRemoveKeySelect();
}
});
// Remove key
document.getElementById('removeKeyButton').addEventListener('click', function() {
var select = document.getElementById('removeKeySelect');
var selectedKey = select.value;
if (selectedKey) {
removeKeyBox(selectedKey);
saveKeys();
updateRemoveKeySelect();
trackRemovedKey(selectedKey);
}
});
}
function toggleMenu() {
var menuContainer = document.querySelector('.key-press-menu');
if (menuContainer.style.display === 'none' || menuContainer.style.display === '') {
menuContainer.style.display = 'block';
} else {
menuContainer.style.display = 'none';
}
}
document.addEventListener('keydown', function(event) {
if (event.key === 'Escape') {
toggleMenu();
}
});
function addKeyBox(key, color, pos) {
var box = document.createElement('div');
box.className = 'key-box';
box.textContent = key;
box.dataset.color = color;
box.style.left = `${pos.left}px`;
box.style.top = `${pos.top}px`;
if (key === 'SPACE') {
box.style.width = '200px';
box.style.height = '50px';
}
document.body.appendChild(box);
makeDraggable(box);
}
function removeKeyBox(key) {
var keyBoxes = document.querySelectorAll('.key-box');
keyBoxes.forEach(function(box) {
if (box.textContent === key) {
document.body.removeChild(box);
}
});
}
function makeDraggable(element) {
var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
element.onmousedown = dragMouseDown;
function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
e.preventDefault();
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
element.style.top = `${element.offsetTop - pos2}px`;
element.style.left = `${element.offsetLeft - pos1}px`;
}
function closeDragElement() {
document.onmouseup = null;
document.onmousemove = null;
saveKeys();
}
}
function saveKeys() {
var keys = [];
document.querySelectorAll('.key-box').forEach(function(box) {
keys.push({
key: box.textContent,
color: box.dataset.color,
top: parseInt(box.style.top),
left: parseInt(box.style.left)
});
});
localStorage.setItem('keyPressVisualKeys', JSON.stringify(keys));
}
function loadKeys() {
var storedKeys = JSON.parse(localStorage.getItem('keyPressVisualKeys')) || [];
var removedKeys = JSON.parse(localStorage.getItem('removedKeys')) || [];
var existingKeys = new Set(storedKeys.map(item => item.key));
storedKeys.forEach(function(item) {
addKeyBox(item.key, item.color, { top: item.top, left: item.left });
});
var defaultKeys = [
{ key: 'W', color: '#ff0000', top: 50, left: 150 },
{ key: 'A', color: '#00ff00', top: 110, left: 90 },
{ key: 'S', color: '#0000ff', top: 110, left: 150 },
{ key: 'D', color: '#ffff00', top: 110, left: 210 },
{ key: 'SPACE', color: '#ff00ff', top: 170, left: 90 },
{ key: 'CONTROL', color: '#00ffff', top: 50, left: 60 }
];
defaultKeys.forEach(function(item) {
if (!existingKeys.has(item.key) && !removedKeys.includes(item.key)) {
addKeyBox(item.key, item.color, { top: item.top, left: item.left });
existingKeys.add(item.key);
}
});
updateRemoveKeySelect();
}
function updateRemoveKeySelect() {
var select = document.getElementById('removeKeySelect');
select.innerHTML = ''; // Clear options
document.querySelectorAll('.key-box').forEach(function(box) {
var option = document.createElement('option');
option.value = box.textContent;
option.textContent = box.textContent;
select.appendChild(option);
});
}
function trackRemovedKey(key) {
var removedKeys = JSON.parse(localStorage.getItem('removedKeys')) || [];
if (!removedKeys.includes(key)) {
removedKeys.push(key);
localStorage.setItem('removedKeys', JSON.stringify(removedKeys));
}
}
createMenu();
loadKeys();
function resetColor(box) {
box.style.backgroundColor = 'transparent';
}
function changeColor(box, color) {
box.style.backgroundColor = color;
}
document.addEventListener('keydown', function(event) {
var key = event.key.toUpperCase();
if (key === " ") key = "SPACE";
if (key === "CONTROL") key = "CONTROL";
var keyBoxes = document.querySelectorAll('.key-box');
keyBoxes.forEach(function(box) {
if (box.textContent === key) {
changeColor(box, box.dataset.color);
}
});
});
document.addEventListener('keyup', function(event) {
var key = event.key.toUpperCase();
if (key === " ") key = "SPACE";
if (key === "CONTROL") key = "CONTROL";
var keyBoxes = document.querySelectorAll('.key-box');
keyBoxes.forEach(function(box) {
if (box.textContent === key) {
resetColor(box);
}
});
});
setInterval(function() {
var keyBoxes = document.querySelectorAll('.key-box');
keyBoxes.forEach(function(box) {
document.body.appendChild(box);
});
}, 1000);
})();