Ruud_Verbeek

TagPro Group Presets

Feb 28th, 2015
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         TagPro Group Presets
  3. // @namespace    http://www.arfie.nl
  4. // @version      1.0
  5. // @description  Allows you to create presets for group/private game settings
  6. // @author       Ruud Verbeek
  7. // @include      http://tagpro-*.koalabeast.com/groups/*
  8. // @include      http://tangent.jukejuice.com/groups/*
  9. // @include      http://maptest*.newcompte.fr/groups/*
  10. // @grant        none
  11. // ==/UserScript==
  12.  
  13. function getCookie(e, t) {
  14.     var n = $.cookie(e);
  15.     $.removeCookie(e);
  16.     var r = $.cookie(e) === undefined;
  17.     (n === undefined || r) && $.cookie(e, n || t, {
  18.         expires: 36500,
  19.         path: "/",
  20.         domain: tagpro.cookieHost
  21.     });
  22.     return n || t;
  23. }
  24.  
  25. function setCookie(name, value) {
  26.     $.removeCookie(name);
  27.     $.cookie(name, value, {domain: tagpro.cookieHost, path: '/', expires: 36500});
  28. }
  29.  
  30. var cookie = getCookie('groupPresets', '{}');
  31. console.log(JSON.stringify(cookie));
  32. presets = JSON.parse(cookie);
  33.  
  34. var defaults = [
  35.     ['redTeamName', 'Red Team Name', 'Red'],
  36.     ['blueTeamName', 'Blue Team Name', 'Blue'],
  37.     ['redTeamScore', 'Red Score', '0'],
  38.     ['blueTeamScore', 'Blue Score', '0'],
  39.     ['map', 'Map', ''],
  40.     ['time', 'Time Limit', '12'],
  41.     ['caps', 'Capture Limit', '3'],
  42.     ['accel', 'Acceleration', '1'],
  43.     ['topspeed', 'Top Speed', '1'],
  44.     ['bounce', 'Bounciness', '1'],
  45.     ['playerRespawnTime', 'Player Respawn Time', '3000'],
  46.     ['speedPadRespawnTime', 'Boost Respawn Time', '10000'],
  47.     ['dynamiteRespawnTime', 'Bomb Respawn Time', '30000'],
  48.     ['buffRespawnTime', 'Powerup Respawn Time', '60000'],
  49.     ['potatoTime', 'Potato', '0'],
  50.     ['selfAssignment', 'Allow self-assignment', true]
  51. ];
  52.  
  53. presets['Default'] = {
  54.     _defaults: true, // set other settings to default
  55.     _standard: true // can't be removed
  56. };
  57. presets['Pick Up Game'] = {
  58.     caps: 0,
  59.     time: 10,
  60.    
  61.     _defaults: false,
  62.     _standard: true
  63. };
  64. presets['Hockey'] = {
  65.     map: 'Hockey',
  66.     caps: 0,
  67.     time: 10,
  68.    
  69.     _defaults: false,
  70.     _standard: true
  71. };
  72. presets['Open Field Masters'] = {
  73.     map: 'OFM',
  74.     time: 5,
  75.    
  76.     _defaults: false,
  77.     _standard: true
  78. };
  79.  
  80. function isLeader() {return !$('[name=map]').prop('disabled');}
  81.  
  82. function apply(preset) {
  83.     function set(setting, value) {
  84.         tagpro.group.socket.emit('setting', {name: setting, value: value});
  85.     }
  86.     if(isLeader()) {
  87.         var setDefaults = preset._defaults;
  88.         for(var i in defaults) {
  89.             var setting = defaults[i];
  90.             if(preset[setting[0]] !== undefined)
  91.                 set(setting[0], preset[setting[0]]);
  92.             else if(setDefaults)
  93.                 set(setting[0], setting[2]);
  94.         }
  95.     } else console.log('you need to be leader');
  96. }
  97.  
  98. function fillInPresets() {
  99.     function usePreset(preset) {
  100.         return function() {
  101.             $('.presetsWindow').fadeOut();
  102.             apply(preset);
  103.         };
  104.     }
  105.     function editPreset(name, preset) {
  106.         return function() {
  107.             resetEditor();
  108.             for(var setting in preset) {
  109.                 var val = preset[setting];
  110.                 switch(setting) {
  111.                     case '_defaults': $('#defaults').prop('checked', val); break;
  112.                     case 'selfAssignment':
  113.                         $('#preset-selfAssignment').prop('checked', val).parent().parent().css({color:'white'}).find('td:first-child input').prop('checked', true);
  114.                         break;
  115.                     default:
  116.                         $('#preset-'+setting).val(val).parent().parent().css({color:'white'}).find('td:first-child input').prop('checked', true);
  117.                         break;
  118.                 }
  119.             }
  120.             $('#presetName').val(name);
  121.             $('#newPresetSave').css({opacity:'1.0'});
  122.             $('#newPresetWindow').fadeIn();
  123.         };
  124.     }
  125.     $('#presetsWindow table tr').remove();
  126.     for(var preset in presets) {
  127.         var tr = $('<tr></tr>');
  128.         tr.append('<td style="width: 60%;"><a class="presetUse">'+preset+'</a></td>');
  129.         if(!presets[preset]._standard)
  130.             tr.append('<td style="width: 20%;"><a class="presetEdit">edit</a></td><td style="width: 20%;"><a class="presetRemove">delete</a></td>');
  131.         else
  132.             tr.find('td').attr('colspan', 3);
  133.        
  134.         tr.appendTo('#presetsWindow table');
  135.        
  136.         tr.find('td a.presetUse').click(usePreset(presets[preset]));
  137.         tr.find('td a.presetEdit').click(editPreset(preset, presets[preset]));
  138.         tr.find('td a.presetRemove').click(function(preset){return function() {
  139.             delete presets[preset];
  140.             setCookie('groupPresets', JSON.stringify(presets));
  141.             fillInPresets();
  142.         };}(preset));
  143.     }
  144.     $('#presetsWindow table').append('<tr><td style="background-color:transparent"><a id="newPresetButton">New preset</a></td><td style="background-color:transparent"/><td style="background-color:transparent"/></tr>');
  145.     $('#newPresetButton').click(editPreset('', {}));
  146. }
  147.  
  148. function resetEditor() {
  149.     $('#presetName').val('');
  150.     $('#newPresetSave').css({opacity:'0.25'});
  151.     $('#defaults').prop('checked', false);
  152.     for(var i in defaults) {
  153.         var setting = defaults[i];
  154.         $('#preset-enabled-'+setting[0]).prop('checked', false).parent().parent().css({color:'gray'});
  155.         if(setting[0] === 'selfAssignment')
  156.             $('#preset-selfAssignment').prop('checked', true);
  157.         else
  158.             $('#preset-'+setting[0]).val(setting[2]);
  159.     }
  160. }
  161.  
  162. $('#settings h2').append('<a id="presetsButton">Presets</a>');
  163.  
  164. $('body').append('<div id="presetsWindow" class="window presetsWindow"></div><div class="presetsWindow" id="presetsWindowOverlay"></div>');
  165. $('#presetsWindow')
  166.     .append('<h2>Presets</h2>')
  167.     .append('<table style="border-collapse: separate; border-spacing: 2px;"></table>')
  168.     .append('<a id="presetsClose">Close</a>');
  169.  
  170. $('body').append('<div class="window" id="newPresetWindow"></div>');
  171. $('#newPresetWindow')
  172.     .append('<h2>New Preset<a id="resetEditor">Reset</a></h2>')
  173.     .append('<input type="text" id="presetName" placeholder="Name..." />')
  174.     .append('<table></table>')
  175.     .append('<input type="checkbox" id="defaults"/><label for="defaults">Reset other settings to defaults</label>')
  176.     .append('<a style="opacity:0.25" id="newPresetSave">Save</a><a id="newPresetCancel">Cancel</a>');
  177.  
  178. for(var i in defaults) {
  179.     var setting = defaults[i];
  180.     var tr = $('<tr></tr>');
  181.     tr.append('<td style="width:24px;"><input type="checkbox" id="preset-enabled-'+setting[0]+'"/></td>');
  182.     tr.append('<td style="width:160px;"><label for="preset-'+setting[0]+'">'+setting[1]+'</label></td>');
  183.     tr.append('<td></td>');
  184.     var el = $('[name='+setting[0]+']').clone().appendTo(tr.find('td:last-child')).attr('id', 'preset-'+setting[0]).attr('name', null).unbind();
  185.     if(setting[0] === 'map') {
  186.         el.find('option[value=marsballrace]').text('Anger Management');
  187.         el.find('option:nth-child(2)').remove();
  188.     }
  189.     tr.appendTo('#newPresetWindow table');
  190.    
  191.     if(setting[0] === 'selfAssignment')
  192.         el.prop('checked', true);
  193.     else
  194.         el.val(setting[2]);
  195.    
  196.     tr.find('td:first-child input').change(function(name, def){return function() {
  197.         if(!$(this).prop('checked'))
  198.             $('#preset-'+name).val(def);
  199.         $(this).parent().parent().css({color: $(this).prop('checked') ? 'white' : 'gray'});
  200.     };}(setting[0], setting[2]));
  201.    
  202.     el.on(el.attr('type') === undefined && el.prop('tagName') === 'INPUT' ? 'keyup' : 'change', function(def){return function(){
  203.         var val = $(this).attr('type') === 'checkbox' ? $(this).prop('checked') : $(this).val();
  204.         $(this).parent().prev().prev().find('input').prop('checked', val != def);
  205.         $(this).parent().parent().css({color: val != def ? 'white' : 'gray'});
  206.     };}(setting[2]));
  207. }
  208.  
  209. fillInPresets();
  210.  
  211. $('#presetsButton').click(function() {$('.presetsWindow').fadeIn();});
  212. $('#presetsClose').click(function() {$('.presetsWindow').fadeOut();});
  213.  
  214. $('#resetEditor').click(resetEditor);
  215.  
  216. $('#presetName').keyup(function() {
  217.     $('#newPresetSave').css({opacity: $(this).val() === '' ? '0.25' : '1.0'});
  218. });
  219.  
  220. $('#newPresetSave').click(function() {
  221.     if($('#presetName').val() !== '') {
  222.         var preset = {};
  223.         for(var i in defaults) {
  224.             var setting = defaults[i];
  225.             var el = $('#preset-'+setting[0]);
  226.             if($('#preset-enabled-'+setting[0]).prop('checked'))
  227.                 preset[setting[0]] = el.attr('type') === 'checkbox' ? el.prop('checked') : el.val();
  228.         }
  229.         preset._defaults = $('#defaults').prop('checked');
  230.         presets[$('#presetName').val()] = preset;
  231.         setCookie('groupPresets', JSON.stringify(presets));
  232.         $('#newPresetWindow').fadeOut();
  233.         setTimeout(resetEditor, 500);
  234.         fillInPresets();
  235.     }
  236. });
  237. $('#newPresetCancel').click(function() {
  238.     $('#newPresetWindow').fadeOut();
  239.     setTimeout(resetEditor, 500);
  240. });
  241.  
  242. $('.presetsWindow, #newPresetWindow').hide();
  243.  
  244. $('body').append('<style type="text/css">' +
  245. '#presetsButton {float: right}' +
  246. '#presetsWindow {z-index: 10; border: 4px solid white; background-color: rgba(0, 0, 0, 0.9); width: 320px; height: 480px; position: fixed; left: calc(50% - 160px); top: calc(50% - 240px); text-align: center; padding: .5em;}' +
  247. '#presetsWindowOverlay {background-color: rgba(0, 0, 0, 0.5); position: absolute; left: 0; top: 0; width: 100%; height: 100%;}' +
  248. '#presetsClose {color: black; text-decoration: none; display: inline-block; padding: 5px 10px; width: 150px; font-size: 14pt; cursor: pointer; background-color: #ace600; border: 1px solid #608100; text-align: center; position: absolute; bottom: 1.5em; right: 85px;}' +
  249. '#presetsButton, .presetUse, .presetEdit, .presetRemove, #newPresetButton, #resetEditor {color: #0f0; cursor: pointer; display: block; height: 100%;}' +
  250. 'a:hover {text-decoration: none;}' +
  251. '#presetsWindow table {width: 100%;}' +
  252. '#presetsWindow table tbody {width: 100%; height: 370px; overflow: auto; float: left;}' +
  253. '#presetsWindow table tbody tr {display: table; width: 100%; text-align: left;}' +
  254. '#presetsWindow table tr:nth-child(even) td {background-color: #666;}' +
  255. '#presetsWindow table tr:nth-child(odd) td {background-color: #444;}' +
  256. '#newPresetWindow table tr {color: gray; -webkit-transition: color .25s; transition: color .25s;}' +
  257. '#newPresetWindow {z-index: 11; border: 4px solid white; background-color: rgba(0, 0, 0, 0.9); width: 480px; height: 640px; position: fixed; left: calc(50% - 240px); top: calc(50% - 320px); text-align: center; padding: .5em;}' +
  258. '#newPresetSave, #newPresetCancel {color: black; text-decoration: none; display: inline-block; padding: 5px 10px; width: 150px; font-size: 14pt; cursor: pointer; background-color: #ace600; border: 1px solid #608100; text-align: center; position: absolute; bottom: 1.5em;}' +
  259. '#newPresetSave {left: 1.5em; transition: opacity .25s; -webkit-transition: opacity .25s;}' +
  260. '#resetEditor {float:right;}' +
  261. '#newPresetCancel {right: 1.5em;}' +
  262. '</style>');
Advertisement
Add Comment
Please, Sign In to add comment