您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Pings available servers and lets you pick the one you want. This is a good plugin for playing with friends.
当前为
- // ==UserScript==
- // @name Slither.io Server Picker
- // @namespace http://tampermonkey.net/
- // @version 0.1.11
- // @description Pings available servers and lets you pick the one you want. This is a good plugin for playing with friends.
- // @author SystemDisc
- // @match http://slither.io/
- // @grant none
- // @run-at document-start
- // @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
- // ==/UserScript==
- (function() {
- 'use strict';
- let serverData = $.ajax({
- type: 'GET',
- url: 'http://slither.io/i33628.txt',
- async: false
- }).responseText;
- let currentZoom = 0.9;
- $(function() {
- let css = `
- iframe[src="/social-box/"] {
- display: none !important;
- }
- #HUD, #sidebar {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 20;
- padding: 15px;
- background-color: rgba(0,0,0,0.5);
- color: #fff;
- }
- #sidebar {
- height: 100vh;
- overflow: auto;
- }
- #connectForm {
- margin-bottom: 15px;
- }
- #serverList > .server-listing {
- margin-bottom: 5px;
- cursor: pointer;
- }
- #serverList > .server-listing > .server-name, #serverList > .server-listing > .server-ping {
- display: inline-block;
- }
- #serverList > .server-listing > .server-ping {
- margin-left: 10px;
- color: green;
- }
- #serverList > .server-listing > .server-ping.bad {
- color: red;
- }
- `;
- let styleSheet = $('<style type="text/css">');
- styleSheet.html(css);
- let HUD = $('<div id="HUD">');
- let server = $('<div class="server">');
- let coordinates = $('<div class="coordinates">');
- let section = $('<div class="section">');
- HUD.append(server);
- HUD.append(coordinates);
- HUD.append(section);
- let sidebar = $('<div id="sidebar">');
- let connectForm = $('<div id="connectForm">');
- let serverInput = $('<input class="server-input" type="test" name="serverHostname" placeholder="ip:port">');
- let serverConnect = $('<button class="connect-button" type="button">Connect</button>');
- connectForm.append(serverInput);
- connectForm.append(serverConnect);
- let serverList = $('<div id="serverList">');
- sidebar.append(connectForm);
- sidebar.append(serverList);
- $('body').append(HUD);
- $('body').append(sidebar);
- $('head').append(styleSheet);
- $('#HUD').hide();
- $(document).on('click', '#connectForm > .connect-button', function(e) {
- selectServer($('.server-input').val());
- });
- $(document).on('click', '#serverList > .server-listing', function(e) {
- selectServer($(e.currentTarget).find('.server-name').text());
- });
- let start = true;
- setInterval(function() {
- if (!window.playing) {
- $('#sidebar').show();
- $('#HUD').hide();
- if (!$('#nick').hasClass('loaded')) {
- $('#nick').val(localStorage.getItem('savedNick'));
- $('#nick').addClass('loaded');
- }
- if (start) {
- loadServers();
- start = false;
- }
- }
- else {
- $('#sidebar').hide();
- $('#HUD').show();
- start = true;
- }
- window.want_quality = 1;
- window.render_mode = 1;
- window.high_quality = true;
- window.gla = false;
- window.ggbg = false;
- if (window.gbgi) {
- window.gbgi.src = '';
- window.gbgi.onload = null;
- window.gbgi = null;
- if (window.gbgmc) {
- window.gbgmc = null;
- }
- }
- window.gsc = currentZoom;
- if (window.snake) {
- $('#HUD').find('.server').text('Server: ' + window.bso.ip + ':' + window.bso.po);
- $('#HUD').find('.coordinates').text('Coordinates: ' + Math.round(window.snake.xx / 100) + ', ' + Math.round(window.snake.yy / 100));
- $('#HUD').find('.section').text('Section: ' + Math.round((window.snake.xx - 22000) / 1000) + ', ' + Math.round((window.snake.yy - 22000)/1000));
- localStorage.setItem('savedNick', snake.nk);
- }
- if (window.bso && window.bso.ip) {
- document.title = 'slither.io - ' + window.bso.ip + ':' + window.bso.po;
- }
- else {
- document.title = 'slither.io - disconnected'
- }
- }, 15);
- $(document).bind('DOMMouseScroll mousewheel', zoom);
- $(window).keydown(function(e) {
- console.log('keydown: ' + e.keyCode);
- if (e.keyCode === 27) {
- quit();
- }
- if (e.keyCode === 90) {
- currentZoom = 0.9;
- }
- });
- });
- function loadServers() {
- let serverList = $('#serverList');
- serverList.children().remove();
- let servers = loadSos(serverData);
- let savedServers = window.localStorage.getItem('servers');
- if (!savedServers) {
- savedServers = {};
- }
- else {
- savedServers = JSON.parse(savedServers);
- }
- for (let servername in savedServers) {
- let ip;
- let port;
- [ip, port] = servername.split(':');
- servers.push({ip: ip, po: port});
- }
- let promises = [];
- servers.forEach(function(server) {
- let serverElem = $('[id="' + server.ip + '"]');
- let serverNameElem;
- let serverPingElem;
- if (serverElem.length === 0) {
- serverElem = $('<div id="' + server.ip + '" class="server-listing">');
- serverNameElem = $('<div class="server-name">');
- serverPingElem = $('<div class="server-ping">');
- serverNameElem.text(server.ip + ':' + server.po);
- serverElem.append(serverNameElem);
- serverElem.append(serverPingElem);
- serverList.append(serverElem);
- }
- else {
- serverNameElem = serverElem.find('.server-name');
- serverPingElem = serverElem.find('.server-ping');
- }
- let promise = pingServer(server.ip).then(function(ping) {
- if (savedServers[server.ip + ':' + server.po]) {
- ping = Math.round((savedServers[server.ip + ':' + server.po] + ping) / 2);
- }
- let pingElem = $('[id="' + server.ip + '"]').find('.server-ping');
- pingElem.text(ping);
- if (ping > 75) {
- pingElem.addClass('bad');
- }
- else {
- savedServers[server.ip + ':' + server.po] = ping;
- pingElem.removeClass('bad');
- }
- let serverList = $('#serverList');
- let serverElems = serverList.children();
- serverElems.sort(function(a, b) {
- let an = +$(a).find('.server-ping').text();
- let bn = +$(b).find('.server-ping').text();
- if (an === 0) {
- an = 1000;
- }
- if (bn === 0) {
- bn = 1000;
- }
- return an > bn? 1:(an < bn? -1:0);
- });
- serverElems.detach().appendTo(serverList);
- if (!window.bso || !window.bso.ip) {
- $('.server-input').val(serverElems.first().find('.server-name').text());
- }
- }).catch(function(err) {
- $('[id="' + server.ip + '"]').remove();
- delete savedServers[server.ip + ':' + server.po];
- return false;
- });
- promises.push(promise);
- });
- Promise.all(promises).then(function() {
- localStorage.setItem('servers', JSON.stringify(savedServers));
- selectServer($('.server-input').val());
- });
- }
- function quit() {
- if (window.playing && window.resetGame) {
- window.want_close_socket = true;
- window.dead_mtm = 0;
- if (window.play_btn) {
- window.play_btn.setEnabled(true);
- }
- window.resetGame();
- }
- }
- function zoom(e) {
- console.log(window.gsc);
- if (!window.gsc) {
- return;
- }
- currentZoom *= Math.pow(0.9, e.originalEvent.wheelDelta / -120 || e.originalEvent.detail / 2 || 0);
- }
- function selectServer(servername) {
- let ip;
- let port;
- [ip, port] = servername.split(':');
- console.log(ip, +port);
- window.forceServer(ip, +port);
- let serverElem = $('[id="' + ip + '"]');
- serverElem.addClass('selected');
- serverElem.siblings().removeClass('selected');
- $('.server-input').val(servername);
- }
- function loadSos(chars) {
- /** @type {Array} */
- sos = [];
- /** @type {Array} */
- clus = [];
- chars.charAt(0);
- /** @type {number} */
- var i = 1;
- var d = {};
- /** @type {number} */
- var index = 0;
- /** @type {number} */
- d = index = 0;
- var c;
- /** @type {number} */
- var data = 0;
- /** @type {number} */
- var handle = 0;
- /** @type {Array} */
- var split = [];
- /** @type {Array} */
- var m = [];
- /** @type {Array} */
- var messages = [];
- /** @type {Array} */
- var received = [];
- for (;i < chars.length;) {
- if (c = (chars.charCodeAt(i++) - 97 - handle) % 26, 0 > c && (c += 26), data *= 16, data += c, handle += 7, 1 == d) {
- if (0 == index) {
- split.push(data);
- if (4 == split.length) {
- index++;
- }
- } else {
- if (1 == index) {
- m.push(data);
- if (3 == m.length) {
- index++;
- }
- } else {
- if (2 == index) {
- messages.push(data);
- if (3 == messages.length) {
- index++;
- }
- } else {
- if (3 == index && (received.push(data), 1 == received.length)) {
- d = {};
- /** @type {number} */
- index = c = 0;
- for (;index < m.length;index++) {
- c *= 256;
- c += m[index];
- }
- /** @type {number} */
- index = m = 0;
- for (;index < messages.length;index++) {
- m *= 256;
- m += messages[index];
- }
- /** @type {string} */
- d.ip = split.join(".");
- d.po = c;
- d.ac = m;
- d.wg = m + 5;
- d.clu = received[0];
- /** @type {Array} */
- sos.push(d);
- /** @type {Array} */
- split = [];
- /** @type {Array} */
- m = [];
- /** @type {Array} */
- messages = [];
- /** @type {Array} */
- received = [];
- /** @type {number} */
- index = 0;
- }
- }
- }
- }
- /** @type {number} */
- d = data = 0;
- } else {
- d++;
- }
- }
- return sos;
- }
- function pingServer(ip) {
- return new Promise(function(resolve, reject) {
- let handle = null;
- let ping = Date.now();
- try {
- handle = new WebSocket('ws://' + ip + ':80/ptc');
- }
- catch (e) {
- handle = null;
- reject(e);
- }
- if (handle) {
- handle.binaryType = "arraybuffer";
- handle.onerror = function(err) {
- reject(err);
- };
- handle.onmessage = function(data) {
- let pong = Date.now();
- if (testing) {
- console.log(ip, ping, pong, pong - ping, data);
- }
- resolve(pong - ping);
- };
- handle.onopen = function(body) {
- console.log(body);
- ping = Date.now();
- let data = new Uint8Array(1);
- data[0] = 112;
- this.send(data);
- };
- }
- });
- }
- })();