// ==UserScript== // @name TagPro Map Name Below Timer (& More!) // @description Show the name of the map & author below the countdown timer. Also the score difference above the timer. // @version 1.3.2.1(Ko) // - Since TagPro got updated to use the latest PIXI.js, these things had to be changed to avoid thousends of warnings // - DisplayObjectContainer is replaced by Container // - font is replaced by fontFamily, fontSize, fontStyle etc. etc. // @include http://tagpro-*.koalabeast.com:* // @include http://tangent.jukejuice.com:* // @include http://*.newcompte.fr:* // @updateURL https://gist.github.com/nabbynz/b8c8d8b70a34f39d1cf5/raw/TagPro_Map_Name_Above_Timer.user.js // @downloadURL https://gist.github.com/nabbynz/b8c8d8b70a34f39d1cf5/raw/TagPro_Map_Name_Above_Timer.user.js // @author nabby // ==/UserScript== console.log('START: ' + GM_info.script.name + ' (v' + GM_info.script.version + ' by ' + GM_info.script.author + ')'); //------ Options -------- var showMapName = true; //Shows the name of the map and who made it. var showMusicTrackName = true; //Shows the currently playing music track var showScoreDifference = true; //Shows the score differential var showFlagCarriers = true; //Shows the name of the player currently holding the flag var showFlagsOut = true; //shows a left(red)/right(blue) border when either flag is out var showStatLine = true; //Shows which team is dominating this particular stat (red/blue line above the timer) var statToShow = 's-powerups'; //If "showStatLine" is true this can be one of: 'score', 's-tags', 's-pops', 's-grabs', 's-drops', 's-hold', 's-captures', 's-prevent', 's-returns', 's-support', 's-powerups' var showBallIndicators = true; //By Browncoat (set to false if you already have it, which you should cos it's brilliant!) //----- End of Options ----- tagpro.ready(function() { if (showMapName) { var mapName, mapAuthor; var updateMapName = function() { var mapTitle = new PIXI.Text(mapName + " by " + mapAuthor, { fontFamily:"Arial", fontSize:"8pt", fontWeight:"bold", fill:"#999999", dropShadow:true, dropShadowDistance:1 }); mapTitle.anchor.x = 0.5; mapTitle.x = ($("#viewport").width() / 2); mapTitle.y = $("#viewport").height() - 16; mapTitle.alpha = 0.9; if (!tagpro.ui.sprites.mapTitle) { tagpro.ui.sprites.mapTitle = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.mapTitle); tagpro.ui.sprites.mapTitle.removeChildren(); tagpro.ui.sprites.mapTitle.addChild(mapTitle); }; tagpro.socket.on('map', function(data) { mapName = data.info.name; mapAuthor = data.info.author; updateMapName(); }); } if (showScoreDifference) { tagpro.socket.on('score', function(data) { updateScoreDifference(data); }); $('#switchButton').on('click', function() { setTimeout(function() { updateScoreDifference( { r:tagpro.score.r, b:tagpro.score.b } ); }, 1000); }); var updateScoreDifference = function(data) { var diffText = '='; var color = '#ffff40'; if (data.r - data.b > 0) { if (tagpro.players[tagpro.playerId].team === 1) { diffText = '+' + Math.abs(data.r - data.b); color = '#00CC00'; } else { diffText = '-' + Math.abs(data.r - data.b); color = '#CC0000'; } } else if (data.r - data.b < 0) { if (tagpro.players[tagpro.playerId].team === 1) { diffText = '-' + Math.abs(data.r - data.b); color = '#CC0000'; } else { diffText = '+' + Math.abs(data.r - data.b); color = '#00CC00'; } } var scoreDiff = new PIXI.Text(diffText, { fontFamily:"Verdana", fontSize:"18pt", fontWeight:"bold", fill:color, dropShadow:true, dropShadowDistance:1 }); scoreDiff.anchor.x = 0.5; scoreDiff.x = ($("#viewport").width() / 2); scoreDiff.y = $("#viewport").height() - 80; scoreDiff.alpha = 0.7; if (!tagpro.ui.sprites.scoreDiff) { tagpro.ui.sprites.scoreDiff = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.scoreDiff); tagpro.ui.sprites.scoreDiff.removeChildren(); tagpro.ui.sprites.scoreDiff.addChild(scoreDiff); }; setTimeout(function() { updateScoreDifference( { r:tagpro.score.r, b:tagpro.score.b } ); }, 1000); } if (showMusicTrackName) { var updateMusicTrackName = function() { if (tagpro.music && tagpro.musicPlayer.current) { var trackName = new PIXI.Text('Now Playing: ' + tagpro.musicPlayer.current.name + ' [by ' + tagpro.musicPlayer.current.author + ']', { fontFamily:"Arial", fontSize:"8pt", fontStyle:"italic", fill:"#FF5500", dropShadow:true, dropShadowDistance:1 }); trackName.anchor.x = 0.5; trackName.x = ($("#viewport").width() / 2); trackName.y = $("#viewport").height() - 105; trackName.alpha = 0.8; if (!tagpro.ui.sprites.trackName) { tagpro.ui.sprites.trackName = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.trackName); tagpro.ui.sprites.trackName.removeChildren(); tagpro.ui.sprites.trackName.addChild(trackName); } else { if (tagpro.ui.sprites.trackName) { tagpro.ui.sprites.trackName.removeChildren(); } } }; document.addEventListener('play', function(e) { if (e.target.id === 'music') { setTimeout(updateMusicTrackName, 200); } }, true); $('#soundMusic').on('click', function() { setTimeout(function() { if (!tagpro.music) { tagpro.ui.sprites.trackName.removeChildren(); } }, 200); }); } if (showStatLine) { var updateStatLine = function() { var totalWidth = 500; var startX = $("#viewport").width() / 2; var x = $("#viewport").width() / 2; var y = $("#viewport").height() - 90; var lineWidth = 5; var opacity = 0.3; var redStat=0, blueStat=0, redCount=0, blueCount=0; for (var playerId in tagpro.players) { if (tagpro.players[playerId].team === 1) { redStat += tagpro.players[playerId][statToShow]; redCount++; } else { blueStat += tagpro.players[playerId][statToShow]; blueCount++; } } if (!redStat && !blueStat) { redStat = 1; blueStat = 1; } redStat = Math.abs(redStat) / (redCount || 1); blueStat = Math.abs(blueStat) / (blueCount || 1); var statLine = new PIXI.Graphics(); statLine.moveTo(startX, y); statLine.lineStyle(lineWidth, 0xFF0000); x = (redStat / (redStat+blueStat)) * totalWidth; statLine.lineTo(startX + x, y); statLine.lineStyle(lineWidth, 0x0000FF); statLine.lineTo(startX + totalWidth, y); statLine.pivot.x = totalWidth / 2; statLine.alpha = 0.3; if (!tagpro.ui.sprites.statLine) { tagpro.ui.sprites.statLine = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.statLine); tagpro.ui.sprites.statLine.removeChildren(); tagpro.ui.sprites.statLine.addChild(statLine); }; setInterval(updateStatLine, 3000); } if (showFlagCarriers || showFlagsOut) { tagpro.socket.on('sound', function(data) { if ( ((data.s === 'friendlyalert') || (data.s === 'alert') || (data.s === 'friendlydrop') || (data.s === 'drop') || (data.s === 'cheering') || (data.s === 'sigh')) ) { setTimeout(updateFlagCarriers, 150); } }); var updateFlagCarriers = function() { var redHolder = 0; var blueHolder = 0; for (var playerId in tagpro.players) { if (tagpro.players[playerId].flag === 1) { blueHolder = Number(playerId); } else if (tagpro.players[playerId].flag === 2) { redHolder = Number(playerId); } else if (tagpro.players[playerId].flag === 3) { if (tagpro.players[playerId].team === 1) { redHolder = Number(playerId); } else { blueHolder = Number(playerId); } } } if (redHolder) { var redFlagHolder = new PIXI.Text(tagpro.players[redHolder].name, { fontFamily:"Verdana", fontSize:"14pt", fontWeight:"bold", fill:"#FF4040", dropShadow:true, dropShadowDistance:1 }); redFlagHolder.anchor.x = 1; redFlagHolder.x = ($("#viewport").width() / 2 - 140); redFlagHolder.y = $("#viewport").height() - 30; if (!tagpro.ui.sprites.redFlagHolder) { tagpro.ui.sprites.redFlagHolder = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.redFlagHolder); tagpro.ui.sprites.redFlagHolder.removeChildren(); tagpro.ui.sprites.redFlagHolder.addChild(redFlagHolder); if (showFlagsOut) $('#viewport').css('border-left', '6px solid red'); } else { if (tagpro.ui.sprites.redFlagHolder) tagpro.ui.sprites.redFlagHolder.removeChildren(); if (showFlagsOut) $('#viewport').css('border-left', '6px solid transparent'); } if (blueHolder) { var blueFlagHolder = new PIXI.Text(tagpro.players[blueHolder].name, { fontFamily:"Verdana", fontSize:"14pt", fontWeight:"bold", fill:"#8686FF", dropShadow:true, dropShadowDistance:1 }); //#8686FF blueFlagHolder.x = ($("#viewport").width() / 2 + 140); blueFlagHolder.y = $("#viewport").height() - 30; blueFlagHolder.alpha = 0.8; if (!tagpro.ui.sprites.blueFlagHolder) { tagpro.ui.sprites.blueFlagHolder = new PIXI.Container(); } tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.blueFlagHolder); tagpro.ui.sprites.blueFlagHolder.removeChildren(); tagpro.ui.sprites.blueFlagHolder.addChild(blueFlagHolder); if (showFlagsOut) $('#viewport').css('border-right', '5px solid dodgerblue'); } else { if (tagpro.ui.sprites.blueFlagHolder) tagpro.ui.sprites.blueFlagHolder.removeChildren(); if (showFlagsOut) $('#viewport').css('border-right', '5px solid transparent'); } }; setTimeout(updateFlagCarriers, 1000); } if (showBallIndicators) { //this is browncoat's code, but we're only updating the ball indicators when we need to (not 4 times a second?)... tagpro.socket.on('chat', function(data) { if (data.from === null) { if ((data.message.indexOf('has joined') >= 0) || (data.message.indexOf('has left') >= 0) || (data.message.indexOf('has switched') >= 0)) { setTimeout(updateBallIndicators, 150); } } }); var createBallIndicators = function(ballTile, totalBalls) { var parent = new PIXI.Container(); function alphaForBall(i) { return totalBalls >= i ? 1 : 0.15; } var size = 20; var gap = 2; tagpro.tiles.draw(parent, ballTile, { x: 0, y: 0 }, size, size, alphaForBall(1)); tagpro.tiles.draw(parent, ballTile, { x: size + gap, y: 0 }, size, size, alphaForBall(2)); tagpro.tiles.draw(parent, ballTile, { x: 0, y: size + gap }, size, size, alphaForBall(3)); tagpro.tiles.draw(parent, ballTile, { x: size + gap, y: size + gap }, size, size, alphaForBall(4)); return parent; }; var updateBallIndicators = function() { if (!tagpro.ui.sprites.ballIndicators) { tagpro.ui.sprites.ballIndicators = new PIXI.Container(); } var redPlayers = 0; var bluePlayers = 0; for (var playerId in tagpro.players) { if (tagpro.players.hasOwnProperty(playerId)) { if (tagpro.players[playerId].team == 1) { redPlayers++; } else { bluePlayers++; } } } var viewport = $("#viewport"); var vpWidth = viewport.width(); var vpHeight = viewport.height(); var red = createBallIndicators("redball", redPlayers); red.x = vpWidth / 2 - 160 - red.width; red.y = vpHeight - 80; var blue = createBallIndicators("blueball", bluePlayers); blue.x = vpWidth / 2 + 160; blue.y = vpHeight - 80; tagpro.renderer.layers.ui.addChild(tagpro.ui.sprites.ballIndicators); tagpro.ui.sprites.ballIndicators.removeChildren(); tagpro.ui.sprites.ballIndicators.addChild(red); tagpro.ui.sprites.ballIndicators.addChild(blue); }; setTimeout(updateBallIndicators, 1000); } var rACV = tagpro.renderer.resizeAndCenterView; tagpro.renderer.resizeAndCenterView = function() { rACV(); if (showMapName) updateMapName(); if (showScoreDifference) updateScoreDifference( { r:tagpro.score.r, b:tagpro.score.b } ); if (showMusicTrackName) updateMusicTrackName(); if (showStatLine) updateStatLine(); if (showFlagCarriers || showFlagsOut) updateFlagCarriers(); if (showBallIndicators) updateBallIndicators(); }; $(window).resize(function() { //re-position everything if the window is resized... tagpro.renderer.resizeAndCenterView(); }); });