If you were one of the first to install the extension, you may have missed some of the new features. Since now, to let you know about all the new features you'll be shown the ! icon whenever the script is updated.
` + win.innerHTML;
blackout.appendChild(win);
function resize() {
if (blackout.style.display == 'block') {
if (window.innerHeight < win.offsetHeight + 20) {
win.style.top = '0';
win.style.margin = '10px';
win.style.transform = 'translate(-50%, 0%)';
} else {
win.style.top = '50%';
win.style.margin = '0';
win.style.transform = 'translate(-50%, -50%)';
}
}
}
window.addEventListener('resize', resize);
document.addEventListener('click', function(e) {
if (blackout.style.display == 'block' && e.target != win && !win.contains(e.target)) blackout.style.display = 'none';
}, true);
var done = btnTemplate.cloneNode();
done.style.display = 'block';
done.style.margin = '12px auto 0';
done.innerText = 'Done';
done.addEventListener('click', function() {
blackout.style.display = 'none';
});
win.appendChild(done);
var keyCodes = {
8 : 'Backspace',
9 : 'Tab',
13 : 'Enter',
33 : 'Page Up',
34 : 'Page Down',
35 : 'End',
36 : 'Home',
37 : 'Left Arrow',
38 : 'Up Arrow',
39 : 'Right Arrow',
40 : 'Down Arrow',
48 : '0',
49 : '1',
50 : '2',
51 : '3',
52 : '4',
53 : '5',
54 : '6',
55 : '7',
56 : '8',
57 : '9',
65 : 'A',
66 : 'B',
67 : 'C',
68 : 'D',
69 : 'E',
70 : 'F',
71 : 'G',
72 : 'H',
73 : 'I',
74 : 'J',
75 : 'K',
76 : 'L',
77 : 'M',
78 : 'N',
79 : 'O',
80 : 'P',
81 : 'Q',
82 : 'R',
83 : 'S',
84 : 'T',
85 : 'U',
86 : 'V',
87 : 'W',
88 : 'X',
89 : 'Y',
90 : 'Z',
96 : 'Numpad 0',
97 : 'Numpad 1',
98 : 'Numpad 2',
99 : 'Numpad 3',
100 : 'Numpad 4',
101 : 'Numpad 5',
102 : 'Numpad 6',
103 : 'Numpad 7',
104 : 'Numpad 8',
105 : 'Numpad 9'
};
var defaultKeys = {
freeze: 83,
skins: 75,
names: 78,
mass: 77,
food: 70,
chat: 72,
tripleSplit: null,
minimap: null,
scorePanel: null,
partyPanel: null,
leaderboard: null,
autoDecline: null,
autoRespawn: null,
queue: 13,
leave: 76
};
var inputs = document.querySelectorAll('.donut-features-table input[type="text"][data-donut-feature]'), errorKeys = 'Gota.io Features by Donut: An error occurred. We had to reset your custom keys.';
function fillInputs(keys) {
for (var i = 0; i < inputs.length; i++) {
var feature = inputs[i].dataset.donutFeature, key = keys[feature];
if (typeof key == 'undefined' && feature in defaultKeys) {
key = keys[feature] = defaultKeys[feature];
localStorage['donut-keys'] = JSON.stringify(keys);
}
if (key === null) continue;
var value = keyCodes[key];
if (value) inputs[i].value = value;
else throw errorKeys;
}
}
function tryLocalStorage(index, defaultObj, func, error) {
var obj; index = 'donut-' + index;
try {
if (!localStorage[index]) throw null;
obj = JSON.parse(localStorage[index]);
func(obj);
} catch (e) {
obj = JSON.parse(JSON.stringify(defaultObj));
if (e) console.error(error);
localStorage[index] = JSON.stringify(obj);
func(obj);
}
return obj;
}
var keys = tryLocalStorage('keys', defaultKeys, fillInputs, errorKeys);
for (var j = 0; j < inputs.length; j++) {
inputs[j].addEventListener('keydown', function(e) {
e.preventDefault();
var feature = this.dataset.donutFeature, key = e.which || e.keyCode || 0;
if (key == 46) {
this.value = '';
keys[feature] = null;
localStorage['donut-keys'] = JSON.stringify(keys);
}
else if (key != keys[feature] && key in keyCodes) {
this.value = keyCodes[key];
for (var k in keys) {
if (keys[k] == key) {
keys[k] = null;
for (var l = 0; l < inputs.length; l++) if (inputs[l].dataset.donutFeature == k) {
inputs[l].value = '';
break;
}
}
}
keys[feature] = key;
localStorage['donut-keys'] = JSON.stringify(keys);
}
});
}
function triggerCheckbox(id) {
$('#' + id).prop('checked', !$('#' + id).prop('checked')).trigger('change');
}
function triggerDonutCheckbox(id) {
var checkbox = document.getElementById(id);
checkbox.checked = !checkbox.checked;
checkbox.dispatchEvent(new Event('change'));
}
function fadeOutMain() {
if (document.getElementById('main').style.display == 'block') window.onkeydown({keyCode: 27, which: 27});
}
var alertWin = win.cloneNode();
alertWin.style.top = '10px';
alertWin.style.display = 'none';
alertWin.style.lineHeight = '19px';
alertWin.style.backgroundColor = 'rgba(23,23,23,.9)';
alertWin.style.boxShadow = '0 2px 3px rgba(0,0,0,.25)';
alertWin.style.transform = 'translate(-50%, 0%)';
alertWin.style.zIndex = '3';
document.body.appendChild(alertWin);
var alertFadeOutTimer = 0;
function Alert(html, timeout) {
alertWin.innerHTML = html;
$(alertWin).fadeIn(500);
if (alertFadeOutTimer) clearTimeout(alertFadeOutTimer);
alertFadeOutTimer = setTimeout(function() {
$(alertWin).fadeOut(500);
alertFadeOutTimer = 0;
}, timeout);
}
var frozen = false, x = 0, y = 0, originalMousemove = window.onmousemove;
window.onmousemove = function(e) {
x = e.clientX; y = e.clientY;
if (!frozen) originalMousemove(e);
};
window.addEventListener('keydown', function(e) {
if (!e.altKey && !e.ctrlKey && !e.metaKey) {
var key = e.which || e.keyCode || 0;
if (key == 13 && document.activeElement === document.getElementById('name-box')) team2v2();
else if (key == 27) {
if (!firstEscape) firstEscape = true;
if (alertWin.offsetHeight) $(alertWin).fadeOut(500);
}
else if (!e.shiftKey && document.activeElement.tagName != 'INPUT' && document.activeElement.tagName != 'TEXTAREA') switch (key) {
case keys.freeze:
X = window.innerWidth/2;
Y = window.innerHeight/2;
originalMousemove({clientX: X, clientY: Y});
frozen = true;
break;
case keys.skins:
triggerCheckbox('cHideSkins');
break;
case keys.names:
triggerCheckbox('cHideNames');
break;
case keys.mass:
triggerCheckbox('cShowMass');
break;
case keys.food:
triggerCheckbox('cHideFood');
break;
case keys.chat:
triggerCheckbox('cHideChat');
break;
case keys.tripleSplit:
for (var i = 0; i < 3; i++) $(window).trigger($.Event('keydown', {keyCode: 32, which: 32}));
break;
case keys.minimap:
triggerCheckbox('cHideMinimap');
break;
case keys.scorePanel:
triggerDonutCheckbox('donut-hideScorePanel');
break;
case keys.partyPanel:
triggerDonutCheckbox('donut-hidePartyPanel');
break;
case keys.leaderboard:
triggerDonutCheckbox('donut-hideLeaderboard');
break;
case keys.autoDecline:
triggerCheckbox('cAutoDecline');
Alert('Auto Decline Party Invites: ' + (document.getElementById('cAutoDecline').checked ? 'On' : 'Off') + '', 2500);
break;
case keys.autoRespawn:
var id = done2v2 ? 'donut-scrimmageAutoRespawn' : 'cAutoRespawn';
if (done2v2) triggerDonutCheckbox(id);
else triggerCheckbox(id);
Alert('Auto Respawn' + (done2v2 ? ' in Team Scrimmage' : '') + ': ' + (document.getElementById(id).checked ? 'On' : 'Off') + '', 2500);
break;
case keys.queue:
if (document.getElementById('scrimmage-btn-leave').style.display == 'block') $('#btn-leave-match').trigger('click');
else if (document.getElementById('main-scrimmage').style.display == 'block') $('#btn-queue').trigger('click');
fadeOutMain();
break;
case keys.leave:
if (scrimmage) {
var cp = document.getElementById('chat-panel'), hidden = cp.style.display == 'none';
if (hidden) {
cp.style.opacity = '0';
cp.style.display = 'block';
}
$('#chat-input').val('/leave').focus().trigger($.Event('keypress', {keyCode: 13, which: 13})).blur();
scrimmage = false;
if (hidden) {
cp.style.display = 'none';
cp.style.opacity = '1';
}
fadeOutMain();
}
}
}
});
window.addEventListener('keyup', function(e) {
var key = e.which || e.keyCode || 0;
if (key == keys.freeze && !e.altKey && !e.ctrlKey && !e.metaKey && !e.shiftKey && document.activeElement.tagName != 'INPUT' && document.activeElement.tagName != 'TEXTAREA') {
frozen = false;
originalMousemove({clientX: x, clientY: y});
}
});
var defaultSwitches = {
hideScorePanel: false,
hidePartyPanel: false,
hideLeaderboard: false,
scrimmageAutoRespawn: true,
startWithScrimmage: false
};
var checkboxes = document.getElementsByClassName('donut-checkbox'), errorSwitches = 'Gota.io Features by Donut: An error occurred. We had to reset your settings.';
function fillCheckboxes(switches) {
for (var i = 0; i < checkboxes.length; i++) {
var feature = checkboxes[i].dataset.donutFeature, Switch = switches[feature];
if (typeof Switch == 'undefined' && feature in defaultSwitches) {
Switch = switches[feature] = defaultSwitches[feature];
localStorage['donut-switches'] = JSON.stringify(switches);
}
if (typeof Switch == 'boolean') checkboxes[i].checked = Switch;
else throw errorSwitches;
}
}
var switches = tryLocalStorage('switches', defaultSwitches, fillCheckboxes, errorSwitches);
var anchorObd = document.querySelector('.options-container>p:nth-of-type(2)'), obd = anchorObd.cloneNode(true);
obd.firstChild.innerText = 'Options by Donut';
anchorObd.parentNode.insertBefore(obd, anchorObd);
function duplicatedCheckbox(el, feature, text) {
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.className = 'checkbox-options';
checkbox.dataset.donutFeature = feature;
el.parentNode.insertBefore(checkbox, el);
var span = document.createElement('span');
span.innerText = text;
el.parentNode.insertBefore(span, el);
var br = document.createElement('br');
el.parentNode.insertBefore(br, el);
return checkbox;
}
for (var feature in defaultSwitches) {
var bro = document.querySelector('.donut-checkbox[data-donut-feature="' + feature + '"]');
duplicatedCheckbox(anchorObd, feature, feature == 'startWithScrimmage' ? 'Join Scrimmage as I open the game' : bro.parentNode.innerText).checked = switches[feature];
}
checkboxes = document.querySelectorAll('input[type="checkbox"][data-donut-feature]');
for (var k = 0; k < checkboxes.length; k++) {
checkboxes[k].addEventListener('change', function(e) {
var feature = this.dataset.donutFeature;
switches[feature] = this.checked;
localStorage['donut-switches'] = JSON.stringify(switches);
document.querySelector('input[type="checkbox"][data-donut-feature="' + feature + '"]' + (this.classList.contains('donut-checkbox') ? ':not(.donut-checkbox)' : '.donut-checkbox')).checked = this.checked;
switch (feature) {
case 'hideScorePanel':
if (this.checked) hideScorePanel();
else {
document.getElementById('party-panel').style.top = document.getElementById('score-panel').offsetHeight + 20 + 'px';
document.getElementById('score-panel').style.opacity = '1';
}
break;
case 'hidePartyPanel':
visibility('party-panel', !this.checked);
break;
case 'hideLeaderboard':
visibility('leaderboard-panel', !this.checked);
break;
case 'scrimmageAutoRespawn':
if (this.checked && scrimmage) scrimRespawn();
}
});
}
function hideScorePanel() {
document.getElementById('score-panel').style.opacity = '0';
document.getElementById('party-panel').style.top = '10px';
}
if (switches.hideScorePanel) hideScorePanel();
document.getElementById('cHideId').addEventListener('change', function() {
if (document.getElementById('score-panel').style.opacity == '1') document.getElementById('party-panel').style.top = document.getElementById('score-panel').offsetHeight + 20 + 'px';
});
function visibility(id, visible) {
document.getElementById(id).style.visibility = visible ? 'visible' : 'hidden';
}
if (switches.hideLeaderboard) visibility('leaderboard-panel', false);
if (switches.hidePartyPanel) visibility('party-panel', false);
var scrimmage = false, respawnCheckInterval = 0, respawnTimer = 0;
document.getElementById('btn-queue').addEventListener('click', function() {
scrimmage = true;
if (switches.scrimmageAutoRespawn) scrimRespawn();
});
function scrimmageFalse() {
scrimmage = false;
if (respawnTimer) {
clearTimeout(respawnTimer);
respawnTimer = respawnCheckInterval = 0;
}
}
document.getElementById('btn-leave-match').addEventListener('click', scrimmageFalse);
function scrimRespawn() {
var cells = document.getElementById('playerCells'), cellsNum = parseInt(cells.innerText, 10);
if (respawnCheckInterval) clearInterval(respawnCheckInterval);
respawnCheckInterval = setInterval(function() {
if (switches.scrimmageAutoRespawn && scrimmage) {
var temp = parseInt(cells.innerText, 10);
if (temp != cellsNum) {
cellsNum = temp;
if (cellsNum === 0) {
if (document.getElementById('main-scrimmage').style.display == 'none') respawnTimer = setTimeout(function() {
if (switches.scrimmageAutoRespawn && scrimmage) {
$('#btn-play').trigger('click');
respawnTimer = 0;
scrimRespawn();
}
}, 10000);
clearInterval(respawnCheckInterval);
respawnCheckInterval = 0;
}
}
} else {
clearInterval(respawnCheckInterval);
respawnCheckInterval = 0;
}
}, 500);
}
var firstEscape = false;
function startScrimmage() {
var region = document.getElementsByClassName('server-active')[0].getAttribute('region');
if (region != 'ap') {
var id = region == 'eu' ? 's_BETA' : 's_Jet';
var interval = setInterval(function() {
if (document.getElementById(id) && document.getElementsByClassName('server-selected').length) {
$('#' + id).trigger('click');
$('#btn-play').trigger('click');
setTimeout(function() {
if (!firstEscape && !done2v2) Alert('It looks like the server is not responding. You may want to press Esc to go back to the game menu.', 20000);
}, 5000);
clearInterval(interval);
}
}, 100);
}
}
if (switches.startWithScrimmage) startScrimmage();
var lastScrimmageServer = null;
function isTeamScrimmage() {
var servers = ['BETA', 'Jet'];
for (var i = 0; i < servers.length; i++) if (document.getElementById('s_' + servers[i]).classList.contains('server-selected')) return servers[i];
return false;
}
var done2v2 = false, checkigTean2v2 = false;
function team2v2() {
if (!checkigTean2v2) {
var scrimmageServer = isTeamScrimmage();
if (scrimmageServer) {
if (!done2v2 || scrimmageServer != lastScrimmageServer) {
lastScrimmageServer = scrimmageServer;
checkigTean2v2 = true;
var interval = setInterval(function() {
if (document.getElementById('main-scrimmage').style.display == 'block' && document.getElementById('scrimmage-mode-select').options.selectedIndex === 0) {
document.getElementById('scrimmage-mode-select').options.selectedIndex = 1;
$('#scrimmage-mode-select').trigger('change');
clearTimeout(timeout);
clearInterval(interval);
done2v2 = true;
checkigTean2v2 = false;
if (switches.startWithScrimmage && alertWin.offsetHeight) alertWin.style.display = 'none';
}
}, 100), timeout = setTimeout(function() {
clearInterval(interval);
checkigTean2v2 = false;
}, 25000);
}
} else {
scrimmageFalse();
done2v2 = false;
}
}
}
document.getElementById('btn-play').addEventListener('click', team2v2);
document.getElementById('btn-spec').addEventListener('click', team2v2);
})();