// ==UserScript==
// @name Ultra+ Timer
// @description made with much love
// @version 0.0.5
// @author Cazka#1820
// @match *://florr.io/*
// @license MIT
// @namespace https://greasyfork.org/users/541070
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @run-at document-end
// ==/UserScript==
const bosses = [
{
name: 'Beetle',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Bubble',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Cactus',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Centipede',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Cockroach',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Crab',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Fly',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Hornet',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Jellyfish',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Leech',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Moth',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Queen Ant',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Queen Fire Ant',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Rock',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Sandstorm',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Shell',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
{
name: 'Spider',
set spawnedAt(v) {
GM_setValue(this.name, v);
},
get spawnedAt() {
return GM_getValue(this.name, null);
},
},
];
const menu = document.body.appendChild(document.createElement('div'));
menu.style.padding = '15px';
menu.style.background = '#ffffff3f';
menu.style['border-radius'] = '10px';
menu.style.display = GM_getValue('menuDisplay', 'block');
menu.style.position = 'absolute';
menu.style['pointer-events'] = 'none';
menu.style.bottom = '5px';
menu.style.right = '5px';
const table = menu.appendChild(document.createElement('table'));
table.style['font-family'] = 'Ubuntu';
table.style['border-collapse'] = 'collapse';
table.style.width = `100%`;
updateTable();
setInterval(updateTable, 5000);
// Tampermonkey menu
GM_registerMenuCommand('Toggle Menu', (event) => {
const newValue = GM_getValue('menuDisplay', 'block') == 'block' ? 'none' : 'block';
GM_setValue('menuDisplay', newValue);
menu.style.display = newValue;
});
// functions
function updateTable() {
while (table.rows.length > 0) {
table.deleteRow(0);
}
bosses.sort((a, b) => {
if (a.spawnedAt == null && b.spawnedAt == null) {
return a.name.localeCompare(b.name);
}
return (a.spawnedAt ?? Infinity) - (b.spawnedAt ?? Infinity);
});
bosses.forEach((x) => {
const minutes = Math.floor((Date.now() - x.spawnedAt) / 1000 / 60);
if (minutes > 240) {
x.spawnedAt = null;
}
});
bosses.forEach((x, i) => {
const tr = table.insertRow();
// Mob
const td1 = tr.insertCell();
if (i !== 0) {
td1.style['padding-top'] = '5px';
}
if (i !== bosses.length - 1) {
td1.style['padding-bottom'] = '5px';
}
td1.style['padding-right'] = '20px';
td1.appendChild(document.createTextNode(x.name));
// minutes ago
const td2 = tr.insertCell();
if (i !== 0) {
td2.style['padding-top'] = '5px';
}
if (i !== bosses.length - 1) {
td2.style['padding-bottom'] = '5px';
}
td2.style['pointer-events'] = 'auto';
td2.style.cursor = 'pointer';
td2.appendChild(document.createTextNode(toTimeSpanString(x.spawnedAt)));
td2.onclick = (e) => {
if (e.shiftKey) {
const input = window.prompt(`Manually set the timer of ${x.name}`);
if (isNaN(input)) {
return;
}
x.spawnedAt = Date.now() - input * 60 * 1000;
updateTable();
return;
}
if (!window.confirm(`Do you really want to reset the timer of ${x.name}?`)) {
return;
}
x.spawnedAt = Date.now();
updateTable();
};
td2.addEventListener('contextmenu', (e) => e.preventDefault());
});
}
function toTimeSpanString(timestamp) {
if (timestamp == null) {
return 'N/A';
}
const minutes = Math.floor((Date.now() - timestamp) / 1000 / 60);
return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
}