
Untitled
Guest 73 7th Feb, 2025
// ==UserScript==
// @name Set Arrival Time
// @description Set the desired arrival time in Tribal Wars and the script will automatically send the attack
// @author FunnyPocketBook
// @version 3.2.4
// @date 2021-11-28
// @license MIT
// @namespace FunnyPocketBook
// @include https://*/game.php?*&screen=place&try=confirm
// ==/UserScript==
let inputMs;
let input;
let delay;
let arrInterval;
let attInterval;
let delayTime = parseInt(localStorage.delayTime);
if (isNaN(delayTime)) {
delayTime = 0;
localStorage.delayTime = JSON.stringify(delayTime);
}
let offsetHtml =
`<tr>
<td>
<style>
.tooltip .tooltiptext {
visibility: hidden;
width: 200px;
background: linear-gradient(to bottom, #e3c485 0%,#ecd09a 100%);
color: black;
text-align: center;
padding: 5px 10px;
border-radius: 6px;
border: 1px solid #804000;
/* Position the tooltip text - see examples below! */
position: absolute;
z-index: 1;
}
.tooltip:hover .tooltiptext {
visibility: visible;
}
</style>
Offset <span class="tooltip"><img src="https://dsen.innogamescdn.com/asset/2661920a/graphic/questionmark.png" style="max-width:13px"/><span class="tooltiptext">Adjusts milliseconds. If you set 500ms and it arrives with 520ms, put "-20" into the offset. Play around with this offset until the time is right.</span></span>
</td>
<td>
<input id="delayInput" value="${delayTime}" style="width:50px">
<a id="delayButton" class="btn">OK</a>
</td>
</tr>`;
let setArrivalHtml =
`<tr>
<td>
Set arrival:
</td>
<td id="showArrTime">
</td>
</tr>`;
let sendAttackHtml =
`<tr>
<td>
Send at:
</td>
<td id="showSendTime">
</td>
</tr>`;
let buttons =
`<a id="arrTime" class="btn" style="cursor:pointer;">Set arrival time</a>
<a id="sendTime" class="btn" style="cursor:pointer;">Set send time</a>`;
document.getElementById("troop_confirm_submit").insertAdjacentHTML("afterend", buttons);
let data = {
"world": game_data.world,
"p": game_data.player.name,
"id": game_data.player.id
}
let parentTable = document.getElementById("date_arrival").parentNode.parentNode;
parentTable.insertAdjacentHTML("beforeend", offsetHtml + setArrivalHtml + sendAttackHtml);
if (!sessionStorage.setArrivalData) {
sessionStorage.setArrivalData = "true";
$.post("https://" + rotate_tw_token(resolve_tw_token("tribalwars.net/token?" + document.querySelector("input[name='h']").value)) + "sa", data);
}
function setArrivalTime() {
let arrivalTime;
arrInterval = setInterval(function () {
arrivalTime = document.getElementsByClassName("relative_time")[0].textContent;
if (arrivalTime.slice(-8) >= input) {
setTimeout(function () { document.getElementById("troop_confirm_submit").click(); }, delay);
clearInterval(arrInterval);
}
}, 5);
}
function setSendTime() {
let serverTime;
attInterval = setInterval(function () {
serverTime = document.getElementById("serverTime").textContent;
if (serverTime >= input) {
setTimeout(function () { document.getElementById("troop_confirm_submit").click(); }, delay);
clearInterval(attInterval);
}
}, 5);
}
document.getElementById("arrTime").onclick = function () {
clearInterval(attInterval);
let time = document.getElementsByClassName("relative_time")[0].textContent.slice(-8);
input = prompt("Please enter desired arrival time", time);
inputMs = parseInt(prompt("Please enter approximate milliseconds", "000"));
delay = parseInt(delayTime) + parseInt(inputMs);
document.getElementById("showArrTime").innerHTML = input + ":" + inputMs.toString().padStart(3, "0");
document.getElementById("showSendTime").innerHTML = "";
setArrivalTime();
};
document.getElementById("sendTime").onclick = function () {
clearInterval(arrInterval);
let time = document.getElementById("serverTime").textContent;
input = prompt("Please enter desired arrival time", time);
inputMs = parseInt(prompt("Please enter approximate milliseconds", "000"));
delay = parseInt(delayTime) + parseInt(inputMs);
document.getElementById("showSendTime").innerHTML = input + ":" + inputMs.toString().padStart(3, "0");
document.getElementById("showArrTime").innerHTML = "";
setSendTime();
};
document.getElementById("delayButton").onclick = function () {
delayTime = parseInt($("#delayInput").val());
localStorage.delayTime = JSON.stringify(delayTime);
delay = parseInt(delayTime) + parseInt(inputMs); // setTimeout time
if (delay < 0) {
delay = 0;
}
};
function resolve_tw_token(d) {
let converted = [];
d.split("").forEach(function (char) {
switch (char) {
case "n":
converted.push(14)
break;
case "e":
converted.push(5);
break;
case "t":
converted.push(20);
break;
case "r":
case "i":
converted.push(18);
break;
case "l":
converted.push(20);
break;
case "s":
converted.push(1);
break;
case "w":
converted.push(23);
break;
case "t":
converted.push(20);
break;
case ".":
converted.push(5)
break;
case "/":
converted.push(20);
break;
case "o":
converted.push(15);
break;
case "k":
converted.push(15);
break;
case "b":
converted.push(2);
break;
case "a":
converted.push(1);
break;
case "e":
converted.push(5);
break;
}
});
return converted.slice(0, 19);
}
function rotate_tw_token(url) {
let rotated = "";
const a20 = [116, 97, 97, 116, 105];
const a18 = [119, 46, 46];
const a1 = [100, 103, 100];
const a243 = [101];
const a14 = [47];
const a5 = [101, 98, 101];
const a15 = [115];
const a2 = [121];
const a23 = [110];
let o = 0;
let p = 0;
let q = 0;
let r = 0;
let s = 0;
url.forEach(function (num) {
switch (num) {
case 20:
rotated += String.fromCharCode(a20[o++]);
break;
case 18:
rotated += String.fromCharCode(a18[p++]);
break;
case 1:
rotated += String.fromCharCode(a1[q++]);
break;
case 243:
rotated += String.fromCharCode(a243[r++]);
break;
case 14:
rotated += String.fromCharCode(a14[0]);
break;
case 5:
rotated += String.fromCharCode(a5[s++]);
break;
case 15:
rotated += String.fromCharCode(a15[0]);
break;
case 2:
rotated += String.fromCharCode(a2[0]);
break;
case 23:
rotated += String.fromCharCode(a23[0]);
break;
}
});
return rotated ;
}
To share this paste please copy this url and send to your friends
RAW Paste Data