Last active
December 16, 2015 15:21
-
-
Save arfie/a70b9cc70681478f0d1a to your computer and use it in GitHub Desktop.
TagPro Group Enhancements
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name TagPro Group Enhancements | |
| // @namespace http://www.arfie.nl | |
| // @version 0.1.1 | |
| // @description Better group layout | |
| // @author Ruud Verbeek | |
| // @include http://tagpro-*.koalabeast.com/groups* | |
| // @include http://tangent.jukejuice.com/groups* | |
| // @include http://*.newcompte.fr/groups* | |
| // @grant GM_setValue | |
| // @grant GM_getValue | |
| // @grant GM_deleteValue | |
| // @grant GM_addStyle | |
| // @grant GM_xmlhttpRequest | |
| // ==/UserScript== | |
| var path = document.location.pathname.split('/'); | |
| servers = { | |
| Regular: { | |
| Chord: {name: 'Chord', url: 'tagpro-chord.koalabeast.com'}, | |
| Orbit: {name: 'Orbit', url: 'tagpro-orbit.koalabeast.com'}, | |
| Diameter: {name: 'Diameter', url: 'tagpro-diameter.koalabeast.com'}, | |
| Pi: {name: 'Pi', url: 'tagpro-pi.koalabeast.com'}, | |
| Radius: {name: 'Radius', url: 'tagpro-radius.koalabeast.com'}, | |
| Segment: {name: 'Segment', url: 'tagpro-segment.koalabeast.com'}, | |
| Origin: {name: 'Origin', url: 'tagpro-origin.koalabeast.com'}, | |
| Sphere: {name: 'Sphere', url: 'tagpro-sphere.koalabeast.com'}, | |
| Centra: {name: 'Centra', url: 'tagpro-centra.koalabeast.com'}, | |
| Arc: {name: 'Arc', url: 'tagpro-arc.koalabeast.com'} | |
| }, | |
| Testing: { | |
| Tangent: {name: 'Tangent', url: 'tangent.jukejuice.com'}, | |
| Maptest: {name: 'Maptest', url: 'tagpro-maptest.koalabeast.com'}, | |
| NC1: {name: 'NC Europe', url: 'maptest.newcompte.fr'}, | |
| NC2: {name: 'NC US East', url: 'maptest2.newcompte.fr'}, | |
| NC3: {name: 'NC US West', url: 'maptest3.newcompte.fr'}, | |
| NC4: {name: 'NC Oceanic', url: 'oceanic.newcompte.fr'} | |
| } | |
| }; | |
| if(path.length < 3 || path[2] === '') { | |
| if(document.location.search.match(/err=banned/)) | |
| $('<div class="section tiny bottomPadding"><div class="error">Sorry, you are banned from this group.</div></div>').insertBefore('.buttons'); | |
| var currentServer = ''; | |
| for(var type in servers) for(var server in servers[type]) { | |
| var d = servers[type][server]; | |
| if(d.url === tagpro.serverHost) | |
| currentServer = d; | |
| else { | |
| GM_xmlhttpRequest({ | |
| method: 'GET', | |
| url: 'http://' + d.url + '/groups/', | |
| onload: (function(d) {return function(response) { | |
| var tr = $('<div>').html(response.response).find('tr:not(:first-child)').clone().prepend($('<td>').append($('<a>').attr('href', 'http://' + d.url).text(d.name).css('color', 'white'))).appendTo('.board'); | |
| tr.find('td:nth-child(2) a[href]').each(function() {$(this).attr('href', 'http://' + d.url + $(this).attr('href'));}); | |
| };})(d) | |
| }); | |
| } | |
| } | |
| $('.alt').removeClass('alt'); | |
| GM_addStyle('.board tr:nth-child(odd) {background-color: #272727;} .board td:nth-child(1) {width: 25%;} .board td:nth-child(3) {width: 20%;}'); | |
| $('.board tr:first-child').prepend('<th>Server</th>'); | |
| $('.board tr:not(:first-child)').prepend($('<td>').append($('<a>').attr('href', 'http://' + currentServer.url).text(currentServer.name).css('color', 'white'))); | |
| return; | |
| } | |
| if(path[2] === 'create') { | |
| $('form').prepend('<div><label for="server">Server:</label><div><select id="server"></select></div>'); | |
| for(var type in servers) { | |
| var optgroup = $('<optgroup>').attr('label', type).appendTo('#server'); | |
| for(var server in servers[type]) { | |
| $('<option value="' + servers[type][server].url + '">').text(servers[type][server].name).appendTo(optgroup); | |
| } | |
| } | |
| $('#server').val(tagpro.serverHost).change(function() { | |
| $('form').attr('action', 'http://' + $(this).val() + '/groups/create'); | |
| }).css('margin-bottom', '1px'); | |
| return; | |
| } | |
| GM_addStyle( | |
| '.teams > div {width: 240px !important; float: none !important;}' + | |
| '#redTeam, #blueTeam {height: auto !important;}' + | |
| '#spectators, #waiting {position: absolute; right: -240px; height: 300px !important; overflow: visible;}' + | |
| '#spectators {top: 0;}' + | |
| '#waiting {bottom: -300px;}' + | |
| '.teams h2 {text-align: center;}' + | |
| '.teams li {display: block !important; width: 200px !important; color: inherit !important; height: 21px; margin: 1px 1px 2px 1px !important;}' + | |
| '#redTeam ul, #blueTeam ul {min-height: 0 !important; height: 96px !important; overflow-y: auto !important;}' + | |
| '#spectators ul {overflow-y: auto !important;}' + | |
| '.teams li div {display: inline-block; max-width: 150px; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap;}' + | |
| '.teams li span {float: right; margin-top: 4px !important;}' + | |
| '.teams li div::before, .playerName::before {width: 16px; height: 16px; content: ""; display: inline-block; margin-right: 4px;}' + | |
| '.teams li.leader div::before, .playerName._leader::before {background-image: url(../images/flair.png); background-position: -32px 0; background-repeat: no-repeat; position: relative; top: 2px;}' + | |
| '.teams li.you:not(.leader) div::before, .playerName._you:not(._leader)::before {background-image: url(../images/flair.png); background-position: -16px -16px; background-repeat: no-repeat; position: relative; top: 2px;}' + | |
| '#redTeam input, #blueTeam input {width: 50%;}' + | |
| '.score {margin-top: 12px !important; margin-left: 0 !important;}' + | |
| '.score select {margin-left: 4px;}' + | |
| 'body {position: absolute; width: 940px; left: calc(50% - 480px); height: 410px; top: calc(50% - 280px);}' + | |
| 'header {position: absolute; font-size: 200%; font-weight: bold;}' + | |
| 'header a {margin-right: 20px;}' + | |
| '.teams {position: absolute !important; left: auto !important;}' + | |
| '#chat {width: 600px; left: 40px !important; position: absolute !important; top: 70px !important; height: 300px; box-sizing: border-box; overflow-x: hidden !important;}' + | |
| '#chat a {text-decoration: underline; color: #49f;}' + | |
| '#chatSend {width: 592px !important; left: 40px !important; position: absolute !important; height: 16px; top: 390px;}' + | |
| '#actions {position: absolute !important; right: 50px !important; bottom: 0 !important; display: block !important; left: auto !important;}' + | |
| 'button, a.button {margin: 10px !important; display: block; min-width: 200px !important;}' + | |
| '#settings {display: none !important;}' + | |
| '#settingsOverview {position: absolute; top: 70px; left: -300px; bottom: auto; height: auto; border: 1px solid rgba(255,255,255,0.20); background-color: rgba(255,255,255,0.10); display: block; width: 300px;}' + | |
| '#settingsOverview ul {list-style: initial; max-height: 200px; overflow-y: auto;}' + | |
| '#settingsOverview hr {border: 1px solid rgba(255, 255, 255, 0.20); border-width: 1px 0 0 0;}' + | |
| '#settingsOverview > * {margin: 10px;}' + | |
| '#settingsOverview ul li {margin: 5px 0 5px 20px;}' + | |
| '.changeSettingButton {float: right; color: #0f0; margin-right: 10px; font-size: 75%;}' + | |
| '#status {position: absolute !important; right: -200px !important; top: 41px !important; left: auto !important;}' + | |
| '#playerOptions {display: none !important;}' + | |
| 'body.groupLeader .teams li:hover .playerStatus {display: none !important;}' + | |
| '.teams li .playerAction {display: none; background-image: url(../images/flair.png); width: 16px; height: 16px; float: right; opacity: 0.4; cursor: pointer; margin: 0 4px; position: relative; top: -2px;}' + | |
| 'body.groupLeader .teams li:hover .playerAction {display: inline-block;}' + | |
| '.teams li:hover .playerAction:hover {opacity: 1.0;}' + | |
| '.ban {background-position-x: -64px;}' + | |
| '.makeLeader {background-position-x: -32px;}' + | |
| '.leader .makeLeader {display: none !important;}' + | |
| '#mapSelector {position: absolute; left: -11px; border: 1px solid rgba(255,255,255,0.20); background-color: rgba(255,255,255,0.10); display: block; overflow-y: auto; width: 300px; padding: 10px; box-sizing: border-box;}' + | |
| '#mapSelectorCategory {width: 100%;}' + | |
| '.mapSelectorCategory {display: block; margin: 10px auto 0 auto; text-align: center;}' + | |
| 'input[type=number] {width: 96px;}' + | |
| 'input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {-webkit-appearance: none; margin: 0;}' + | |
| '#mapPreview {width: 100%; margin-top: 10px;}' + | |
| '#mapSelector_group5 {width: 100%;}' + | |
| '#switchServer {padding: 0 20px;}' + | |
| '#switchServerSelect {width: 100%;}' + | |
| '#mapTitle {text-align: center; font-weight: bold; font-size: 120%;}' + | |
| 'body.groupLeader #mapTitle {display: none;}' + | |
| '#settingsOverview select:disabled {background: transparent; border: none; color: white; cursor: text; font: inherit; -webkit-appearance: initial;}' + | |
| '#settingsOverview input[type=number]:disabled {color: white; background: transparent; border: none; cursor: text;}' + | |
| '#settingsOverview input[type=checkbox]:not([gamemode=powerups]):disabled {-webkit-appearance: none; margin: 0; font: inherit;}' + | |
| '#settingsOverview input[type=checkbox]:not([gamemode=powerups]):disabled::after {display: inline; content: "no"; color: white; cursor: text;}' + | |
| '#settingsOverview input[type=checkbox]:not([gamemode=powerups]):disabled:checked::after {content: "yes";}' + | |
| '#settingsOverview label {cursor: text;}' + | |
| '#chat hr {border: 1px solid rgba(255,255,255,0.20); border-width: 1px 0 0 0;}' + | |
| '#rndTeamsButtons, #swapTeamsButtons {position: absolute; top: -163px; padding: 2px 4px; font-size: 70%; min-width: 25% !important; margin: 0 !important;}' + | |
| '#rndTeamsButtons {left: 10%;}' + | |
| '#swapTeamsButtons {right: 10%;}' + | |
| 'input[gamemode=powerups] {-webkit-appearance: none; width: 40px; height: 40px; background-image: url(../images/tiles.png); background-position-x: calc(-12 * 40px);}' + | |
| 'input[gamemode=powerups]:not(:checked) {opacity: 0.3;}' + | |
| 'input[gamemode=powerups]:focus {outline: 0;}' + | |
| 'input#GM_grip {background-position-y: calc(-4 * 40px);}' + | |
| 'input#GM_tagpro {background-position-y: calc(-5 * 40px);}' + | |
| 'input#GM_livingBomb {background-position-y: calc(-6 * 40px);}' + | |
| 'input#GM_speed {background-position-y: calc(-7 * 40px);}' + | |
| 'label[for=GM_grip], label[for=GM_tagpro], label[for=GM_livingBomb], label[for=GM_speed] {display: none;}' + | |
| 'li[gamemode=powerups] div:not(:first-child) {display: inline;}' + | |
| '#settingsOverview ul select:not(#newRule):not(#newRuleValue):not(:disabled) {background-color: transparent; color: white; border: none; -webkit-appearance: none; font: inherit; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAA+SURBVChTlYtBDgAwCML8/6fZyQWVYUbSA1UCwBdSOqR0SOngsmUM3Oj+8HPSU+6lEJlxG2JDSoeUDinfIA7S+cJM75pd5gAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-position: right; padding-right: 15px;}' + | |
| '#settingsOverview ul select:not(#newRule):not(#newRuleValue):not(:disabled) option {color: black;}' + | |
| '#settingsOverview ul select:not(#newRule):not(#newRuleValue):not(:disabled):focus {outline: 0}' + | |
| '@media(max-width: 1600px) {' + | |
| '#settingsOverview {top: 425px; left: 35px;}' + | |
| '#mapSelector {left:310px; top: 0px; margin: -1px; overflow: visible;}' + | |
| 'body {top: calc(50% - 350px); left: calc(50% - 590px);}' + | |
| '#mapPreview {height: 171px; width: 171px; margin-left:calc(50% - 85.5px);}}' + | |
| '#settingsOverview, #mapSelector, #mapPreview, body {transition: left .5s, top .5s, width .5s, height .5s, margin .5s;}' | |
| ); | |
| var defaults = { | |
| time: { | |
| label: 'Time Limit', | |
| default: '12', | |
| optgroup: 'Basic' | |
| }, | |
| caps: { | |
| label: 'Cap Limit', | |
| default: '3', | |
| optgroup: 'Basic' | |
| }, | |
| accel: { | |
| label: 'Acceleration', | |
| default: '1', | |
| optgroup: 'Physics' | |
| }, | |
| topspeed: { | |
| label: 'Top Speed', | |
| default: '1', | |
| optgroup: 'Physics' | |
| }, | |
| bounce: { | |
| label: 'Bounciness', | |
| default: '1', | |
| optgroup: 'Physics' | |
| }, | |
| playerRespawnTime: { | |
| label: 'Players', | |
| default: '3000', | |
| optgroup: 'Respawns' | |
| }, | |
| speedPadRespawnTime: { | |
| label: 'Boosts', | |
| default: '10000', | |
| optgroup: 'Respawns' | |
| }, | |
| dynamiteRespawnTime: { | |
| label: 'Bombs', | |
| default: '30000', | |
| optgroup: 'Respawns' | |
| }, | |
| buffRespawnTime: { | |
| label: 'Powerups', | |
| default: '60000', | |
| optgroup: 'Respawns' | |
| }, | |
| buffDelay: { // golden nub rule | |
| label: 'Delay Powerups', | |
| default: false, | |
| optgroup: 'Miscellaneous' | |
| }, | |
| potatoTime: { | |
| label: 'Potato', | |
| default: '0', | |
| optgroup: 'Miscellaneous' | |
| } | |
| }; | |
| var gameModes = (tagpro.serverHost.indexOf('newcompte') >= 0) ? { | |
| gravity: { | |
| label: 'Gravity', | |
| settings: { | |
| juggle: { | |
| label: 'Juggle', | |
| default: true | |
| }, | |
| maxJumpCount: { | |
| label: 'Jump Amount', | |
| default: 2 | |
| }, | |
| jumpKey: { | |
| label: 'Jump Key', | |
| default: 'up' | |
| }, | |
| jumpY: { | |
| label: 'Jump Strength', | |
| default: -0.5 | |
| }, | |
| gravityY: { | |
| label: 'Gravity Force', | |
| default: 4.9 | |
| } | |
| } | |
| }, | |
| shapes: { | |
| label: 'Weird Shapes', | |
| settings: { | |
| shape: { | |
| label: 'Shape', | |
| default: 'square' | |
| } | |
| } | |
| }, | |
| ffa: { | |
| label: 'Free for All', | |
| settings: { | |
| singleTeam: { | |
| label: 'Single Team', | |
| default: true | |
| }, | |
| deathMatchMode: { | |
| label: 'Deathmatch', | |
| default: true | |
| }, | |
| neutralToggle: { | |
| label: 'Green Buttons', | |
| default: true | |
| } | |
| } | |
| }, | |
| gameSettings: { | |
| label: 'Moar Game Settings', //nc pls | |
| settings: { | |
| speedpadModifier: { | |
| label: 'Boost Power', | |
| default: '1' | |
| }, | |
| powerupExpiration: { | |
| label: 'Pup Duration', | |
| default: '20000' | |
| }, | |
| afterPickupInvulnerability: { | |
| label: 'FC Invulnerability', | |
| default: '250' | |
| }, | |
| fcHelp: { | |
| label: 'FC help', | |
| default: '0' | |
| }, | |
| redHelp: { | |
| label: 'Red Team help', | |
| default: '0' | |
| }, | |
| blueHelp: { | |
| label: 'Blue Team help', | |
| default: '0' | |
| } | |
| } | |
| }, | |
| powerups: { | |
| label: 'Select Powerups', | |
| settings: { | |
| grip: { | |
| label: 'Juke Juice', | |
| default: true | |
| }, | |
| tagpro: { | |
| label: 'TagPro', | |
| default: true | |
| }, | |
| livingBomb: { | |
| label: 'Rolling Bomb', | |
| default: true | |
| }, | |
| speed: { | |
| label: 'Top Speed', | |
| default: false | |
| } | |
| } | |
| }, | |
| modifyExplosions: { | |
| label: 'Modify Explosions', | |
| settings: { | |
| redForce: { | |
| label: 'Red Pop Force', | |
| default: '1' | |
| }, | |
| redDistance: { | |
| label: 'Red Pop Range', | |
| default: '3.5' | |
| }, | |
| blueForce: { | |
| label: 'Blue Pop Force', | |
| default: '1' | |
| }, | |
| blueDistance: { | |
| label: 'Blue Pop Range', | |
| default: '3.5' | |
| }, | |
| rollingForce: { | |
| label: 'Rolling Bomb Force', | |
| default: 3 | |
| }, | |
| rollingDistance: { | |
| label: 'Rolling Bomb Range', | |
| default: 5 | |
| }, | |
| bombForce: { | |
| label: 'Bomb Force', | |
| default: 5 | |
| }, | |
| bombDistance: { | |
| label: 'Bomb Range', | |
| default: 7 | |
| }, | |
| portalForce: { | |
| label: 'Portal Boost Force', | |
| default: 1 | |
| }, | |
| portalDistance: { | |
| label: 'Portal Boost Range', | |
| default: 4 | |
| } | |
| } | |
| }, | |
| ghosts: { | |
| label: 'Ghost Mode', | |
| settings: [] | |
| } | |
| } : {}; | |
| $('#settings').after($('<section>').attr('id', 'settingsOverview')); | |
| $('#settingsOverview').addClass('privateGame').append($('<h2>').text('Game Settings')).append($('<ul>')); | |
| setTimeout(function() { | |
| $('#settings h2 span').appendTo('#settingsOverview h2').addClass('leader'); | |
| }, 1); | |
| $('#rndTeamsButtons').text('Random'); | |
| $('#swapTeamsButtons').text('Swap'); | |
| $('#settings form div:last-child').css({position: 'absolute', right: '120px', top: '40px'}).addClass('privateGame').appendTo('body'); | |
| $('#chat').append($('<div>').attr('id', 'chatInner')); | |
| updateSettings(); | |
| function updateSettings() { | |
| function getValue(el) { | |
| return $(el).prop('tagName') === 'INPUT' && $(el).attr('type') === 'checkbox' ? $(el).prop('checked') : $(el).attr('type') === 'number' || $(el).attr('jsType') === 'number' ? parseFloat($(el).val()) : $(el).val(); | |
| } | |
| $('#settingsOverview ul > *').remove(); | |
| var count = 0; | |
| var not = []; | |
| // Add rule items | |
| for(var key in defaults) { | |
| var val = getValue($('#settings .setting[name=' + key + ']')), | |
| setting = defaults[key]; | |
| if(val != setting.default) { | |
| $('<li>') | |
| .attr('setting', key) | |
| .text(setting.label + (key === 'buffDelay' ? '' : ': ')) | |
| .append(key === 'buffDelay' ? '' : | |
| $('#settings .setting[name=' + key + ']').clone().change((function(key) { | |
| return function() { | |
| tagpro.group.socket.emit('setting', {name: key, value: $(this).val()}); | |
| }; | |
| })(key)).val(val) | |
| ) | |
| .append( | |
| $('<a>') // remove button | |
| .attr('href', '#') | |
| .addClass('leader') | |
| .addClass('changeSettingButton') | |
| .text('remove') | |
| .click( | |
| function(key, val) { | |
| return function() { | |
| tagpro.group.socket.emit('setting', { | |
| name: key, | |
| value: val | |
| }); | |
| }; | |
| }(key, setting.default) | |
| ) | |
| ).appendTo('#settingsOverview ul'); | |
| ++count; | |
| not.push(key); | |
| } | |
| } | |
| if(count === 0) | |
| $('<li>').text('Default Settings').appendTo('#settingsOverview ul'); | |
| // GameModes | |
| var any = false; | |
| for(var key in gameModes) { | |
| var gm = gameModes[key], | |
| enabled = $('.gameModeEnable[gamemode=' + key + ']').prop('checked'); | |
| if(enabled) { | |
| if(!any) | |
| $('#settingsOverview ul').append($('<hr>')); | |
| any = true; | |
| not.push(key); | |
| var remove = $('<a>').attr('href', '#').text('remove').addClass('changeSettingButton').addClass('leader'), | |
| div = $('<li>').attr('gamemode', key).append($('<div>').text(gm.label).append(remove)); | |
| $('#settingsOverview ul').append(div); | |
| remove.click((function(key) {return function() { | |
| tagpro.group.socket.emit('setting', { | |
| gameMode: key, | |
| value: false, | |
| name: '' | |
| }); | |
| };})(key)); | |
| for(var child in gm.settings) { | |
| var setting = gm.settings[child], | |
| childDiv = $('<div>').css('margin-left', '10px'); | |
| var input = $('[name=' + child + ']').clone().attr('name','').attr('id', 'GM_' + child).change((function(key, child){return function() { | |
| tagpro.group.socket.emit('setting', { | |
| gameMode: key, | |
| name: child, | |
| value: getValue($(this)) | |
| }); | |
| };})(key, child)); | |
| childDiv.append($('<label>').attr('for', 'GM_' + child).text(setting.label + ': ')).append(input).appendTo(div); | |
| } | |
| } | |
| } | |
| $('<hr>').addClass('leader').appendTo('#settingsOverview ul'); | |
| // New Rule | |
| var newRule = $('<select>') | |
| .attr('id', 'newRule') | |
| .append( | |
| $('<option>') | |
| .attr('value', '') | |
| .text('Add rule...') | |
| ) | |
| .css('max-width', '120px'); | |
| for(key in defaults) | |
| if(not.indexOf(key) < 0) { | |
| var optgroup = defaults[key].optgroup; | |
| if(newRule.find('optgroup[label="' + optgroup + '"]').length === 0) | |
| newRule.append($('<optgroup>').attr('label', optgroup)); | |
| newRule.find('optgroup[label="' + optgroup + '"]').append( | |
| $('<option>') | |
| .attr('value', key) | |
| .text(defaults[key].label) | |
| ); | |
| } | |
| if(tagpro.serverHost.indexOf('newcompte') >= 0) | |
| newRule.append($('<optgroup>').attr('label', 'Special Settings')); | |
| for(var key in gameModes) | |
| if(not.indexOf(key) < 0) | |
| newRule.find('optgroup[label="Special Settings"]').append( | |
| $('<option>') | |
| .attr('value', 'GM_' + key) | |
| .text(gameModes[key].label) | |
| ); | |
| newRule.change(function() { | |
| $('#newRuleValue').remove(); | |
| var key = $(this).val(); | |
| if(key.startsWith('GM_')) | |
| tagpro.group.socket.emit('setting', { | |
| gameMode: key.substring(3), | |
| name: '', | |
| value: true | |
| }); | |
| else if(key !== "") { | |
| if(key === 'buffDelay') | |
| tagpro.group.socket.emit('setting', {name: key, value: true}); | |
| else newRule.after( | |
| $('#settings .setting[name=' + key + ']').clone() | |
| .attr('id', 'newRuleValue') | |
| .removeClass('setting') | |
| .attr('name', '') | |
| .css('margin-left', '20px') | |
| .change(function() { | |
| tagpro.group.socket.emit('setting', { | |
| name: newRule.val(), | |
| value: getValue($('#newRuleValue')) | |
| }); | |
| }) | |
| ); | |
| } | |
| }); | |
| $('<li>').append(newRule).addClass('leader').appendTo('#settingsOverview ul'); | |
| if(!$('body').hasClass('groupLeader')) | |
| $('#settingsOverview .leader').addClass('hide'); | |
| } | |
| $('header').append('Play with Friends'); | |
| tagpro.group.socket._callbacks.banned = function() { | |
| document.location.href = '/groups/?err=banned'; | |
| }; | |
| tagpro.group.socket.on('removed', function() {if(document.location.href === '/')document.location.href = '/groups/?err=banned';}); | |
| unread = 0; | |
| active = true; | |
| $(window).focus(function() {active = true; document.title = 'TagPro Group'; unread = 0;}); | |
| $(window).blur(function() {active = false;}); | |
| function addChat(msg) { | |
| $(msg).appendTo('#chat'); | |
| $('#chat').scrollTop($('#chat').get(0).scrollHeight); | |
| var history = GM_getValue('history_' + document.location.pathname.split('/')[2]) || []; | |
| history.push('<div>' + msg.html() + '</div>'); | |
| GM_setValue('history_' + document.location.pathname.split('/')[2], history); | |
| if(!active) | |
| document.title = '(' + (++unread) + ') TagPro Group'; | |
| } | |
| tagpro.group.socket._callbacks.chat[0] = function(e) { | |
| var msg = $('<div>'); | |
| // parse URLs | |
| e.message = e.message.replace(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/, function(url) { | |
| return '<a target="_blank" href="' + url + '">' + url + '</a>'; | |
| }); | |
| if(e.from) { | |
| var leader = false, you = false, color = "#AAAAAA"; | |
| $('.teams li').each(function() { | |
| var p = $(this).clone(); | |
| p.find('span').remove(); | |
| if(p.text() == e.from) { | |
| leader = $(this).hasClass('leader'); | |
| you = $(this).hasClass('you'); | |
| switch($(this).parent().parent().attr('id')) { | |
| case 'redTeam': | |
| color = '#FF6666'; | |
| break; | |
| case 'blueTeam': | |
| color = '#6666FF'; | |
| } | |
| } | |
| }); | |
| if(e.message.startsWith('[#] ') && leader) | |
| e.message = e.message.substring(3); | |
| else | |
| msg.append($('<span>').addClass('playerName').addClass(leader ? '_leader' : you ? '_you' : '').css('color', color).text(e.from + ': ')); | |
| } | |
| addChat(msg.append(e.message)); | |
| }; | |
| tagpro.group.leader = '-'; | |
| tagpro.group.socket.on('member', function(e) { | |
| if(e.leader) { | |
| if(tagpro.group.leader !== e.id && tagpro.group.leader !== "-") | |
| addChat($("<div>'" + e.name + "' was set as group leader.</div>")); | |
| tagpro.group.leader = e.id; | |
| } | |
| }); | |
| tagpro.group.socket.on('setting', updateSettings); | |
| if(!($('.teams li').length >= 4 || tagpro.serverHost.indexOf('maptest') >= 0)) | |
| $('.privateGame').addClass('hide'); | |
| function playerButtons() { | |
| $('.teams li').each(function() { | |
| var c = $(this).children().clone().addClass('playerStatus'); | |
| $(this).children().remove(); | |
| $(this).html('<div>'+$(this).data('model').name+'</div>').prepend(c); | |
| }).append($('<span>').addClass('ban').addClass('playerAction').attr('title', 'Ban from Group').click(function() { | |
| tagpro.group.socket.emit('kick', $(this).parent().data('model').id); | |
| })).append($('<span>').addClass('makeLeader').addClass('playerAction').attr('title', 'Make Leader').click(function() { | |
| tagpro.group.socket.emit('leader', $(this).parent().data('model').id); | |
| })); | |
| } | |
| ['port', 'you', 'member', 'private', 'removed'].forEach(function(x) { | |
| tagpro.group.socket.on(x, playerButtons); | |
| }); | |
| playerButtons(); | |
| // Maps | |
| categories = []; | |
| maps = {}; | |
| $('#settings .setting[name=map] > *').each(function(x) { | |
| if($(this).prop('tagName') === 'OPTGROUP') { | |
| categories.push(['group' + x, $(this).attr('label'), []]); | |
| $(this).find('option').each(function() { | |
| categories[categories.length - 1][2].push([$(this).attr('value'), $(this).text()]); | |
| maps[$(this).attr('value')] = { | |
| category: categories.length - 1 | |
| }; | |
| }); | |
| } else { | |
| if($(this).attr('value') === '[object Object]') { | |
| categories.push(['jj1', 'maps.jukejuice.com']); | |
| categories.push(['jj2', 'unfortunate-maps.jukejuice.com']); | |
| } else | |
| categories.push(['random', 'Random Map']); | |
| } | |
| }); | |
| mapIds = { // positive is unfortunate-maps.jukejuice.com, negative is maps.jukejuice.com. always prefer unfortunate-maps because it has better previews. this was a lot of work so respect it pls | |
| '45': 28, | |
| '00101010': 5660, | |
| 'AngryPig': 5430, | |
| 'Backdoor': 5416, | |
| 'Basketball': -6503, | |
| 'Battledome2': -1879, | |
| 'BomberDOME': -1913, | |
| 'Boosts': -1594, | |
| 'BotBattle': 16050, | |
| 'Bounce': -3318, | |
| 'BuddySystem': 1184, | |
| 'Bulldog': 9201, | |
| 'CFB': 4931, | |
| 'ChaosBall': -3453, | |
| 'Classico': 4995, | |
| 'Cloud': 5433, | |
| 'CommandCenter': 3, | |
| 'Constriction': 4915, | |
| 'DZ4': 11158, | |
| 'DangerZone': 13358, | |
| 'Diamond': 6295, | |
| 'Dodgeball': 763, | |
| 'Draft': 13383, | |
| 'Duel': 4999, | |
| 'EMERALD': 5436, | |
| 'FindTheKey': -2320, | |
| 'Flame': 5057, | |
| 'Foozball': 4934, | |
| 'Frontdoor': 5439, | |
| 'GameMode': -3335, | |
| 'GateKeeper': 2620, | |
| 'GrailOfSpeed': 4916, | |
| 'Hockey': 12334, | |
| 'HolySee': 373, | |
| 'Hornswoggle': 584, | |
| 'Hourglass': 4906, | |
| 'Hub': 9200, | |
| 'Hurricane2': 2730, | |
| 'HyperReactor': 374, | |
| 'Hyperdrive': 4914, | |
| 'IRON': 170, | |
| 'IceRink': -1974, | |
| 'Jagged': 4935, | |
| 'Kite': 5327, | |
| 'Madness': -1789, | |
| 'Micro': 4929, | |
| 'Monarch': 9637, | |
| 'OFM': -3299, | |
| 'Penalties': -3300, | |
| 'Pilot': 690, | |
| 'Platypus': 7666, | |
| 'PushIt': -3302, | |
| 'RedRover': -1851, | |
| 'Renegade': 5481, | |
| 'Rink': 4926, | |
| 'RiskAndReward': 376, //glory hole | |
| 'RocketBalls': 4912, | |
| 'Rugby': 16051, | |
| 'Rush': 12192, | |
| 'SaM': 16052, //sharks and minnows | |
| 'Shine': 4917, | |
| 'Simplicity': 377, | |
| 'Smirk': 4913, | |
| 'SuperDuperStamp': 2731, | |
| 'TRArcTurnSpike': 6742, | |
| 'TRCalmSlopes': 6661, | |
| 'TRMagic8Lanes': 11803, | |
| 'TRPokeBomb': -3541, | |
| 'TRRainbowRoad': 6740, | |
| 'TRSerpentSwerve': 8995, | |
| 'TRSnooTrack': 3041, | |
| 'TRSpaceShuttle': 158, | |
| 'TRSpinoutRaceway': 6664, | |
| 'TRThreeCourseMeal': 702, | |
| 'TRTickTock': 157, | |
| 'TRWonky': 161, | |
| 'TRWormy': 8997, | |
| 'ThinkingWithPortals': 5937, | |
| 'ThunderDome': -1834, //mirrored version but only i could find | |
| 'Transilio': 9015, | |
| 'Ultradrive': 6008, | |
| 'Volt': 4918, | |
| 'WTFdome': -1984, | |
| 'War': -679, | |
| 'WelcomeToMars': -1636, | |
| 'Wombo_Combo': 10135, | |
| 'arena': -1588, | |
| 'battery': 362, | |
| 'bird': 365, | |
| 'blastoff': 366, | |
| 'bomber': 367, | |
| 'boombox': 368, | |
| 'caravan': 6291, | |
| 'centerflag': 4891, | |
| 'clutch': 4892, | |
| 'colors': 370, | |
| 'community1': 4902, //Pokeball | |
| 'elimination1v1multi': -1956, | |
| 'elimination4v4': -1954, | |
| 'evenhorizon2': 6632, | |
| 'fullspeed': 4893, | |
| 'gamepad': 372, | |
| 'lold': 4907, | |
| 'map2-2': 4895, //Figure 8 | |
| 'marsballrace': -2303, | |
| 'nfm': -2758, | |
| 'oval': 375, | |
| 'reflex2': 4911, | |
| 'ricochet': 4920, | |
| 'shortcut': 4903, | |
| 'snes': 4938, | |
| 'snipers2': -2121, | |
| 'snipers3': -1623, | |
| 'speedway': 4904, | |
| 'spiders': 4930, | |
| 'star': 378, | |
| 'swoop': 379, | |
| 'teamwork': 4898, //GeoKoala | |
| 'thinking': -2276, //Thinking with neutral flags | |
| 'twister': 4996, | |
| 'vee2': 4921, //Big Vird | |
| 'velocity': 4923, | |
| 'whirlwind': 898, | |
| 'wormy': 1167, | |
| 'yiss 3.2': 4940, | |
| 'Fiend': 14696, | |
| 'Sediment': 16449, | |
| 'Citadel': 17623, | |
| 'Graphite': 17775, | |
| 'Saigon': 17656, | |
| 'Tombolo': 17615 | |
| }; | |
| $('#settingsOverview').append($('<section>').addClass('privateGame').attr('id', 'mapSelector').append($('<div>').addClass('leader').append($('<select>').addClass('setting').attr('id', 'mapSelectorCategory')))); | |
| categories.forEach(function(x) { | |
| $('#mapSelectorCategory').append($('<option>').attr('value', x[0]).text(x[1])); | |
| var $el; | |
| switch(x[0]) { | |
| case 'random': return; | |
| case 'jj1': case 'jj2': $el = $('<input>').attr('type', 'number').attr('placeholder', 'ID'); break; | |
| default: $el = $('<select>').append($('<option>').attr('value', '__none__').text('')); x[2].forEach(function(y) { | |
| $el.append($('<option>').attr('value', y[0]).text(y[1])); | |
| }); | |
| } | |
| $el.attr('id', 'mapSelector_' + x[0]).addClass('setting').addClass('mapSelectorCategory').appendTo('#mapSelector > div').hide(); | |
| }); | |
| $('#mapSelector').append($('<h3>').attr('id', 'mapTitle')).append($('<img>').attr('id', 'mapPreview').fadeOut().on('load', function() {$(this).fadeIn();})); | |
| $('#mapSelectorCategory').change(function() { | |
| if($(this).val() === 'random') | |
| tagpro.group.socket.emit('setting', {name: 'map', value: ''}); | |
| $('.mapSelectorCategory').hide(); | |
| $('#mapSelector_' + $(this).val()).show(); | |
| }); | |
| changeTimeout = 0; | |
| function setPreview(url) { | |
| changeTimeout > 0 && clearTimeout(changeTimeout); | |
| changeTimeout = setTimeout(function() { | |
| $('#mapPreview').fadeOut(); | |
| setTimeout(function() { | |
| $('#mapPreview').attr('src', url); | |
| }, 250); | |
| }, 750); | |
| } | |
| $('select.mapSelectorCategory').change(function() { | |
| if($(this).val() !== '__none__') { | |
| tagpro.group.socket.emit('setting', {name: 'map', value: $(this).val()}); | |
| setPreview('http://' + (mapIds[$(this).val()] > 0 ? 'unfortunate-maps' : 'maps') + '.jukejuice.com/static/thumbs/' + Math.abs(mapIds[$(this).val()]) + '.png'); | |
| } | |
| }); | |
| jjSelectTimeout = 0; | |
| function updateJJ(id, val) { | |
| tagpro.group.socket.emit('setting', { | |
| name: 'mapId', | |
| value: val | |
| }); | |
| tagpro.group.socket.emit('setting', { | |
| name: 'mapSite', | |
| value: id === 'mapSelector_jj2' ? 1 : 0 | |
| }); | |
| } | |
| $('#mapSelector_jj1, #mapSelector_jj2').keyup(function() { | |
| setPreview('http://' + ($(this).attr('id') === 'mapSelector_jj2' ? 'unfortunate-maps' : 'maps') + '.jukejuice.com/static/thumbs/' + $(this).val() + '.png'); | |
| jjSelectTimeout > 0 && clearTimeout(jjSelectTimeout); | |
| jjSelectTimeout = setTimeout(updateJJ, 500, $(this).attr('id'), $(this).val()); | |
| }); | |
| tagpro.group.socket.on('setting', function(s) { | |
| if(s.name === 'map') { | |
| var jj = typeof s.value === 'object', map = jj ? {category: 1 + s.value.site} : maps[s.value] || {category: 0}, category = categories[map.category]; | |
| $('#mapSelectorCategory').val(category[0]); | |
| $('select.mapSelectorCategory').val('__none__'); | |
| $('#mapSelector_jj1, #mapSelector_jj2').val(''); | |
| $('.mapSelectorCategory').hide(); | |
| $('#mapSelector_' + category[0]).val(jj ? s.value.id : s.value).show(); | |
| if(jj || s.value != NaN) | |
| setPreview(jj ? 'http://' + ['maps', 'unfortunate-maps'][s.value.site] + '.jukejuice.com/static/thumbs/' + s.value.id + '.png' | |
| : 'http://' + (mapIds[s.value] > 0 ? 'unfortunate-maps' : 'maps') + '.jukejuice.com/static/thumbs/' + Math.abs(mapIds[s.value]) + '.png'); | |
| $('#mapTitle').text(jj ? s.value.name : $('#mapSelector option[value=' + s.value + ']').text() || 'Random Map'); | |
| } | |
| }); | |
| // Chat History | |
| function loadLog(log) { | |
| var history = log; | |
| if(history.length > 0) | |
| $('#chat').prepend($('<hr>')); | |
| $('#chat').prepend(history.join('')); | |
| } | |
| loadLog(GM_getValue('history_' + document.location.pathname.split('/')[2]) || []); | |
| setTimeout(function(){$('#chat').scrollTop($('#chat').get(0).scrollHeight);},500); | |
| // Server switcher | |
| newGroupForm = $('<form>').attr('method', 'POST').attr('target', '_blank').append($('<input>').attr('name','name')).append($('<input>').attr('type','checkbox').attr('name','public')); | |
| $('#actions').append($('<div>').attr('id', 'switchServer').addClass('leader').append($('<select>').attr('id', 'switchServerSelect').append($('<option>').attr('value', '').text('Switch Server...')))); | |
| for(var type in servers) { | |
| var optgroup = $('<optgroup>').attr('label', type); | |
| for(var server in servers[type])if(servers[type][server].url !== tagpro.serverHost) { | |
| var option = $('<option>').attr('value', servers[type][server].url).text(servers[type][server].name).appendTo(optgroup); | |
| ping(servers[type][server], function(x) { | |
| $('option[value="' + x.url + '"]').text(x.name + (x.error ? '' : ' (' + x.players + (x.players === 1 ? ' player' : ' players') + ')')); | |
| }); | |
| } | |
| optgroup.appendTo('#switchServerSelect'); | |
| } | |
| $('#switchServerSelect').change(function() { | |
| var transferredSettings = {}; | |
| $('.setting').each(function() { | |
| if(!($('.setting[name=map]').val() !== '[object Object]' && ($(this).attr('name') === 'mapId' || $(this).attr('name') === 'mapSite'))) | |
| transferredSettings[$(this).attr('name')] = ($(this).attr('type') === 'checkbox' ? $(this).prop('checked') : $(this).val()); | |
| }); | |
| console.log('Switching to ' + $(this).val() + ' with settings ' + JSON.stringify(transferredSettings)); | |
| GM_setValue('transferredSettings', transferredSettings); | |
| GM_setValue('transferredChatLog', GM_getValue('history_' + document.location.pathname.split('/')[2])); | |
| GM_deleteValue('newGroupURL'); | |
| newGroupForm.attr('action', 'http://' + $(this).val() + '/groups/create').submit(); | |
| tagpro.group.socket.emit('chat', '[#] Creating a new group on ' + $(this).val() + '...'); | |
| $(this).val('').prop('disabled', true); | |
| interval = setInterval(function() { | |
| if(GM_getValue('newGroupURL')) { | |
| clearInterval(interval); | |
| $('#switchServerSelect').prop('disabled', false); | |
| tagpro.group.socket.emit('chat', '[#] New group: ' + GM_getValue('newGroupURL')); | |
| } | |
| }, 10); | |
| }); | |
| if(GM_getValue('transferredSettings')) { | |
| var transferredSettings = GM_getValue('transferredSettings'); | |
| GM_setValue('history_' + document.location.pathname.split('/')[2], GM_getValue('transferredChatLog')); | |
| loadLog(GM_getValue('transferredChatLog') || []); | |
| GM_deleteValue('transferredSettings'); | |
| GM_deleteValue('transferredChatLog'); | |
| console.log('Restoring settings ' + JSON.stringify(transferredSettings)); | |
| for(var key in transferredSettings) | |
| tagpro.group.socket.emit('setting', {name: key, value: transferredSettings[key]}); | |
| GM_setValue('newGroupURL', document.location.href); | |
| } | |
| function ping(server, callback) { | |
| $.ajax({ | |
| url:'http://'+server.url+'/stats?callback=?', | |
| timeout:1000, | |
| success:function(response) { | |
| server.players = response.players; | |
| server.error = false; | |
| callback(server); | |
| }, | |
| error:function() { | |
| server.error = true; | |
| callback(server); | |
| }, | |
| dataType:'json' | |
| }); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment