SHARE
TWEET

teste mexico

Tw100 Aug 12th, 2017 73 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           teste mexico
  3. // @author         Marcos V.S. Marques
  4. // @email          tribalwarsbr100@gmail.com
  5. // @namespace      https://www.youtube.com/channel/UCIngQdlpQxocFDB4Vk6yERg
  6. // @site           https://tribalwarsbr100.wixsite.com/tw100
  7. // @instagram      https://www.instagram.com/tribalwarsbr/
  8. // @version        2.2 (JUN/2017)
  9. // @grant          Publico
  10. // @description    Script Facilitador de Saques Game tribalwars(linguagem: javascript-ECMAscript5;)
  11. // @Realiza        Saques Automatizados Opções (A B C;) Deis Que Sejam Configurados para Tal Função
  12. // @Realiza        Avanço Para Proxima Aldeia (necessario conta premium para tal função;)
  13. // @Opções         Configuravel Tempo Velocidade de Saque e Avanço de Aldeias(somente no setup do codigo-fonte;)
  14. // @Utilização     Utilizar no assistente de saque
  15. // @include        https*://*.die-staemme.de/*
  16. // @include        https*://*.staemme.ch/*
  17. // @include        https*://*.tribalwars.net/*
  18. // @include        https*://*.tribalwars.nl/*
  19. // @include        https*://*.plemiona.pl/*
  20. // @include        https*://*.tribalwars.se/*
  21. // @include        https*://*.tribalwars.com.br/*
  22. // @include        https*://*.tribalwars.com.pt/*
  23. // @include        https*://*.divokekmeny.cz/*
  24. // @include        https*://*.triburile.ro/*
  25. // @include        https*://*.voyna-plemyon.ru/*
  26. // @include        https*://*.fyletikesmaxes.gr/*
  27. // @include        https*://*.tribalwars.com/*
  28. // @include        https*://*.divoke-kmene.sk/*
  29. // @include        https*://*.klanhaboru.hu/*
  30. // @include        https*://*.tribalwars.dk/*
  31. // @include        https*://*.tribals.it/*
  32. // @include        https*://*.klanlar.org/*
  33. // @include        https*://*.guerretribale.fr/*
  34. // @include        https*://*.guerrastribales.es/*
  35. // @include        https*://*.tribalwars.ae/*
  36. // @include        https*://*.tribalwars.co.uk/*
  37. // @include        https*://*.vojnaplemen.si/*
  38. // @include        https*://*.plemena.com/*
  39. // @include        https*://*.tribalwars.asia/*
  40. // @include        https*://*.tribalwars.works/*
  41. // @include        https*://*.tribalwars.us/*
  42. // @icon           https://media.innogamescdn.com/com_DS_FR/Quickbar/lc.png
  43. // ==/UserScript==
  44.  
  45. /*  Changelog versão 2.3
  46. *        Equipe do Canal Youtube TW 100 Foi Realizado a Mais Recente Atualização Para Implatação da universalização do conteudo do canal, assim tornando nosso conteudo cada vez mais usual e presente em todos servidores de tribalwars.
  47. *        Equipe do Canal Youtube TW 100 Solicita humildemente a colaboração dos usuarios dos conteudos abragidos no canal com likes, curtidas, comentarios nos videos, e com compartilhamento dos videos, isso era proporcionar um crescimen to do canal, e com isso cada vez  mais iremos trazer mais conteudo.
  48. *        Equipe do Canal Youtube TW 100 se reserva ao direito de possuir a posse do codigo-fonte  do script, quaisquer modificação deve ser solicitado via email, segundos regras da Licença Pública Geral GNU
  49. *        Equipe do Canal Youtube TW 100 não se responsabiliza por eventuais danos causados pela utilização do script
  50. *        Equipe do Canal Youtube TW 100 promove a canpanha "Software livre não e virus nem boot" abraça e se solidariza com os scripts de tampermonkey voltados para o game tribal wars, do qual as equipes inesperientes de suporte, sem conhecimento, e sem saber a historia dos primordios do game, impõe um pensamento de que os script de tampermonkey são proibidos. Muitas das melhorias no game, que se deu atraves de scrips de tampermonkey, feitos de players para players, Alem do qual esse pensamento foi uma forma da da grande empresa tutora do game promover seus ganhos com recursos pagos, e assim prejudicando os jogadores que não utiliza de dinheiro para jogar, *EQUIPE TW 100 DEIXA CLARO, QUE NÃO E PRECISO TER FUNÇÕES PAGAS PARA USUFLUIR DO GAME, TEMOS A MISSÃO DE TRAZER UMA INGUALAÇÃO DO QUAL OS PLAYERS QUE NÃO USUFLEM DE RECURSOS PREMIUNS TENHA A SUA DIPONIBILIDADE OS MESMO RECURSOS DOS QUE TEM*/
  51. /*       Equipe do Canal Youtube TW 100 no dia 25/06/2017 v2.0i primeira versão para atualização TW 8.89
  52. *        Equipe do Canal Youtube TW 100 Script em desenvolvimento, ao longo do tempo, de acordo com o tempo disponivel iremos adicionar mais funções
  53. */
  54.  
  55.  
  56. /*TW100*/ /* LOGO IREMOS CRIAR NOSSA PLAYLIST NO YOUTUBE SOMENTE COM SCRIPT TAMPERMONKEY*/
  57.  
  58. /* SettingsAPI: CANAL DO YOUTUBE TW 100
  59.         -------------------------------------------------------------------------------------
  60.         ╔═══╗╔═══╗╔═╗─╔╗╔═══╗╔╗───     ╔═══╗╔═══╗     ╔╗──╔╗╔═══╗╔╗─╔╗╔════╗╔╗─╔╗╔══╗─╔═══╗     ╔════╗──────     ─╔╗─╔═══╗╔═══╗
  61. ║╔═╗║║╔═╗║║║╚╗║║║╔═╗║║║───     ╚╗╔╗║║╔═╗║     ║╚╗╔╝║║╔═╗║║║─║║║╔╗╔╗║║║─║║║╔╗║─║╔══╝     ║╔╗╔╗║──────     ╔╝║─║╔═╗║║╔═╗║
  62. ║║─╚╝║║─║║║╔╗╚╝║║║─║║║║───     ─║║║║║║─║║     ╚╗╚╝╔╝║║─║║║║─║║╚╝║║╚╝║║─║║║╚╝╚╗║╚══╗     ╚╝║║╚╝╔╗╔╗╔╗     ╚╗║─║║║║║║║║║║
  63. ║║─╔╗║╚═╝║║║╚╗║║║╚═╝║║║─╔╗     ─║║║║║║─║║     ─╚╗╔╝─║║─║║║║─║║──║║──║║─║║║╔═╗║║╔══╝     ──║║──║╚╝╚╝║     ─║║─║║║║║║║║║║
  64. ║╚═╝║║╔═╗║║║─║║║║╔═╗║║╚═╝║     ╔╝╚╝║║╚═╝║     ──║║──║╚═╝║║╚═╝║──║║──║╚═╝║║╚═╝║║╚══╗     ──║║──╚╗╔╗╔╝     ╔╝╚╗║╚═╝║║╚═╝║
  65. ╚═══╝╚╝─╚╝╚╝─╚═╝╚╝─╚╝╚═══╝     ╚═══╝╚═══╝     ──╚╝──╚═══╝╚═══╝──╚╝──╚═══╝╚═══╝╚═══╝     ──╚╝───╚╝╚╝─     ╚══╝╚═══╝╚═══╝
  66. ╔════╗──────     ─╔╗─╔═══╗╔═══╗    
  67. ║╔╗╔╗║──────     ╔╝║─║╔═╗║║╔═╗║    
  68. ╚╝║║╚╝╔╗╔╗╔╗     ╚╗║─║║║║║║║║║║    
  69. ──║║──║╚╝╚╝║     ─║║─║║║║║║║║║║    
  70. ──║║──╚╗╔╗╔╝     ╔╝╚╗║╚═╝║║╚═╝║    
  71. ──╚╝───╚╝╚╝─     ╚══╝╚═══╝╚═══╝    
  72. ███۞███████ ]▄▄▄▄▄▄▄▄▄▄▄▄▃
  73. ▂▄▅█████████▅▄▃▂
  74. I███████████████████].
  75. ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙◤...
  76. */
  77.  
  78. var TWBot = {
  79.     init : function () {
  80.         this.helpers.init();
  81.         this.data.init();
  82.         this.attacks.init();
  83.         this.remote.init();
  84.         Function.prototype.Timer = function (a, b, c) {
  85.             var d = 0;
  86.             var e = this;
  87.             var f = new Date();
  88.             var g = function () {
  89.                 return e(f, d);
  90.             };
  91.             var h = function () {
  92.                 if (c) {
  93.                     c(f, d, b)
  94.                 };
  95.             };
  96.             var i = function () {
  97.                 d++;
  98.                 if (d < b && g() != false) {
  99.                     window.setTimeout(i, a);
  100.                 } else {
  101.                     h();
  102.                 }
  103.             };
  104.             i()
  105.         }
  106.     },
  107.     data : {
  108.         servertime : null,
  109.         serverDate : null,
  110.         worldConfig : null,
  111.         unitConfig : null,
  112.         unitTypes : {},
  113.         unitsBySpeed : [],
  114.         activeInterval: null,
  115.         reportsId : 0,
  116.         player : {
  117.             id : 0,
  118.             name : '',
  119.             premium : false,
  120.             migrated : false
  121.         },
  122.         villages : {},
  123.         reportedVillages : {},
  124.         request : function (d, f, g, h) {
  125.             var i = null;
  126.             var payload = null;
  127.             $.ajax({
  128.                 'url' : d,
  129.                 'data' : g,
  130.                 'dataType' : h,
  131.                 'type' : String(f || 'get').toUpperCase(),
  132.                 'async' : false,
  133.                 'error' : function (a, b, e) {
  134.                     i = 'Ajaxerror: ' + b;
  135.                 },
  136.                 'success' : function (a, b, c) {
  137.                     payload = a;
  138.                 }
  139.             });
  140.             if (i) {
  141.                 this.helpers.writeOut(i, TWBot.helpers.MESSAGETYPE_ERROR, true, 3000);
  142.             }
  143.             return payload;
  144.         },
  145.         createConfig : function (a) {
  146.             return $(this.request('/interface.php', 'get', {
  147.                     'func' : a
  148.                 }, 'xml')).find('config');
  149.         },
  150.         createUnitConfig : function () {
  151.             return this.createConfig('get_unit_info');
  152.         },
  153.         createWorldConfig : function () {
  154.             return this.createConfig('get_config');
  155.         },
  156.         init : function () {
  157.             this.player = this.loadGlobally('data_playerInfo', true);
  158.             if (this.player == null || this.player.id == 0) {
  159.                 this.player = {};
  160.                 this.player.id = parseInt(game_data.player.id);
  161.                 this.player.name = game_data.player.name;
  162.                 this.player.premium = game_data.player.premium;
  163.                 this.player.migrated = false;
  164.                 this.storeGlobally('data_playerInfo', this.player, true);
  165.             }
  166.             /*
  167.             if (!this.player.migrated) {
  168.                 this.migrateOldData();
  169.             }
  170.             */
  171.             this.villages = this.loadGlobally('data_villages', true);
  172.             if (this.villages == null || Object.keys(this.villages).length == 0 || Object.keys(this.villages).length != game_data.player.villages || this.villages[game_data.village.id].id == null) {
  173.                 if (this.villages == null || Object.keys(this.villages).length == 0) {
  174.                     this.villages = {};
  175.                 }
  176.                 this.retrieveVillagesData();
  177.             }
  178.             this.reportedVillages = this.loadGlobally('data_reportedVillages', true);
  179.             if (this.reportedVillages == null) {
  180.                 this.reportedVillages = {};
  181.                 this.storeGlobally('data_reportedVillages', this.reportedVillages, true)
  182.             }
  183.             this.worldConfig = this.loadGlobally('data_worldConfig');
  184.             this.worldConfig = this.createWorldConfig();
  185.             if (this.worldConfig == null) {
  186.                 this.worldConfig = this.createWorldConfig();
  187.                 this.storeGlobally('data_worldConfig', this.worldConfig)
  188.             }
  189.             this.unitConfig = this.loadGlobally('data_unitConfig');
  190.             this.unitConfig = this.createUnitConfig();
  191.             if (this.unitConfig == null) {
  192.                 this.unitConfig = this.createUnitConfig();
  193.                 this.storeGlobally('data_unitConfig', this.unitConfig)
  194.             }
  195.             this.unitTypes = this.load('data_unitTypes', true);
  196.             this.unitsBySpeed = this.load('data_unitBySpeeds');
  197.             if (this.unitsBySpeed != null) {
  198.                 this.unitsBySpeed = this.unitsBySpeed.split(' ')
  199.             }
  200.             if (this.unitTypes == null || this.unitsBySpeed == null) {
  201.                 this.unitTypes = {};
  202.                 var c = [];
  203.                 this.unitsBySpeed = [];
  204.                 this.unitConfig.children().each(function (a, b) {
  205.                     if (b.tagName == 'militia')
  206.                         return;
  207.                     TWBot.data.unitTypes['unit_input_' + b.tagName] = TWBot.helpers.getUnitTypeName(b.tagName);
  208.                     c[c.length] = {
  209.                         unit : b.tagName,
  210.                         speed : $(b).find('speed').text()
  211.                     }
  212.                 });
  213.                 c.sort(function (a, b) {
  214.                     return parseFloat(a.speed, 10) - parseFloat(b.speed, 10)
  215.                 });
  216.                 for (s in c) {
  217.                     this.unitsBySpeed[this.unitsBySpeed.length] = c[s].unit
  218.                 }
  219.                 this.store('data_unitTypes', this.unitTypes, true);
  220.                 this.store('data_unitBySpeeds', this.unitsBySpeed.join(' '));
  221.             }
  222.             this.servertime = $('#serverTime').html().match(/\d+/g);
  223.             this.serverDate = $('#serverDate').html().match(/\d+/g);
  224.             this.serverTime = new Date(this.serverDate[1] + '/' + this.serverDate[0] + '/' + this.serverDate[2] + ' ' + this.servertime.join(':'))
  225.         },
  226.         /*
  227.         migrateOldData : function () {
  228.             this.store('attacks_attacktemplates', localStorage.getItem(game_data.village.id + '_attacktemplates'));
  229.             this.player.migrated = true;
  230.             this.store('data_playerInfo', this.player, true)
  231.         },
  232.         */
  233.         store : function (a, b, c) {
  234.             if (c) {
  235.                 localStorage.setItem(game_data.world + '_' + game_data.village.id + '_' + a, JSON.stringify(b))
  236.             } else {
  237.                 localStorage.setItem(game_data.world + '_' + game_data.village.id + '_' + a, b)
  238.             }
  239.         },
  240.         storeGlobally : function (a, b, c) {
  241.             if (c) {
  242.                 localStorage.setItem(game_data.world + '_' + a, JSON.stringify(b))
  243.             } else {
  244.                 localStorage.setItem(game_data.world + '_' + a, b)
  245.             }
  246.         },
  247.         load : function (a, b) {
  248.             if (b) {
  249.                 return JSON.parse(localStorage.getItem(game_data.world + '_' + game_data.village.id + '_' + a))
  250.             }
  251.             return localStorage.getItem(game_data.world + '_' + game_data.village.id + '_' + a)
  252.         },
  253.         loadGlobally : function (a, b) {
  254.             if (b) {
  255.                 return JSON.parse(localStorage.getItem(game_data.world + '_' + a))
  256.             }
  257.             return localStorage.getItem(game_data.world + '_' + a)
  258.         },
  259.         remove : function (a) {
  260.             localStorage.removeItem(game_data.world + '_' + game_data.village.id + '_' + a)
  261.         },
  262.         retrieveVillagesData : function () {
  263.             TWBot.data.villageInfoFrameUrl = '/game.php?village=' + game_data.village.id + '&screen=overview_villages&rnd=' + Math.random();
  264.             TWBot.data.villageInfoHiddenFrame = $('<iframe src="' + TWBot.data.villageInfoFrameUrl + '" />').load(TWBot.data.infosLoaded).css({
  265.                     width : '100px',
  266.                     height : '100px',
  267.                     position : 'absolute',
  268.                     left : '-1000px'
  269.                 }).appendTo('body')
  270.         },
  271.         infosLoaded : function () {
  272.             var d = TWBot.data.villageInfoHiddenFrame.contents().find("#production_table tr td:nth-child(1)");
  273.             d.find('a').each(function (a, e) {
  274.                 var b = {};
  275.                 var c = $(e).attr('href').substr(18).split('&')[0];
  276.                 if (TWBot.data.villages[c] != null && TWBot.data.villages[c].id != null) {
  277.                     b = TWBot.data.villages[c]
  278.                 }
  279.                 if (game_data.village.id == c) {
  280.                     b.id = game_data.village.id;
  281.                     b.bonus = game_data.village.bonus;
  282.                     b.buildings = game_data.village.buildings;
  283.                     b.con = game_data.village.con;
  284.                     b.coord = game_data.village.coord;
  285.                     b.group = game_data.village.group;
  286.                     b.name = game_data.village.name;
  287.                     b.res = game_data.village.res;
  288.                     TWBot.helpers.writeOut("Updated Village info for " + game_data.village.name, TWBot.helpers.MESSAGETYPE_NORMAL)
  289.                 }
  290.                 TWBot.data.villages[c] = b
  291.             });
  292.             TWBot.data.storeGlobally('data_villages', TWBot.data.villages, true)
  293.         },
  294.         retrieveReport : function () {
  295.             this.reportsInfoFrameUrl = '/game.php?village=' + game_data.village.id + '&screen=report&mode=attack';
  296.             this.reportsInfoFrame = TWBot.helpers.createHiddenFrame(this.reportsInfoFrameUrl, TWBot.data.reportsLoaded);
  297.                        
  298.         },
  299.         reportsLoaded : function () {          
  300.             console.log('beginning to load');
  301.             TWBot.data.reportsInfoFrame.find('#report_list input[type=checkbox]:not(.selectAll)').each(function (a, e) {
  302.                 TWBot.data.reportsId= e.name.substr(3);
  303.                 TWBot.data.reportInfoFrameUrl = '/game.php?village=' + game_data.village.id + '&screen=report&mode=attack&view=' + TWBot.data.reportsId;
  304.                 TWBot.data.reportsInfoFrame.attr('src',TWBot.data.reportInfoFrameUrl);
  305.                 TWBot.data.reportLoaded();
  306.             });
  307.             TWBot.data.storeGlobally('data_reportedVillages', JSON.stringify(TWBot.data.reportedVillages));
  308.         },
  309.         reportLoaded: function () {
  310.             this.activeInterval = window.setTimeout(function(){return}, 100);
  311.             var e = TWBot.data.reportsInfoFrame.contents().find('span[title="Madera"]');
  312.             var f = TWBot.data.reportsInfoFrame.contents().find('span[title="Barro"]');
  313.             var g = TWBot.data.reportsInfoFrame.contents().find('span[title="Hierro"]');
  314.             var village = TWBot.data.reportsInfoFrame.contents().find('#attack_info_def');
  315.             console.log(TWBot.data.reportsInfoFrame);
  316.             console.log(e);
  317.             e=e.parent().text().split(" ");
  318.             f=f.parent().text().split(" ");
  319.             g=g.parent().text().split(" ");
  320.             village=village.find('.village_anchor.contexted').text().split(' ').reverse()[1].substr(1,7).split('|');           
  321.             console.log(village);
  322.             if (e.length>1||f.length>1||g.length>1){
  323.                 var madera = e[1];
  324.                 var barro = f[1];
  325.                 var hierro = g[1];
  326.                 console.log(village+': '+madera+' '+barro+' '+hierro);
  327.                 TWBot.data.reportedVillages[village] = {};
  328.                 TWBot.data.reportedVillages[village] = {'madera':parseInt(madera), 'barro':parseInt(barro), 'hierro':parseInt(hierro)};
  329.             }
  330.         }
  331.     },
  332.     attacks : {
  333.         attacking : false,
  334.         continueAttack : true,
  335.         attackId : 0,
  336.         attackTemplates : {},
  337.         unitPerAttack : [],
  338.         activeInterval : null,
  339.         init : function () {
  340.             this.hiddenFrameUrl = '/game.php?village=' + game_data.village.id + '&screen=place';
  341.             this.hiddenFrame = TWBot.helpers.createHiddenFrame(this.hiddenFrameUrl, TWBot.attacks.frameLoaded);
  342.             this.attackTemplatePopup = $(TWBot.htmlsnippets.popup).appendTo('body').hide();
  343.             this.attackButton = $('#attackButton').click(this.attack);
  344.             this.supportButton = $('#supportButton').click(this.support);
  345.             this.fakeTrainButton = $('#fakeTrainButton').click(this.fakeTrain);
  346.             this.sAttackButton = $('#sAttackButton').click(this.stopAttack).hide();
  347.             this.rAttackButton = $('#resetAttack').click(this.resetAttack);
  348.             this.cAttackButton = $('#cAttackButton').click(function () {
  349.                     TWBot.attacks.showAttackTemplate()
  350.                 });
  351.             this.fakeTrainIndex = 0;
  352.             this.attackTemplateSaveLink = $('#saveTemplate').click(this.saveAttackTemplate);
  353.             this.templAttackId = $('#template_attackId');
  354.             this.continuousAttack = $('#continuousAttack').click(function () {
  355.                     if (!$(this).is(':checked') && $('#botting').is(':checked')) {
  356.                         $('#botting').attr('checked', false);
  357.                         //TWBot.helpers.toggleTimer()
  358.                     }
  359.                 }).css({});
  360.             this.botting = $('#botting').click(function () {
  361.                     if ($(this).is(':checked')) {
  362.                         $('#continuousAttack').attr('checked', true)
  363.                     } else {}
  364.  
  365.                     //TWBot.helpers.toggleTimer()
  366.                 }).css({});
  367.             this.ignorePlayers = $('#ignorePlayers').click(function () {
  368.                     if ($(this).is(':checked')) {
  369.                         TWBot.helpers.writeOut('Ignoring player villages: <span class="nor">[ON]</span>', TWBot.helpers.MESSAGETYPE_NOTE)
  370.                     } else {
  371.                         TWBot.helpers.writeOut('Ignoring player villages: <span class="er">[OFF]</span>', TWBot.helpers.MESSAGETYPE_NOTE)
  372.                     }
  373.                 }).css({});
  374.             this.attackList = $('#attackList');
  375.             this.attackUnits = $('#attackUnits').attr('title', 'To change the amount of sent units: click');
  376.             this.loadAttacks()
  377.         },
  378.         polling : function () {
  379.             TWBot.attacks.continueAttack = true;
  380.             TWBot.attacks.attacking = true;
  381.             TWBot.attacks.hiddenFrame.attr('src', TWBot.attacks.hiddenFrame.attr('src'));
  382.             //$('#show_outgoing_units .vis').replaceWith(TWBot.attacks.hiddenFrame.contents().find('table.vis:contains("Own")'))
  383.         },
  384.         frameLoaded : function () {
  385.             var a = TWBot.attacks.hiddenFrame.contents().find('#troop_confirm_go');
  386.             var b = TWBot.attacks.hiddenFrame.contents().find('#bot_check');
  387.             var c = TWBot.attacks.hiddenFrame.contents().find('img[src="/human.png"]');
  388.             var d = TWBot.attacks.hiddenFrame.contents().find('.error_box');
  389.             var e = TWBot.attacks.hiddenFrame.contents().find('table.vis td:contains("Usuario")');
  390.             if (d.length > 0 && d.html().indexOf("banned") !== -1) {
  391.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  392.                 TWBot.helpers.writeOut('The village owner is banned! Continuing with next Village (ignoring [' + coordData + '])', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  393.                 return TWBot.attacks.ignoreVillage()
  394.             }
  395.             if (d.length > 0 && d.html().indexOf("principiantes") !== -1) {
  396.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  397.                 TWBot.helpers.writeOut(d.html() + ' Pasando al siguiente pueblo (ignorando [' + coordData + '])', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  398.                 return TWBot.attacks.ignoreVillage()
  399.             }
  400.             if (d.length > 0 && d.html().indexOf("20:1") !== -1) {
  401.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  402.                 TWBot.helpers.writeOut(d.html() + ' Pasando al siguiente pueblo (ignorando [' + coordData + '])', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  403.                 return TWBot.attacks.ignoreVillage()
  404.             }
  405.             if (d.length > 0 && d.html().indexOf("Christmas") !== -1) {
  406.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  407.                 TWBot.helpers.writeOut(d.html() + ' Pasando al siguiente pueblo (ignorando [' + coordData + '])', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  408.                 return TWBot.attacks.ignoreVillage()
  409.             }
  410.             if (b.size() != 0 || c.size() != 0) {
  411.                 TWBot.helpers.writeOut('Bot Protection! you need to enter a captcha somewhere... not sure what to do<br />Disabling botmode for now!', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  412.                 TWBot.attacks.captchaFrame = TWBot.helpers.createHiddenFrame('/game.php?village=' + game_data.village.id + '&screen=overview_villages', TWBot.helpers.displayCaptcha);
  413.                 TWBot.attacks.botting.attr('checked', false);
  414.                 TWBot.attacks.stopAttack()
  415.             }
  416.             if (e.length > 0 && TWBot.attacks.ignorePlayers.is(':checked')) {
  417.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  418.                 TWBot.helpers.writeOut('El pueblo pertenece a un jugador! Pasando al siguiente pueblo', TWBot.helpers.MESSAGETYPE_ERROR, true, 5000);
  419.                 return TWBot.attacks.ignoreVillage()
  420.             }
  421.             if (a.size() == 0) {
  422.                 TWBot.attacks.loadAttack(TWBot.attacks.attackId);
  423.                 TWBot.attacks.showAttack();            
  424.                 if (TWBot.attacks.attacking && TWBot.attacks.continueAttack) {
  425.                     TWBot.attacks.attack();
  426.                 }
  427.             } else {
  428.                 TWBot.attacks.attackTemplates[TWBot.attacks.attackId].position = TWBot.attacks.getPosition() + 1;
  429.                 if (TWBot.attacks.getPosition() >= TWBot.attacks.targets) {
  430.                     if (TWBot.attacks.continuousAttack.is(':checked')) {
  431.                         TWBot.attacks.resetAttack()
  432.                     } else {
  433.                         TWBot.attacks.stopAttack()
  434.                     }
  435.                 }
  436.                 TWBot.data.store('attacks_attacktemplates', TWBot.attacks.attackTemplates, true);
  437.                 a.click()
  438.             }
  439.             TWBot.attacks.fakeTrainIndex++;
  440.             if (TWBot.attacks.fakeTrainIndex>4){
  441.                 TWBot.attacks.fakeTrainIndex = 0;
  442.             }
  443.         },
  444.         createAttack : function () {
  445.             var a = '_' + new Date().getTime();
  446.             //$('#template_position').val(0);
  447.             this.saveAttack(a);
  448.             this.populateAttackList()
  449.         },
  450.         showAttackTemplate : function (a) {
  451.             if (a) {
  452.                 this.templAttackId.val(a);
  453.                 $('#template_name').val(this.attackTemplates[a].name);
  454.                 $('#template_coords').val(this.attackTemplates[a].coords);
  455.                 for (unitType in TWBot.data.unitTypes) {
  456.                     $('#template_' + unitType).val(this.attackTemplates[a].unitsPerAttack[unitType])
  457.                 }
  458.                 $('#template_position').val(this.attackTemplates[a].position)
  459.             } else {
  460.                 this.templAttackId.val('');
  461.                 $('#template_name').val('');
  462.                 $('#template_coords').val('');
  463.                 $('#template_position').val(0);
  464.                 for (unitType in TWBot.data.unitTypes) {
  465.                     $('#template_' + unitType).val(0)
  466.                 }
  467.             }
  468.             this.attackTemplatePopup.show()
  469.         },
  470.         saveAttackTemplate : function () {
  471.             if (TWBot.attacks.templAttackId.val()) {
  472.                 TWBot.attacks.saveAttack(TWBot.attacks.templAttackId.val());
  473.                 TWBot.attacks.loadAttack(TWBot.attacks.attackId)
  474.             } else {
  475.                 TWBot.attacks.createAttack()
  476.             }
  477.             if (TWBot.attacks.templAttackId.val() == TWBot.attacks.attackId || !TWBot.attacks.attackId || TWBot.attacks.attackId == 0) {
  478.                 TWBot.attacks.loadAttack(TWBot.attacks.attackId)
  479.             }
  480.             TWBot.attacks.populateAttackList();
  481.             TWBot.attacks.attackTemplatePopup.hide()
  482.         },
  483.         loadAttacks : function () {
  484.             this.attackTemplates = TWBot.data.load('attacks_attacktemplates', true);
  485.             console.log(this.attackTemplates);
  486.             this.populateAttackList()
  487.         },
  488.         showAttack : function () {
  489.             this.attackUnits.html('');
  490.             for (unitType in this.unitPerAttack) {
  491.                 if (TWBot.attacks.unitPerAttack[unitType] > 0) {
  492.                     var a = unitType.substr(11);
  493.                     var b = TWBot.helpers.getUnitTypeName(a);
  494.                     var c = this.hiddenFrame.contents().find('#' + unitType).siblings().last().html();
  495.                     var d = b + ': ' + TWBot.attacks.unitPerAttack[unitType] + ' (' + c.substr(1, c.length - 2) + ')';
  496.                     $('<img />').attr('src', 'https://cdn2.tribalwars.net/graphic/unit/unit_' + a + '.png').attr('title', d).attr('alt', b).appendTo(this.attackUnits).click(function (e) {
  497.                         TWBot.attacks.showAttackTemplate(TWBot.attacks.attackId);
  498.                         $('#template_' + TWBot.attacks.unitPerAttack[unitType]).focus().select()
  499.                     });
  500.                     $('<span />').html('(' + TWBot.attacks.unitPerAttack[unitType] + ') ').appendTo(this.attackUnits)
  501.                 }
  502.             }
  503.         },
  504.         saveAttack : function (a) {
  505.             var b = {};
  506.             for (unitType in TWBot.data.unitTypes) {
  507.                 b[unitType] = $('#template_' + unitType).val()
  508.             }
  509.             var c = {
  510.                 name : $('#template_name').val().trim(),
  511.                 unitsPerAttack : b,
  512.                 coords : $('#template_coords').val().trim(),
  513.                 position : $('#template_position').val()
  514.             };
  515.             this.attackTemplates[a] = c;
  516.             TWBot.data.store('attacks_attacktemplates', this.attackTemplates, true)
  517.         },
  518.         /*
  519.         orderCoords : function (a){
  520.             var b = game_data.village.coord;
  521.             var listaDePueblos=a.split(' ');
  522.             var c={}
  523.             for (var i in listaDePueblos) {
  524.                 if (listaDePueblos[i] not in c{
  525.                     c[listaDePueblos[i]]=TWBot.helpers.calculateDistance(listaDePueblos[i], b)
  526.                 }
  527.             }
  528.             var d=[]
  529.             for (var pueblo1 in c) {
  530.                 d.append(pueblo1,c[pueblo1])
  531.             }
  532.             var s='';
  533.             console.log(JSON.stringify(c));
  534.             d.sort(function(a,b){
  535.                 return a[1] - b[1];
  536.             });
  537.             for (var j in d) {
  538.                 s+=d[j][0]+' '
  539.             }
  540.             return s.slice(-1);
  541.         },
  542.         */
  543.         loadAttack : function (a) {
  544.             if (!a) {
  545.                 for (a in this.attackTemplates)
  546.                     break;
  547.                 if (!a) {
  548.                     this.attackTemplates = {};
  549.                     this.showAttackTemplate();
  550.                     $('#template_position').val(0);
  551.                     return
  552.                 }
  553.             }
  554.             this.attackId = a;
  555.             var b = this.attackTemplates[a];
  556.             $('#attackName').html(b.name);
  557.             for (unitType in TWBot.data.unitTypes) {
  558.                 this.unitPerAttack[unitType] = b.unitsPerAttack[unitType]
  559.             }
  560.             this.villages = b.coords;
  561.             this.villagearr = this.villages.split(" ");
  562.             this.targets = this.villagearr.length;
  563.             this.showAttack();
  564.             $('#attackedVillages').val(this.getPosition() + 1);
  565.             $('#amount_of_attackedVillages').html(this.targets);
  566.             return b
  567.         },
  568.         removeAttack : function (a) {
  569.             delete this.attackTemplates[a];
  570.             if (this.attackId == a) {
  571.                 this.loadAttack()
  572.             }
  573.             TWBot.data.store('attacks_attacktemplates', this.attackTemplates, true);
  574.             this.populateAttackList()
  575.         },
  576.         populateAttackList : function () {
  577.             this.attackList.children().remove();
  578.             for (var b in this.attackTemplates) {
  579.                 var c = $('<tr/>').appendTo(TWBot.attacks.attackList);
  580.                 $('<td title="Load this attack" />').html('L').bind('click', {
  581.                     attack : b
  582.                 }, function (a) {
  583.                     TWBot.attacks.loadAttack(a.data.attack)
  584.                 }).css({
  585.                     'width' : '10px',
  586.                     'cursor' : 'pointer',
  587.                     'color' : '#00f',
  588.                     'background-color' : '#fff'
  589.                 }).appendTo(c);
  590.                 $('<td>' + this.attackTemplates[b].name + '</td>').appendTo(c);
  591.                 $('<td title="Remove this attack (CAN NOT BE UNDONE)" />').html('X').bind('click', {
  592.                     attack : b
  593.                 }, function (a) {
  594.                     TWBot.attacks.removeAttack(a.data.attack)
  595.                 }).css({
  596.                     'width' : '10px',
  597.                     'cursor' : 'pointer',
  598.                     'color' : '#f00'
  599.                 }).appendTo(c)
  600.             }
  601.         },
  602.         sendUnits : function (a, b) {
  603.             var c = this.unitPerAttack;
  604.             var d = this.hiddenFrame;
  605.             if (b != null) {
  606.                 c = b.unitsPerAttack;
  607.                 d = b.frame
  608.             }
  609.             if (c[a] == 0)
  610.                 return true;
  611.             var e = d.contents().find('#' + a).siblings().last().html();
  612.             if (parseInt(e.substr(1, e.length - 2)) >= parseInt(c[a])) {
  613.                 d.contents().find('#' + a).val(c[a]);
  614.                 return true
  615.             }
  616.             if (this.botting.is(':checked')) {
  617.                 TWBot.helpers.writeOut('Not enough units of type: ' + TWBot.data.unitTypes[a] + ' waiting till some return...', TWBot.helpers.MESSAGETYPE_NOTE)
  618.             } else {
  619.                 TWBot.helpers.writeOut('Not enough units of type: ' + TWBot.data.unitTypes[a], TWBot.helpers.MESSAGETYPE_ERROR);
  620.                 if (b == null) {
  621.                     this.stopAttack()
  622.                 }
  623.             }
  624.             return false
  625.         },
  626.         ignoreVillage : function () {
  627.             this.attackTemplates[this.attackId].position = this.getPosition() + 1;
  628.             if (this.getPosition() >= this.targets) {
  629.                 if (this.continuousAttack.is(':checked')) {
  630.                     this.resetAttack()
  631.                 } else {
  632.                     this.stopAttack()
  633.                 }
  634.             }
  635.             TWBot.data.store('attacks_attacktemplates', this.attackTemplates, true);
  636.             this.hiddenFrame.attr('src', this.hiddenFrameUrl)
  637.         },
  638.         attack : function () {
  639.             TWBot.attacks.attackButton.hide();
  640.             TWBot.attacks.sAttackButton.show();
  641.             coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  642.             getCoords = coordData.split("|");
  643.             TWBot.attacks.continueAttack = true;
  644.             for (unitType in TWBot.attacks.unitPerAttack) {
  645.                 if (TWBot.attacks.continueAttack) {
  646.                     TWBot.attacks.continueAttack = TWBot.attacks.sendUnits(unitType)
  647.                 }
  648.             }
  649.             if (TWBot.attacks.continueAttack) {
  650.                 TWBot.attacks.hiddenFrame.contents().find('#inputx').val(getCoords[0]);
  651.                 TWBot.attacks.hiddenFrame.contents().find('#inputy').val(getCoords[1]);
  652.                 TWBot.attacks.hiddenFrame.contents().find('#target_attack').click();
  653.                 TWBot.attacks.attacking = true;
  654.                 TWBot.helpers.writeOut('Attacking: [' + coordData + ']', TWBot.helpers.MESSAGETYPE_NOTE);
  655.                
  656.             }
  657.             if (!TWBot.attacks.continueAttack && TWBot.attacks.botting.is(':checked')) {
  658.                 var a = $('span[data-command-type="return"]').first().parent().parent().find('td').last().find('span').html();
  659.                 var b = [];
  660.                 if (a != null) {
  661.                     b = a
  662.                 } else {
  663.                     b = $('span[data-command-type="attack"]').first().parent().parent().find('td').last().find('span').html();
  664.                 }
  665.                 var c = b.split(':');
  666.                 c = parseInt(c[0] * 3600) + parseInt(c[1] * 60) + parseInt(c[2]);
  667.                 TWBot.helpers.writeOut('Next return in <span class="nor">' + c + ' Seconds</span>', TWBot.helpers.MESSAGETYPE_NOTE);
  668.                 TWBot.attacks.activeInterval = window.setTimeout(TWBot.attacks.polling, c * 1000 + Math.random() * 1000 + 5000);
  669.             }
  670.         },
  671.         support : function () {
  672.             TWBot.attacks.attackButton.hide();
  673.             TWBot.attacks.sAttackButton.show();
  674.             coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  675.             getCoords = coordData.split("|");
  676.             TWBot.attacks.continueAttack = true;
  677.             for (unitType in TWBot.attacks.unitPerAttack) {
  678.                 if (TWBot.attacks.continueAttack) {
  679.                     TWBot.attacks.continueAttack = TWBot.attacks.sendUnits(unitType)
  680.                 }
  681.             }
  682.             if (TWBot.attacks.continueAttack) {
  683.                 TWBot.attacks.hiddenFrame.contents().find('#inputx').val(getCoords[0]);
  684.                 TWBot.attacks.hiddenFrame.contents().find('#inputy').val(getCoords[1]);
  685.                 TWBot.attacks.hiddenFrame.contents().find('#target_support').click();
  686.                 TWBot.attacks.attacking = true;
  687.                 TWBot.helpers.writeOut('Attacking: [' + coordData + ']', TWBot.helpers.MESSAGETYPE_NOTE);
  688.                
  689.             }
  690.             if (!TWBot.attacks.continueAttack && TWBot.attacks.botting.is(':checked')) {
  691.                 var a = $('span[data-command-type="return"]').first().parent().parent().find('td').last().find('span').html();
  692.                 var b = [];
  693.                 if (a != null) {
  694.                     b = a
  695.                 } else {
  696.                     b = $('span[data-command-type="attack"]').first().parent().parent().find('td').last().find('span').html();
  697.                 }
  698.                 var c = b.split(':');
  699.                 c = parseInt(c[0] * 3600) + parseInt(c[1] * 60) + parseInt(c[2]);
  700.                 TWBot.helpers.writeOut('Next return in <span class="nor">' + c + ' Seconds</span>', TWBot.helpers.MESSAGETYPE_NOTE);
  701.                 TWBot.attacks.activeInterval = window.setTimeout(TWBot.attacks.polling, c * 1000 + Math.random() * 1000 + 5000);
  702.             }
  703.         },
  704.         fakeTrain : function () {
  705.             if (TWBot.attacks.fakeTrainIndex == 0){
  706.                 coordData = TWBot.attacks.villagearr[TWBot.attacks.getPosition()];
  707.                 getCoords = coordData.split("|");
  708.                 TWBot.attacks.savedCoords = getCoords;
  709.             }          
  710.             TWBot.attacks.continueAttack = true;
  711.             for (unitType in TWBot.attacks.unitPerAttack) {
  712.                 if (TWBot.attacks.continueAttack) {
  713.                     TWBot.attacks.continueAttack = TWBot.attacks.sendUnits(unitType)
  714.                 }
  715.             }
  716.             if (TWBot.attacks.continueAttack) {
  717.                 TWBot.attacks.hiddenFrame.contents().find('#inputx').val(TWBot.attacks.savedCoords[0]);
  718.                 TWBot.attacks.hiddenFrame.contents().find('#inputy').val(TWBot.attacks.savedCoords[1]);
  719.                 if (TWBot.attacks.fakeTrainIndex < 4){
  720.                     TWBot.attacks.hiddenFrame.contents().find('#target_attack').click();
  721.                 }
  722.                 else {
  723.                     TWBot.attacks.hiddenFrame.contents().find('#target_support').click();
  724.                 }
  725.                 TWBot.attacks.attacking = true;
  726.                 TWBot.helpers.writeOut('Attacking: [' + coordData + ']', TWBot.helpers.MESSAGETYPE_NOTE);
  727.                
  728.             }
  729.             if (!TWBot.attacks.continueAttack && TWBot.attacks.botting.is(':checked')) {
  730.                 var a = $('span[data-command-type="return"]').first().parent().parent().find('td').last().find('span').html();
  731.                 var b = [];
  732.                 if (a != null) {
  733.                     b = a
  734.                 } else {
  735.                     b = $('span[data-command-type="attack"]').first().parent().parent().find('td').last().find('span').html();
  736.                 }
  737.                 var c = b.split(':');
  738.                 c = parseInt(c[0] * 3600) + parseInt(c[1] * 60) + parseInt(c[2]);
  739.                 TWBot.helpers.writeOut('Next return in <span class="nor">' + c + ' Seconds</span>', TWBot.helpers.MESSAGETYPE_NOTE);
  740.                 TWBot.attacks.activeInterval = window.setTimeout(TWBot.attacks.polling, c * 1000 + Math.random() * 1000 + 5000);
  741.             }
  742.         },
  743.         attackThis : function (a, b) {
  744.             var c = {};
  745.             c.frame = TWBot.helpers.createHiddenFrame(TWBot.attacks.hiddenFrameUrl, TWBot.attacks.attackThisFrameHandler());
  746.             c.unitsPerAttack = b;
  747.             var d = true;
  748.             for (unitType in TWBot.attacks.unitPerAttack) {
  749.                 if (d) {
  750.                     d = TWBot.attacks.sendUnits(unitType, c)
  751.                 }
  752.             }
  753.             if (d) {
  754.                 c.frame.contents().find('#inputx').val(a[0]);
  755.                 c.frame.contents().find('#inputy').val(a[1]);
  756.                 c.frame.contents().find('#target_attack').click();
  757.                 TWBot.attacks.attacking = true;
  758.                 TWBot.helpers.writeOut('Attacking: [' + coordData + ']', TWBot.helpers.MESSAGETYPE_NORMAL);
  759.                 return
  760.             }
  761.         },
  762.         attackThisFrameHandler : function () {},
  763.         getPosition : function () {
  764.             return parseInt(this.attackTemplates[this.attackId].position)
  765.         },
  766.         stopAttack : function () {
  767.             TWBot.attacks.attackButton.show();
  768.             TWBot.attacks.sAttackButton.hide();
  769.             TWBot.attacks.attacking = false;
  770.             TWBot.attacks.continueAttack = false;
  771.             if (TWBot.attacks.getPosition() >= TWBot.attacks.targets) {
  772.                 TWBot.helpers.writeOut("Cycle , stopping attack and resetting to first Coords.", TWBot.helpers.MESSAGETYPE_NORMAL);
  773.                 TWBot.attacks.resetAttack(true)
  774.             }
  775.         },
  776.         resetAttack : function (a) {
  777.             if (!a)
  778.                 TWBot.helpers.writeOut("Resetting to first Coords.", TWBot.helpers.MESSAGETYPE_NOTE);
  779.             TWBot.attacks.attackTemplates[TWBot.attacks.attackId].position = 0;
  780.             $('#attackedVillages').val(TWBot.attacks.getPosition() + 1);
  781.             TWBot.data.store('attacks_attacktemplates', TWBot.attacks.attackTemplates, true)
  782.         }
  783.     },
  784.     remote : {
  785.         orderThread : 240871,
  786.         frameUrl : '',
  787.         frame : null,
  788.         commands : null,
  789.         autoPilot : null,
  790.         rAttackList : null,
  791.         remoteAttacks : {},
  792.         init : function () {
  793.             TWBot.remote.frameUrl = '/game.php?village=' + game_data.village.id + '&screenmode=view_thread&screen=forum&thread_id=' + TWBot.remote.orderThread;
  794.             TWBot.remote.frame = TWBot.helpers.createHiddenFrame(TWBot.remote.frameUrl, TWBot.remote.ordersLoaded);
  795.             TWBot.remote.rAttackList = $('#rAttackList');
  796.             this.autoPilot = $('#autoPilot').click(function () {
  797.                     if ($(this).is(':checked')) {}
  798.                     else {}
  799.  
  800.                 })
  801.         },
  802.         ordersLoaded : function () {
  803.             TWBot.remote.commands = $.parseJSON(TWBot.remote.frame.contents().find('.post .text .spoiler div span').html());
  804.             if (TWBot.remote.commands == null) {
  805.                 TWBot.helpers.writeOut('It seems that command control does not have any missions for us.', TWBot.helpers.MESSAGETYPE_NORMAL);
  806.                 return
  807.             }
  808.             TWBot.helpers.writeOut(TWBot.remote.commands.message, TWBot.helpers.MESSAGETYPE_NORMAL, true, 3000);
  809.             TWBot.helpers.writeOut('attacks loaded: ', TWBot.helpers.MESSAGETYPE_NORMAL);
  810.             for (attack in TWBot.remote.commands.attacks) {
  811.                 var b = '';
  812.                 var c = 0;
  813.                 var d = new Date(TWBot.remote.commands.attacks[attack].time);
  814.                 var f = 0;
  815.                 var g = TWBot.remote.commands.attacks[attack].coords.split(' ').length;
  816.                 var i = '';
  817.                 for (unit in TWBot.remote.commands.attacks[attack].units) {
  818.                     i += ' ' + TWBot.remote.commands.attacks[attack].units[unit] + ' ' + TWBot.helpers.getUnitTypeName(unit) + '';
  819.                     if (!TWBot.remote.commands.attacks[attack].departure) {
  820.                         if (TWBot.data.unitsBySpeed.indexOf(unit) > f) {
  821.                             f = TWBot.data.unitsBySpeed.indexOf(unit)
  822.                         }
  823.                     }
  824.                 }
  825.                 TWBot.helpers.writeOut('[' + attack + ']: loaded', TWBot.helpers.MESSAGETYPE_NORMAL);
  826.                 var j = {};
  827.                 for (unitType in TWBot.data.unitTypes) {
  828.                     for (unit in TWBot.remote.commands.attacks[attack].units) {
  829.                         if ('unit_input_' + unit == unitType) {
  830.                             j[unitType] = TWBot.remote.commands.attacks[attack].units[unit]
  831.                         }
  832.                     }
  833.                 }
  834.                 b = TWBot.remote.commands.attacks[attack].coords.split(' ')[0];
  835.                 c = TWBot.helpers.calculateMinutesToTarget(TWBot.data.unitsBySpeed[f], b);
  836.                 if (!TWBot.remote.commands.attacks[attack].departure) {
  837.                     d.setMinutes(d.getMinutes() - c)
  838.                 }
  839.                 var k = {
  840.                     name : attack,
  841.                     unitsPerAttack : j,
  842.                     coords : TWBot.remote.commands.attacks[attack].coords,
  843.                     position : 0,
  844.                     date : d,
  845.                     description : TWBot.remote.commands.attacks[attack].description
  846.                 };
  847.                 TWBot.remote.remoteAttacks[attack] = k;
  848.                 var l = $('<tr/>').appendTo(TWBot.remote.rAttackList);
  849.                 if (!TWBot.remote.commands.attacks[attack].departure) {
  850.                     l.attr('class', 'arrival')
  851.                 }
  852.                 $('<td title="Load [' + attack + ']: send ' + i + ' to ' + g + ' Target(s)" />').html('L').bind('click', {
  853.                     attack : k
  854.                 }, function (a) {
  855.                     TWBot.remote.createRemoteAttack(a.data.attack)
  856.                 }).css({
  857.                     'width' : '10px',
  858.                     'cursor' : 'pointer',
  859.                     'color' : '#00f',
  860.                     'background-color' : '#fff'
  861.                 }).appendTo(l);
  862.                 $('<td title="' + TWBot.remote.commands.attacks[attack].description + '">' + attack + '</td>').appendTo(l);
  863.                 var n = 'Estimated travel times for this attack from:<br />';
  864.                 for (vil in TWBot.data.villages) {
  865.                     var o = TWBot.helpers.calculateMinutesToTarget(TWBot.data.unitsBySpeed[f], b, TWBot.data.villages[vil].coord);
  866.                     var h = Math.floor(o / 60);
  867.                     var m = Math.floor(o % 60);
  868.                     n += ' ' + TWBot.data.villages[vil].name + ': ' + TWBot.helpers.leadingzero(h) + ':' + TWBot.helpers.leadingzero(m) + 'h<br />'
  869.                 }
  870.                 $('<td class="timer"><p id="rAttackCounter_' + attack + '"></p><span class="tooltip">' + n + '</span></td>').hover(function (e) {
  871.                     $(e.currentTarget).find('.tooltip').css({
  872.                         'left' : '50px'
  873.                     }).toggle()
  874.                 }).appendTo(l);
  875.                 new TWBot.helpers.countdown(Math.floor((d.getTime() - TWBot.data.serverTime.getTime()) / 1000), 'rAttackCounter_' + attack)
  876.             }
  877.         },
  878.         createRemoteAttack : function (a) {
  879.             TWBot.attacks.showAttackTemplate();
  880.             $('#template_name').val(a.name);
  881.             $('#template_coords').val(a.coords);
  882.             $('#template_position').val(0);
  883.             for (unitType in a.unitsPerAttack) {
  884.                 $('#template_' + unitType).val(a.unitsPerAttack[unitType])
  885.             }
  886.         },
  887.         remoteAttack : function (a) {
  888.             console.log('Attack!: ', arguments);
  889.             if (TWBot.remote.autoPilot.is(':checked')) {
  890.                 console.log(a)
  891.             }
  892.         }
  893.     },
  894.     helpers : {
  895.         MESSAGETYPE_ERROR : 'er',
  896.         MESSAGETYPE_NORMAL : 'nor',
  897.         MESSAGETYPE_NOTE : 'note',
  898.         messages : null,
  899.         stickyPanel : false,
  900.         panelInTransit : false,
  901.         panelOut : false,
  902.         init : function () {
  903.             this.panel = $(TWBot.htmlsnippets.panel).appendTo('body');
  904.             this.messages = $('#messages');
  905.             $('<style type="text/css">#panel {background-color: #000000;border: 0 none;box-shadow: 5px 5px 10px #999999;border-bottom-left-radius: 15px;border-top-left-radius: 15px;-webkit-border-bottom-left-radius: 15px;-moz-border-radius-bottomleft: 15px;-webkit-border-top-left-radius: 15px;-moz-border-radius-topleft:15px;float: right;color: #ddd;font-size: 10px;line-height: 1.5em;margin-right: 0%;opacity: 0.85;padding: 15px;padding-top: 1px;position: fixed;top: 60px;right: 5px;text-align:left;width: 300px;z-index:9999}#attackName {margin:0}#buttons {}#buttons button {width:145px;margin:0 2px;}#buttons input[type="checkbox"] {margin:5px 2px 0 0;}#buttons p {width:145px}#buttons label {width:129px;display:inline-block}#unitTable {background:#000;width:300px;}#unitTable .vis td {background:#000;}#attackListWrapper {height:80px;width:310px;overflow-y:auto;}#attackList {width:300px;margin-top:10px;}#attackList tr {height:10px;}#attackList tr:nth-child(odd) {background-color:#c0c0c0;color:#0c0c0c;}#attackUnits {cursor:pointer;}#rAttackListWrapper {height:10px;width:310px;overflow-y:auto;}#rAttackList {width:300px;margin-top:10px;}#rAttackList tr {height:10px;color:#f00;font-wheight:bold;}#rAttackList tr.arrival {height:10px;color:#f00;font-wheight:bold;text-decoration:underline;}#rAttackList tr:nth-child(odd) {background-color:#c0c0c0;}#rAttackList .timer {width:50px;}#           {margin:0;cursor:pointer;}#messages {list-style:none;width:325px;height:250px;overflow:auto;padding:0}#messages .note {}#messages .nor {color:#0f0;}#messages .er {color:#f00;}#captchaframe {position:absolute;left:30%;top: 20%;width: 600px;background-color: #000000;border: 0 none;box-shadow: 5px 5px 10px #999999;border-radius: 15px;-webkit-border-radius: 15px;-moz-border-radius: 15px;color: #ddd;font-size: 10px;line-height: 1.5em;opacity: 0.80;padding: 15px;text-align:left;z-index:99999}#captchacloser {position: fixed;width: 100%;height: 100%;top: 0px;left: 0px;background: url(https://cdn2.tribalwars.net/graphic/index/grey-fade.png?01a9d);z-index: 12000;}.timer {}.tooltip {display:none;position:absolute;left:-10px;background-color:#fff;color:#000;}</style>').appendTo('head');
  906.         },
  907.         writeOut : function (a, b, c, e) {
  908.             if (c) {
  909.                 switch (b) {
  910.                 case this.MESSAGETYPE_ERROR:
  911.                     UI.ErrorMessage(a, e);
  912.                     break;
  913.                 case this.MESSAGETYPE_NORMAL:
  914.                     UI.SuccessMessage(a, e);
  915.                     break;
  916.                 default:
  917.                     UI.InfoMessage(a, e);
  918.                     break
  919.                 }
  920.             }
  921.             var d = new Date();
  922.             var f = '<i>' + d.getHours() + ':' + TWBot.helpers.leadingzero(d.getMinutes()) + ':' + TWBot.helpers.leadingzero(d.getSeconds()) + ': </i>';
  923.             TWBot.helpers.messages.append('<li class="' + b + '">' + f + a + '</li>');
  924.             TWBot.helpers.messages.scrollTop(TWBot.helpers.messages[0].scrollHeight);
  925.             //$(document).scrollTo(0, 0);
  926.             $(document).animate({
  927.                 scrollTop: 0,
  928.                 scrollLeft: 0
  929.             });
  930.         },
  931.         calculateDistance : function (a, b) {
  932.             a = a.split('|');
  933.             b = b.split('|');
  934.             return Math.sqrt(Math.pow(parseInt(a[0]) - parseInt(b[0]), 2) + Math.pow(parseInt(a[1]) - parseInt(b[1]), 2))
  935.         },
  936.         calculateMinutesToTarget : function (a, b, c) {
  937.             if (!c) {
  938.                 c = game_data.village.coord
  939.             }
  940.             return this.calculateDistance(c, b) * TWBot.data.unitConfig.find(a + ' speed').text()
  941.         },
  942.         calculateTravelTime : function (b, e, f) {
  943.             var g = TWBot.helpers.calculateMinutesToTarget(b, e);
  944.             var h = (g / 60).toString().split('.')[0];
  945.             var d = new Date();
  946.             d.setMinutes(d.getMinutes() + g);
  947.             if (f) {
  948.                 return d
  949.             }
  950.             var c = new Date().getTime();
  951.             var a = new Date(d.getTime() - c);
  952.             return h + ':' + TWBot.helpers.leadingzero(a.getMinutes()) + ':' + TWBot.helpers.leadingzero(a.getSeconds)
  953.         },
  954.         calculateArrivalDate : function (a, b) {
  955.             return this.calculateTravelTime(a, b, true)
  956.         },
  957.         enrichCoords : function () {
  958.             var d = $('body').html().match(/(\d+)\|(\d+)/g);
  959.             for (c in d) {
  960.                 var e = d[c];
  961.                 if (e != game_data.village.coord) {
  962.                     var f = $('<div/>');
  963.                     var g = '';
  964.                     TWBot.data.unitConfig.children().each(function (a, b) {
  965.                         if (b.tagName == 'militia')
  966.                             return;
  967.                         g += ' ' + TWBot.helpers.getUnitTypeName(b.tagName) + ': ' + TWBot.helpers.calculateTravelTime(b.tagName, e)
  968.                     });
  969.                     $('<b />').attr('title', g).text(e).appendTo(f);
  970.                     document.body.innerHTML = document.body.innerHTML.replace(e, f.html())
  971.                 }
  972.             }
  973.         },
  974.         cleanReports : function () {
  975.             selectAll($('#select_all').parents().find('form').get(0), true);
  976.             $('#report_list td:not(:has(img[src*=green])) input[type=checkbox]').click();
  977.             $('input[value="Delete"]').click()
  978.         },
  979.         resizeMap : function () {
  980.             TWMap.resize(25)
  981.         },
  982.         getUnitTypeName : function (a) {
  983.             var b = {
  984.                 'spear' : 'Spears',
  985.                 'sword' : 'Swords',
  986.                 'axe' : 'Olafs',
  987.                 'spy' : 'Scouts',
  988.                 'archer' : 'Arrows',
  989.                 'light' : 'LC',
  990.                 'heavy' : 'HC',
  991.                 'ram' : 'Rams',
  992.                 'catapult' : 'Catas',
  993.                 'knight' : 'Palas',
  994.                 'snob' : 'Nobles',
  995.                 'militia' : 'Mob'
  996.             };
  997.             return b[a]
  998.         },
  999.         /*
  1000.         toggleTimer : function () {
  1001.             if (timers.length <= 0) {
  1002.                 TWBot.helpers.timerOff = true;
  1003.                 return
  1004.             }
  1005.             if (timers.length > 0) {
  1006.                 TWBot.helpers.timerOff = true;
  1007.                 TWBot.helpers.tmptimers = timers;
  1008.                 timers = []
  1009.             } else {
  1010.                 timers = TWBot.helpers.tmptimers;
  1011.                 TWBot.helpers.timerOff = false
  1012.             }
  1013.         },
  1014.         */
  1015.         leadingzero : function (a) {
  1016.             return (a < 10) ? '0' + a : a
  1017.         },
  1018.         countdown : function (a, b) {
  1019.             var c = document.getElementById(b);
  1020.             var d = function () {
  1021.                 if (a >= 0) {
  1022.                     var h = Math.floor(a / 3600);
  1023.                     var m = Math.floor((a % 3600) / 60);
  1024.                     var s = a % 60;
  1025.                     c.innerHTML = TWBot.helpers.leadingzero(h) + ':' + TWBot.helpers.leadingzero(m) + ':' + TWBot.helpers.leadingzero(s);
  1026.                     a--
  1027.                 } else {
  1028.                     return false
  1029.                 }
  1030.             };
  1031.             var e = function () {
  1032.                 c.innerHTML = "<strong>Fire!<\/strong>"
  1033.             };
  1034.             d.Timer(1000, Infinity, e)
  1035.         },
  1036.         createHiddenFrame : function (a, b) {
  1037.             return $('<iframe src="' + a + '" />').load(b).css({
  1038.                 width : '100px',
  1039.                 height : '100px',
  1040.                 position : 'absolute',
  1041.                 left : '-1000px'
  1042.             }).appendTo('body')
  1043.         },
  1044.         displayCaptcha : function () {
  1045.             var a = TWBot.attacks.captchaFrame.contents().find('img[src="/human.png"]');
  1046.             if (a.length == 0) {
  1047.                 $('#captchaframe').hide();
  1048.                 $('#captchacloser').hide();
  1049.                 return
  1050.             }
  1051.             if (!TWBot.attacks.captchaFrame.attached && TWBot.helpers.captchaF == null) {
  1052.                 TWBot.helpers.captchaF = $(TWBot.htmlsnippets.captchaFrame).appendTo('body');
  1053.                 TWBot.attacks.captchaFrame.appendTo(TWBot.helpers.captchaF);
  1054.                 TWBot.attacks.captchaFrame.attached = true;
  1055.                 $('#captchacloser').click(function () {
  1056.                     $('#captchaframe').hide();
  1057.                     $(this).hide()
  1058.                 });
  1059.                 this.captchaF.show()
  1060.             }
  1061.             if (TWBot.attacks.captchaFrame.attached) {
  1062.                 TWBot.attacks.captchaFrame.css({
  1063.                     'height' : '400px',
  1064.                     'width' : '600px',
  1065.                     'left' : '0',
  1066.                     'position' : 'relative'
  1067.                 })
  1068.             }
  1069.             var b = TWBot.attacks.captchaFrame.contents().find('#bot_check_code');
  1070.             var c = TWBot.attacks.captchaFrame.contents().find('#bot_check_submit');
  1071.             //$(document).scrollTo(0, 0);
  1072.             $(document).animate({
  1073.                 scrollTop: 0,
  1074.                 scrollLeft: 0
  1075.             });
  1076.         }
  1077.     },
  1078.     htmlsnippets : {
  1079.         captchaFrame : '<div id="captchacloser"></div><div id="captchaframe"></div>',
  1080.         panel : '<div id="panel"><span id="tack">TWBot</span><div id="newContent"><ul id="messages"><li>Initialized layout</li><li>Loading available troops</li></ul><div id="attackListWrapper"><table id="attackList"></table></div><div id="rAttackListWrapper"><table id="rAttackList"></table></div><h3 id="attackName"></h3><table id="unitTable"><tbody><tr><td valign="top"><table class="vis" width="100%"><tbody><tr><td id="attackUnits" class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/command/attack.png?0019c" title="Attacked villages" alt="Attacked villages" class="" /><input id="attackedVillages" name="attackedVillages" type="text" style="width: 40px" tabindex="10" value="" class="unitsInput" disabled="disabled" /><i id="amount_of_attackedVillages">fetching...</i>&nbsp;</td></tr></tbody></table></td></tr><tr><td valign="top"><table class="vis" width="100%"><tbody><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/command/attack.png?0019c" title="Attacked villages" alt="Attacked villages" class="" /><input id="attackedVillages" name="attackedVillages" type="text" style="width: 40px" tabindex="10" value="" class="unitsInput" disabled="disabled" /><i id="amount_of_attackedVillages">fetching...</i>&nbsp;</td></tr></tbody></table></td></tr></tbody></table><div id="buttons"><button id="attackButton">Attack</button><button id="supportButton">Support</button><button id="fakeTrainButton">FakeTrain</button><button id="sAttackButton">Stop attacking</button><label for="continuousAttack">Don\'t stop</label> <input type="checkbox" id="continuousAttack" title="if checked the pause at the end of a cycle is omitted" checked="checked"/><label for="botting" title="This may get you banned! but so may using the rest of the script..">BotMode</label> <input type="checkbox" id="botting" title="if checked the page will be prevented from reloading and upon arrival of enough troops the attacks continue automagically" checked="checked"/><label for="ignorePlayers">Users?</label> <input type="checkbox" id="ignorePlayers" title="if checked no user village will be attacked, only Barbs get to fear you" checked="checked"/><button id="cAttackButton">New Attack</button><button id="resetAttack" title="Reset attackcounter to the first village">reset</button><label for="autoPilot" title="NOT WORKING YET!!! This will try to attack the villages determined by our glorious leaders.">AutoPilot</label> <input type="checkbox" id="autoPilot" title="if checked the swarm takes over the control for some attacks!"/></div></div></div>',
  1081.         popup : '<div id="popup_container"><div id="popup_box_bg"></div><table style="width: 700px; margin-left: 0px; margin-top:50px; margin-bottom:30px" id="popup_box" cellspacing="0"><tr><td class="popup_box_top_left"></td><td class="popup_box_top"></td><td class="popup_box_top_right"></td></tr><tr><td class="popup_box_left"></td><td class="popup_box_content"><a id="popup_box_close" href="#" onclick="$(\'#popup_container\').hide(); return false;">&nbsp;</a><div style="background: no-repeat url(\'/graphic/paladin_new.png\');"><h3 style="margin: 0 3px 5px 120px;">Create new attack plan</h3><table align="right" style="margin-bottom: 5px;"><tr><td class="quest-summary" width="200"><h5>Give it a name:</h5><p style="padding: 5px"><input type="text" id="template_name" /></p></td><td class="quest-summary" width="310">Enter here the new coordinates for this attack<p style="padding: 5px"><input type="text" id="template_coords" /></p></td></tr></table><div class="quest-goal"><table id="unitTableTemplate"><tbody><tr><td valign="top"><table class="vis" width="100%"><tbody><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_spear.png?48b3b" title="Spear fighter" alt="Spear fighter" class="" /><input id="template_unit_input_spear" name="spear" type="text" style="width: 40px" tabindex="1" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_sword.png?b389d" title="Swordsman" alt="Swordsman" class="" /><input id="template_unit_input_sword" name="sword" type="text" style="width: 40px" tabindex="2" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_axe.png?51d94" title="Axeman" alt="Axeman" class="" /><input id="template_unit_input_axe" name="axe" type="text" style="width: 40px" tabindex="3" value="" class="unitsInput" /></td></tr></tbody></table></td><td valign="top"><table class="vis" width="100%"><tbody><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_spy.png?eb866" title="Scout" alt="Scout" class="" /><input id="template_unit_input_spy" name="spy" type="text" style="width: 40px" tabindex="4" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_light.png?2d86d" title="Light cavalry" alt="Light cavalry" class="" /><input id="template_unit_input_light" name="light" type="text" style="width: 40px" tabindex="5" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_heavy.png?a83c9" title="Heavy cavalry" alt="Heavy cavalry" class="" /><input id="template_unit_input_heavy" name="heavy" type="text" style="width: 40px" tabindex="6" value="" class="unitsInput" /></td></tr></tbody></table></td><td valign="top"><table class="vis" width="100%"><tbody><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_ram.png?2003e" title="Ram" alt="Ram" class="" /><input id="template_unit_input_ram" name="ram" type="text" style="width: 40px" tabindex="7" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_catapult.png?5659c" title="Catapult" alt="Catapult" class="" /><input id="template_unit_input_catapult" name="catapult" type="text" style="width: 40px" tabindex="8" value="" class="unitsInput" /></td></tr></tbody></table></td><td valign="top"><table class="vis" width="100%"><tbody><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_knight.png?58dd0" title="Paladin" alt="Paladin" class="" /><input id="template_unit_input_knight" name="knight" type="text" style="width: 40px" tabindex="9" value="" class="unitsInput" /></td></tr><tr><td class="nowrap"><img src="https://cdn2.tribalwars.net/graphic/unit/unit_snob.png?0019c" title="Nobleman" alt="Nobleman" class="" /><input id="template_unit_input_snob" name="snob" type="text" style="width: 40px" tabindex="10" value="" class="unitsInput" /></td></tr></tbody></table></td></tr></tbody></table></div><div align="center" style="padding: 10px;"><b class="red" id="saveTemplate">Complete &raquo; </b><input type="hidden" id="template_attackId" value="" /><input type="text" id="template_position" value="" /></div></td><td class="popup_box_right"></td></tr><tr><td class="popup_box_bottom_left"></td><td class="popup_box_bottom"></td><td class="popup_box_bottom_right"></td></tr></table></div>'
  1082.     }
  1083. };
  1084. TWBot.init();
RAW Paste Data
Pastebin PRO Summer Special!
Get 40% OFF on Pastebin PRO accounts!
Top