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