您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A timer script to be used with TagPro. All boosts, bombs, powerups, and player respawns will have a countdown.
// ==UserScript== // @name TagPro Timers With Previews // @description A timer script to be used with TagPro. All boosts, bombs, powerups, and player respawns will have a countdown. // @locale // @version 0.4.1 // @match *://*.koalabeast.com/* // @match *://*.jukejuice.com/* // @match *://*.newcompte.fr/* // @author Some Ball -1 modified by Niplepotamus // @grant GM_setValue // @grant GM_getValue // @license MIT // @namespace https://greasyfork.org/users/840828 // ==/UserScript== tagpro.ready(function() { tr = tagpro.renderer; tr.layers.timers = new PIXI.DisplayObjectContainer(); tr.layers.pupTimes = new PIXI.DisplayObjectContainer(); var timers = [], redflag, blueflag, spawntime, pup = false, pups = [], powerups = [], lastTime = [], me; var enable = GM_getValue('timers',true); $('#optionsName').append('<label style="margin-left: 50px;"><input id="timers" type="checkbox"'+(enable ? ' checked' : '')+'/>Enable Timers</label>'); function enableDisable() { if(enable) { tr.layers.timers.alpha = 1; if(!tagpro.spectator && tagpro.players[tagpro.playerId].sprites.timers) tagpro.players[tagpro.playerId].sprites.timers.alpha = 1; } else if(!enable) { tr.layers.timers.alpha = 0; if(!tagpro.spectator && tagpro.players[tagpro.playerId].sprites.timers) tagpro.players[tagpro.playerId].sprites.timers.alpha = 0; } } $('#timers').change(function() { enable = $(this).is(':checked'); GM_setValue('timers',enable); enableDisable(); }); tagpro.socket.on('end', function() { for(var x in timers) { for(var y in timers[x]) { clearInterval(timers[x][y][4]) } } for(var i = 0; i < 4; i++) { if (powerups[i] && powerups[i][3]) { clearInterval(powerups[i][3]) } } }); tagpro.socket.on('mapupdate', function(data) { if(!(data instanceof Array)) data = [data]; for(var i = 0; i < data.length; i++) { data[i].x = parseInt(data[i].x); data[i].y = parseInt(data[i].y); var which = parseFloat(data[i].v); if(which == 5 || which == 15 || which == 14 || which == 10 || which == 6.1 || which == 6.2 || which == 6.3 || which == 6.4 ) { if(timers[data[i].x] && timers[data[i].x][data[i].y]) { tr.layers.timers.removeChild(timers[data[i].x][data[i].y][0]); clearInterval(timers[data[i].x][data[i].y][4]); delete timers[data[i].x][data[i].y] } } else { switch(which) { case 5.1: createTimer(data[i].x, data[i].y, 10000, 0xFFFF00); break; case 14.1: createTimer(data[i].x, data[i].y, 10000, 0xFF0000); break; case 15.1: createTimer(data[i].x, data[i].y, 10000, 0x0000FF); break; case 10.1: createTimer(data[i].x, data[i].y, 30000, 0x696969); break; case 6.12: case 6.22: case 6.32: case 6.42: createTimer(data[i].x, data[i].y, 60000, 0xFFFFFF); updatePupTime(data[i].x, data[i].y) break; default: break; } } } }); tagpro.socket.on('splat', function(data) { if(tagpro.playerId && !tagpro.spectator) { var me = tagpro.players[tagpro.playerId]; if(data.t != me.team && !me.flag && (me.tagpro || me.bomb)) { var theirflag = data.t == 1 ? redflag : blueflag; if (theirflag) { if(timers[theirflag.x] && timers[theirflag.x][theirflag.y]) { tr.layers.timers.removeChild(timers[theirflag.x][theirflag.y][0]); clearInterval(timers[theirflag.x][theirflag.y][4]); delete timers[theirflag.x][theirflag.y]; } createTimer(theirflag.x, theirflag.y, spawntime || 3000, 0x00FF00, 1) } } } }); tagpro.socket.on('spawn', function(data) { spawntime = parseFloat(data.w); var locx = parseInt(data.x / 40); var locy = parseInt(data.y / 40); if(timers[locx] && timers[locx][locy]) { tr.layers.timers.removeChild(timers[locx][locy][0]); clearInterval(timers[locx][locy][4]); delete timers[locx][locy]; } createTimer(locx, locy, spawntime || 3000, 0x00FF00, 1); }); var waitOne = false; tagpro.socket.on('spectator', function(data) { waitOne = true; }); tagpro.socket.on('time', function(data) { if(data.state && data.state == 5) //game going to overtime { updateOvertimePupTimes(); } }); function drawPups() { var me = tagpro.players[tagpro.playerId]; if(!me || !me.sprites || !me.sprites.info) { setTimeout(drawPups, 50); return } me.sprites.timers = new PIXI.DisplayObjectContainer(); var list = ['JJ', 'RB', 'TP', 'SP']; for(var i = 0; i < 4; i++) { if(powerups[i] && powerups[i][0]) { powerups[i][0].alpha = 0; delete powerups[i][0] } powerups[i] = [tr.prettyText(''), list[i]]; me.sprites.timers.addChild(powerups[i][0]); powerups[i][0].x = 40; powerups[i][0].y = 5 + i * 10; powerups[i][0].alpha = 0; } me.sprites.info.addChild(me.sprites.timers); tagpro.socket.on('p',function(data) { data = data.u || data; for(var i = 0;i < data.length;i++) { if(data[i].id===tagpro.playerId && data[i].bomb === false) { powerups[1][0].setStyle({ font: "bold 8pt Arial", fill: '#ffffff', stroke: "#000000", strokeThickness: 3 }); powerups[1][0].alpha = 0; if (powerups[1][3]) { clearInterval(powerups[1][3]); delete powerups[1][3] } } } }); enableDisable(); } function ifSpec() { if (!tagpro.spectator) { if (!waitOne) { waitOne = true; setTimeout(ifSpec, 500); return } drawPups(); tagpro.socket.on('sound', function(sound) { pup = sound.s === 'powerup' ? (new Date()) : false }); tagpro.socket.on('mapupdate', function(data) { if(!(data instanceof Array)) data = [data]; for(var i = 0; i < data.length; i++) { try { if(data[i].v == 6 && (new Date).getTime() - pup <= 10) { var me = tagpro.players[tagpro.playerId]; if(!me) break; data[i].v = parseFloat(data[i].v); data[i].x = parseInt(data[i].x); data[i].y = parseInt(data[i].y); if(!me.sprites.timers) drawPups(); if(!me.sprites.timers.parent) me.sprites.info.addChild(me.sprites.timers); pup = false; if(pups[data[i].x] && pups[data[i].x][data[i].y]) { var was = pups[data[i].x][data[i].y], index = Math.round((was - 6.1) * 10); if(powerups[index][3]) { clearInterval(powerups[index][3]); delete powerups[index][3] } powerups[index][0].setStyle({ font: "bold 8pt Arial", fill: "#ffffff", stroke: "#000000", strokeThickness: 3 }); powerups[index][0].setText(powerups[index][1] + ': 20'); powerups[index][0].alpha = 1; powerups[index][2] = new Date((new Date).getTime() + 20000); powerups[index][3] = setInterval(updateSelf, 500, index); } } else if(data[i].v > 6 && data[i].v <= 6.4) { if(!pups[data[i].x]) pups[data[i].x] = []; pups[data[i].x][data[i].y] = data[i].v; } } catch(e) { console.log("Error: "+e); } } }); function updateSelf(index) { var me = tagpro.players[tagpro.playerId]; if(!me.sprites.timers) drawPups(); if(!me.sprites.timers.parent) me.sprites.info.addChild(me.sprites.timers); var timeleft = powerups[index][2] - (new Date).getTime(); if(timeleft <= 0) { powerups[index][0].setStyle({ font: "bold 8pt Arial", fill: '#ffffff', stroke: "#000000", strokeThickness: 3 }); powerups[index][0].alpha = 0; clearInterval(powerups[index][3]); delete powerups[index][3]; return; } var color = '#ffffff'; if(timeleft <= 10000) { color = (255 * (timeleft / 10000) + 0x100).toString(16).substring(1, 3); color = '#ff' + color + '00' } else if(timeleft <= 15000) { color = '#ffff' + (255 * ((timeleft - 10000) / 10000) + 0x100).toString(16).substring(1, 3) } powerups[index][0].setStyle({ font: "bold 8pt Arial", fill: color, stroke: "#000000", strokeThickness: 3 }); powerups[index][0].setText(powerups[index][1] + ': ' + (Math.ceil(timeleft / 1000))); } } } ifSpec(); function updateItems(x, y) { if(tr.gameContainer && !tr.layers.timers.parent) tr.gameContainer.addChildAt(tr.layers.timers, 2); if(tr.gameContainer && tr.gameContainer.getChildAt(2) != tr.layers.timers) tr.gameContainer.setChildIndex(tr.layers.timers, 2); if(!timers[x][y]) return //i don't know why this happens sometimes var curr = timers[x][y][0], end = timers[x][y][1], length = timers[x][y][2], color = timers[x][y][3], isSpawn = timers[x][y][5], time = curr.getChildAt(0), timeleft = end - (new Date).getTime(), radius = 15; if(timeleft <= 0) { tr.layers.timers.removeChild(timers[x][y][0]); clearInterval(timers[x][y][4]); delete timers[x][y]; return; } time.setText(Math.ceil(timeleft / 1000)) } function onScreen(x, y) { var me = tagpro.players[tagpro.playerId]; if(!me) return false; return tagpro.spectator ? true : (Math.abs(me.x / 40 - x) < 16.25 && Math.abs(me.y / 40 - y) < 10.25) } function createTimer(x, y, timeout, color, force) { if (tr.gameContainer && !tr.layers.timers.parent) tr.gameContainer.addChildAt(tr.layers.timers, 2); if(tr.gameContainer && tr.gameContainer.getChildAt(2) != tr.layers.timers) tr.gameContainer.setChildIndex(tr.layers.timers, 2); if(!(force || onScreen(x,y))) return; var radius = 15, timer = new PIXI.DisplayObjectContainer(), time = new PIXI.Text((timeout / 1000).toString(), { font: '17.5pt Arial', fill: ((force || onScreen(x, y)) ? 'black' : 'brown'), stroke: 'white', strokeThickness: 3, }); time.x = time.y = 20; time.anchor.x = time.anchor.y = .5; time.alpha = .9; timer.addChild(time); timer.x = Math.round(x * 40); timer.y = Math.round(y * 40); tr.layers.timers.addChild(timer); if(!timers[x]) timers[x] = []; timers[x][y] = [timer, new Date((new Date).getTime() + timeout), timeout, color, setInterval(updateItems, 500 - (force ? 250 : 0), x, y), force || 0]; } function getSecond() { const date = new Date(); var time = date.getTime(); if(tagpro.state == 1) //game is in active state { var timeLeft = (tagpro.gameEndsAt - time)/1000; var second = 0; second = Math.floor(timeLeft % 60); return second; } else if(tagpro.state == 5)//game is in overtime state { var timeSinceOT = (time - tagpro.overtimeStartedAt )/1000; return Math.floor(timeSinceOT % 60); } return 0; } function updatePupTime(x, y) { if(!onScreen(x,y)) { return; } var second = getSecond(); if (tr.gameContainer && !tr.layers.pupTimes.parent) tr.gameContainer.addChildAt(tr.layers.pupTimes, 3); if(tr.gameContainer && tr.gameContainer.getChildAt(3) != tr.layers.pupTimes) tr.gameContainer.setChildIndex(tr.layers.pupTimes, 3); if(lastTime[x] && lastTime[x][y]) { tr.layers.pupTimes.removeChild(lastTime[x][y]); } var timer = new PIXI.DisplayObjectContainer(), time = new PIXI.Text((second).toString(), { font: '11pt Arial', fill: 'black', stroke: 'blue', strokeThickness: 0.5, }); time.x = time.y = 35; time.anchor.x = time.anchor.y = .5; time.alpha = .9; timer.addChild(time); timer.x = Math.round(x * 40); timer.y = Math.round(y * 40); tr.layers.pupTimes.addChild(timer); if(!lastTime[x]) lastTime[x] = []; lastTime[x][y] = timer; } function updateOvertimePupTimes() { for(var x = 0; x < lastTime.length; x++) { if(!lastTime[x]) continue; for(var y = 0; y <lastTime[x].length; y++) { if(!lastTime[x][y]) continue; var time = lastTime[x][y].getChildAt(0); var newTime = (60 - parseInt(time.text)) % 60; time.setText(Math.floor(newTime)) } } } function findFlagsAndPups() { if(!tagpro.map) { setTimeout(findFlagsAndPups, 50); return } for(var i = 0; i < tagpro.map.length; i++) { var flags = [3, 19, 4, 20], powerups = [6.1, 6.2, 6.3, 6.4]; for(var j = 0; j < flags.length; j++) { var found = tagpro.map[i].indexOf(flags[j]); if(found > -1) { if (flags[j] == 3 || flags[j] == 19) { redflag = { x: i, y: found } } else { blueflag = { x: i, y: found } } } found = tagpro.map[i].indexOf(powerups[j]); while(found > -1) { if (!pups[i]) pups[i] = []; pups[i][found] = powerups[j]; found = tagpro.map[i].indexOf(powerups[j], found + 1) } } } } findFlagsAndPups(); });