// ==UserScript==
// @name blaine.io
// @namespace blaine.io
// @version 0.1
// @description blaine.io MOD
// @author Blaine
// @match http://slither.io/*
// @run-at document-body
// @grant none
// ==/UserScript==
// Source: http://slitio.ogario.ovh
(function(w) {
var modVersion = "v0.1",
renderMode = 2, // 3 - normal, 2 - optimized, 1 - simple (mobile)
normalMode = false,
gameFPS = null,
positionHUD = null,
ipHUD = null,
scoreHUD = null,
fpsHUD = null,
styleHUD = "color: #FFF; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 14px; position: fixed; opacity: 0.35; z-index: 7;",
inpNick = null,
currentIP = null,
retry = 0,
bgImage = null,
rotate = false,
highScore = 0;
function init() {
// Append DIVs
appendDiv("position-hud", "nsi", styleHUD + "right: 30; bottom: 120px;");
appendDiv("ip-hud", "nsi", styleHUD + "right: 30; bottom: 150px;");
appendDiv("score-hud", "nsi", styleHUD + "right: 30; bottom: 170px;");
appendDiv("fps-hud", "nsi", styleHUD + "right: 30; bottom: 190px;");
positionHUD = document.getElementById("position-hud");
ipHUD = document.getElementById("ip-hud");
scoreHUD = document.getElementById("score-hud");
fpsHUD = document.getElementById("fps-hud");
// Add zoom
if (/firefox/i.test(navigator.userAgent)) {
document.addEventListener("DOMMouseScroll", zoom, false);
} else {
document.body.onmousewheel = zoom;
}
// Keys
w.addEventListener("keydown", function(e) {
switch(e.keyCode) {
// ESC - quick resp
case 27: quickResp();
break;
// A - Auto skin rotator
case 65:
rotate = !rotate;
rotateSkin();
break;
// Q - Quit to menu
case 81: quit();
break;
// S - Change skin
case 83: changeSkin();
break;
// Z - Reset zoom
case 90: resetZoom();
break;
}
}, false);
// Hijack console log
/*
if (w.console) {
w.console.logOld = console.log;
w.console.log = getConsoleLog;
}
*/
// Set menu
setMenu();
// Set leaderboard
setLeaderboard();
// Set graphics
setGraphics();
// Update loop
updateLoop();
// Show FPS
showFPS();
}
// Append DIV
function appendDiv(id, className, style) {
var div = document.createElement("div");
if (id) {
div.id = id;
}
if (className) {
div.className = className;
}
if (style) {
div.style = style;
}
document.body.appendChild(div);
}
// Zoom
function zoom(e) {
if (!w.gsc || !w.playing) {
return;
}
w.gsc *= Math.pow(0.9, e.wheelDelta / -120 || e.detail / 2 || 0);
}
// Reset zoom
function resetZoom() {
w.gsc = 0.9;
}
// Get console log
function getConsoleLog(log) {
//w.console.logOld(log);
if (log.indexOf("FPS") != -1) {
gameFPS = log;
}
}
// Set menu
function setMenu() {
var login = document.getElementById("login");
if (login) {
// Unblock skins
w.localStorage.setItem("edttsg", "1");
// Load settings
loadSettings();
// Keys info
var div = document.createElement("div");
div.style.width = "300px";
div.style.color = "#56ac81";
div.style.fontFamily = "'Lucida Sans Unicode', 'Lucida Grande', sans-serif";
div.style.fontSize = "12px";
div.style.textAlign = "center";
div.style.opacity = "0.5";
div.style.margin = "0 auto";
div.style.padding = "10px 0";
div.innerHTML = "[ESC] - Quick resp | [Q] - Quit to menu<br/>[A] - Auto skin rotator | [S] - Change skin<br/>[Z] - Reset zoom | [Space] - Boost";
login.appendChild(div);
// Menu container
var sltMenu = document.createElement("div");
sltMenu.style.width = "260px";
sltMenu.style.color = "#8058D0";
sltMenu.style.backgroundColor = "#1e262e";
sltMenu.style.borderRadius = "29px";
sltMenu.style.fontFamily = "'Lucida Sans Unicode', 'Lucida Grande', sans-serif";
sltMenu.style.fontSize = "14px";
sltMenu.style.textAlign = "center";
sltMenu.style.margin = "0 auto 100px auto";
sltMenu.style.padding = "10px 14px";
sltMenu.innerHTML = "MOD: <strong>SLITio by szymy</strong> | <strong>" + modVersion + "</strong>";
login.appendChild(sltMenu);
// IP input container
var div = document.createElement("div");
div.style.color = "#8058D0";
div.style.backgroundColor = "#4C447C";
div.style.borderRadius = "29px";
div.style.margin = "10 auto";
div.style.padding = "8px";
sltMenu.appendChild(div);
// IP input
var input = document.createElement("input");
input.id = "server-ip";
input.type = "text";
input.placeholder = "Server address (IP:port)";
input.style.height = "24px";
input.style.display = "inline-block";
input.style.background = "none";
input.style.color = "#e0e0ff";
input.style.border = "none";
input.style.outline = "none";
div.appendChild(input);
// Connect (play) button
var button = document.createElement("input");
button.id = "connect-btn";
button.type = "button";
button.value = "Play";
button.style.height = "24px";
button.style.display = "inline-block";
button.style.borderRadius = "12px";
button.style.color = "#FFF";
button.style.backgroundColor = "#56ac81";
button.style.border = "none";
button.style.outline = "none";
button.style.cursor = "pointer";
button.style.padding = "0 20px";
div.appendChild(button);
// Select server container
var div = document.createElement("div");
div.style.backgroundColor = "#919191";
div.style.borderRadius = "29px";
div.style.margin = "10 auto";
div.style.padding = "8px";
sltMenu.appendChild(div);
// Select server
var select = document.createElement("select");
select.id = "select-srv";
select.style.background = "none";
select.style.border = "none";
select.style.outline = "none";
var option = document.createElement("option");
option.value = "";
option.text = "-- Select a server --";
select.appendChild(option);
div.appendChild(select);
// Select graph container
var div = document.createElement("div");
div.style.backgroundColor = "#A5A5A5";
div.style.borderRadius = "29px";
div.style.margin = "10 auto";
div.style.padding = "8px";
sltMenu.appendChild(div);
// Select graph
var select = document.createElement("select");
select.id = "select-graph";
select.style.background = "none";
select.style.border = "none";
select.style.outline = "none";
div.appendChild(select);
var option = document.createElement("option");
option.value = "3";
option.text = "Graphics: normal";
select.appendChild(option);
var option = document.createElement("option");
option.value = "2";
option.text = "Graphics: optimized";
select.appendChild(option);
var option = document.createElement("option");
option.value = "1";
option.text = "Graphics: low";
select.appendChild(option);
// Menu footer
sltMenu.innerHTML += '<a href="http://ogario.ovh" target="_blank" style="color: #56ac81;">Visit ogario.ovh</a> | ';
sltMenu.innerHTML += '<a href="https://www.youtube.com/channel/UCaWiPNJWnhzYDrBQoXokn6w" target="_blank" style="color: #56ac81;">YT Channel</a>';
// Get IP input
inpIP = document.getElementById("server-ip");
// Get nick
var nick = document.getElementById("nick");
nick.addEventListener("input", getNick, false);
// Force connect
var connectBtn = document.getElementById("connect-btn");
connectBtn.onclick = forceConnect;
// Get servers list
getServersList();
// Set graphic mode
var selectGraph = document.getElementById("select-graph");
if (renderMode == 1) {
selectGraph.selectedIndex = 2;
} else if (renderMode == 2) {
selectGraph.selectedIndex = 1;
} else {
selectGraph.selectedIndex = 0;
normalMode = true;
}
selectGraph.onchange = function() {
var mode = selectGraph.value;
if (mode) {
renderMode = mode;
w.localStorage.setItem("rendermode", renderMode);
}
};
resizeView();
} else {
setTimeout(setMenu, 100);
}
}
// Load settings
function loadSettings() {
if (w.localStorage.getItem("nick") != null) {
var nick = w.localStorage.getItem("nick");
document.getElementById("nick").value = nick;
}
if (w.localStorage.getItem("rendermode") != null) {
var mode = parseInt(w.localStorage.getItem("rendermode"));
if (mode >= 1 && mode <= 3) {
renderMode = mode;
}
}
if (w.localStorage.getItem("highscore") != null) {
var score = parseFloat(w.localStorage.getItem("highscore"));
if (score > 0) {
highScore = score;
}
}
}
// Get nick
function getNick() {
var nick = document.getElementById("nick").value;
w.localStorage.setItem("nick", nick);
}
// Connection status
function connectionStatus() {
if (!w.connecting || retry == 10) {
w.forcing = false;
retry = 0;
return;
}
retry++;
setTimeout(connectionStatus, 1000);
}
// Force connect
function forceConnect() {
if (inpIP.value.length == 0 || !w.connect) {
return;
}
w.forcing = true;
if (!w.bso) {
w.bso = {};
}
var srv = inpIP.value.trim().split(":");
w.bso.ip = srv[0];
w.bso.po = srv[1];
w.connect();
setTimeout(connectionStatus, 1000);
}
// Get servers list
function getServersList() {
if (w.sos && w.sos.length > 0) {
var selectSrv = document.getElementById("select-srv");
for (var i = 0; i < sos.length; i++) {
var srv = sos[i];
var option = document.createElement("option");
option.value = srv.ip + ":" + srv.po;
option.text = (i + 1) + ". " + option.value;
selectSrv.appendChild(option);
}
selectSrv.onchange = function() {
var srv = selectSrv.value;
inpIP.value = srv;
};
} else {
setTimeout(getServersList, 100);
}
}
// Resize view
function resizeView() {
if (w.resize) {
w.lww = 0; // Reset width (force resize)
w.wsu = 0; // Clear ad space
w.resize();
var wh = Math.ceil(w.innerHeight);
if (wh < 800) {
var login = document.getElementById("login");
w.lgbsc = wh / 800;
login.style.top = - (Math.round(wh * (1 - w.lgbsc) * 1E5) / 1E5) + "px";
if (w.trf) {
w.trf(login, "scale(" + w.lgbsc + "," + w.lgbsc + ")");
}
}
} else {
setTimeout(resizeView, 100);
}
}
// Set leaderboard
function setLeaderboard() {
if (w.lbh) {
w.lbh.textContent = "MOD: SLITio by szymy";
w.lbh.style.fontSize = "20px";
} else {
setTimeout(setLeaderboard, 100);
}
}
// Set normal mode
function setNormalMode() {
normalMode = true;
w.ggbg = true;
if (!w.bgp2 && bgImage) {
w.bgp2 = bgImage;
}
w.render_mode = 2;
}
// Set graphics
function setGraphics() {
if (renderMode == 3) {
if (!normalMode) {
setNormalMode();
}
return;
}
if (normalMode) {
normalMode = false;
}
if (w.want_quality && w.want_quality != 0) {
w.want_quality = 0;
w.localStorage.setItem("qual", "0");
w.grqi.src = "/s/lowquality.png";
}
if (w.ggbg && w.gbgmc) {
w.ggbg = false;
}
if (w.bgp2) {
bgImage = w.bgp2;
w.bgp2 = null;
}
if (w.high_quality) {
w.high_quality = false;
}
if (w.gla && w.gla != 0) {
w.gla = 0;
}
if (w.render_mode && w.render_mode != renderMode) {
w.render_mode = renderMode;
}
}
// Quick resp
function quickResp() {
w.dead_mtm = 0;
w.login_fr = 0;
forceConnect();
}
// Quit to menu
function quit() {
if (w.playing && w.resetGame) {
w.want_close_socket = true;
w.dead_mtm = 0;
if (w.play_btn) {
w.play_btn.setEnabled(true);
}
w.resetGame();
}
}
// Change skin
function changeSkin() {
if (w.playing && w.snake != null) {
var skin = w.snake.rcv,
max = w.max_skin_cv || 25;
skin++;
if (skin > max) {
skin = 0;
}
w.setSkin(w.snake, skin);
}
}
// Rotate skin
function rotateSkin() {
if (!rotate) {
return;
}
changeSkin();
setTimeout(rotateSkin, 500);
}
// Set high score
function setHighScore() {
if (!w.snake || !w.fpsls || !w.fmlts) {
return;
}
var currentScore = Math.floor(150 * (w.fpsls[w.snake.sct] + w.snake.fam / w.fmlts[w.snake.sct] - 1) - 50) / 10;
if (currentScore > highScore) {
highScore = currentScore;
w.localStorage.setItem("highscore", highScore);
}
if (scoreHUD && highScore > 0) {
scoreHUD.textContent = "Best score: " + highScore;
}
}
// Show FPS
function showFPS() {
if (w.playing && fpsHUD && w.fps && w.lrd_mtm) {
if (Date.now() - w.lrd_mtm > 970) {
fpsHUD.textContent = "FPS: " + w.fps;
}
}
setTimeout(showFPS, 30);
}
// Update loop
function updateLoop() {
setGraphics();
setHighScore();
if (w.playing) {
if (positionHUD) {
positionHUD.textContent = "X: " + (~~w.view_xx || 0) + " Y: " + (~~w.view_yy || 0);
}
if (inpIP && w.bso && currentIP != w.bso.ip + ":" + w.bso.po) {
currentIP = w.bso.ip + ":" + w.bso.po;
inpIP.value = currentIP;
if (ipHUD) {
ipHUD.textContent = "Server: " + currentIP;
}
}
} else {
positionHUD.textContent = "";
fpsHUD.textContent = "";
}
setTimeout(updateLoop, 1000);
}
// Init
init();
})(window);