BvS Hacker Helper

BvS r00t Hacking Helper 1.3.5

  1. // ==UserScript==
  2. // @name BvS Hacker Helper
  3. // @namespace rvHack
  4. // @description BvS r00t Hacking Helper 1.3.5
  5. // @include http*://*animecubed.com/billy/bvs/villagefields.html
  6. // @include http*://*animecubedgaming.com/billy/bvs/villagefields.html
  7. // @version 1.3.7
  8. // @history 1.3.7 New domain - animecubedgaming.com - Channel28
  9. // @history 1.3.6 (5/19/2017) Now https compatible (Updated by Channel28)
  10. // @history 1.3.5 (9/9/2014) Added grant permissions.
  11. // @history 1.3.4 (1/15/2013) Made Firefox 17 compatible by removing CDATA.
  12. // @history 1.3.3 (3/12/2011) Made Firefox 4 compatible.
  13. // @history 1.3.2 (1/1/2010) Fixed some bad code I put in in 1.3.1.
  14. // @history 1.3.1 (12/31/2009) fixed an error because of new changes McM made to the display when you hacked someone
  15. // @history 1.3 script now remembers your hacked targets and when you hack them, and displays counts for past 24 hr hacks and past 48 hrs
  16. // @history 1.2 fixed error with field changing when one key is "Dealer's Room" because of the single quote.
  17. // @history 1.2 add a link text change when you click "Retry" so the user knows when the server responds.
  18. // @history 1.2 changed execution address from '*.animecubed' to '*animecubed' as requested.
  19. // @grant GM_getValue
  20. // @grant GM_setValue
  21. // @grant GM_xmlhttpRequest
  22. // ==/UserScript==
  23.  
  24. var helperBoxStyle = "background-color: black; color: white; border: #A1A100 2px solid;";
  25.  
  26. /////////////////////////////////////////////////////////////////
  27. // Functions
  28. /////////////////////////////////////////////////////////////////
  29.  
  30. var scripts = 'function switchHuntAndHack() {\n' +
  31. ' return switchTargetField("Cursed,Filthy,Noodle Shop", "hackfieldswitch");\n' +
  32. '}\n' +
  33. '\n' +
  34. 'function switchTargetField(target, confirm) {\n' +
  35. ' if ((target == null) || (target == ""))\n' +
  36. ' return false;\n' +
  37. '\n' +
  38. ' try {\n' +
  39. ' if (document.getElementById(confirm).checked) {\n' +
  40. ' var field = target.split(",");\n' +
  41. '\n' +
  42. ' switchField(field[0], field[1], field[2]);\n' +
  43. ' } else {\n' +
  44. ' alert("Please check the confirm box!");\n' +
  45. ' }\n' +
  46. ' } catch(e) {\n' +
  47. ' alert("Exception!\\n\\nError name: " + e.name + "\\nError message: " + e.message);\n' +
  48. ' }\n' +
  49. '\n' +
  50. ' return false;\n' +
  51. '}\n' +
  52. '\n' +
  53. 'function switchField(key1, key2, key3) {\n' +
  54. ' try {\n' +
  55. ' switchFieldKey(document.field.key_1, unescape(key1));\n' +
  56. ' switchFieldKey(document.field.key_2, unescape(key2));\n' +
  57. ' switchFieldKey(document.field.key_3, unescape(key3));\n' +
  58. '\n' +
  59. ' document.field.submit();\n' +
  60. ' } catch(e) {\n' +
  61. ' if (e == "KeyError")\n' +
  62. ' alert("Failed to switch to the desired Field. You may not have the keys necessary to travel there.");\n' +
  63. ' else\n' +
  64. ' throw(e);\n' +
  65. ' }\n' +
  66. '}\n' +
  67. '\n' +
  68. 'function switchFieldKey(keyfield, keyvalue) {\n' +
  69. ' for (var i = 0; i < keyfield.length; i++) {\n' +
  70. ' if (keyfield[i].text == keyvalue)\n' +
  71. ' break;\n' +
  72. ' }\n' +
  73. '\n' +
  74. ' if (i == keyfield.length)\n' +
  75. ' throw("KeyError");\n' +
  76. '\n' +
  77. ' keyfield.selectedIndex = i;\n' +
  78. '}\n';
  79.  
  80. String.prototype.startsWith = function(str) { return (this.match("^"+str) == str); }
  81. String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); }
  82.  
  83.  
  84. function getCurrentTarget() {
  85. var target = GM_getValue("currentTarget_" + playerName, "");
  86.  
  87. if (target != "") {
  88. var info = target.split(";");
  89. if (info[0] == "")
  90. info[0] = "[<i>Unknown Hacker</i>]";
  91.  
  92. return info;
  93. }
  94.  
  95. return new Array("", "");
  96. }
  97.  
  98. function getHackTargets() {
  99. var rtrn = GM_getValue("oldTargets_" + playerName, "").split(",");
  100. var removed = false;
  101.  
  102. while (rtrn.length > 0) {
  103. if (currentTime >= (parseInt(rtrn[1]) || 0) + 172800) { //2 days
  104. rtrn.splice(0, 2);
  105. remove = true;
  106. } else
  107. break;
  108. }
  109.  
  110. if (removed) {
  111. GM_setValue("oldTargets_" + playerName, rtrn.join(","))
  112. }
  113.  
  114. return rtrn;
  115. }
  116.  
  117. function saveHackTargets(targets) {
  118. GM_setValue("oldTargets_" + playerName, targets.join(","))
  119. }
  120.  
  121. function addHackedTarget(targetName) {
  122. var targets = getHackTargets();
  123.  
  124. targets.push(targetName);
  125. targets.push(currentTime);
  126.  
  127. saveHackTargets(targets);
  128. }
  129.  
  130. function countHacks24Hours(targets) {
  131. var count = 0;
  132.  
  133. for (var i = 0; i < targets.length; i += 2) {
  134. if (currentTime < (parseInt(targets[i+1]) || 0) + 86400) { //1 day
  135. count++;
  136. }
  137. }
  138.  
  139. return count;
  140. }
  141.  
  142. function getTimeAgo(time) {
  143. var diff = currentTime - time;
  144. var rtrn = "";
  145.  
  146. if (diff >= 3600) {
  147. rtrn += Math.round(diff / 3600) + " hrs ";
  148. diff %= 3600;
  149. }
  150.  
  151. rtrn += Math.round(diff / 60) + " mins";
  152.  
  153. return rtrn;
  154. }
  155.  
  156. function QueryServer_FindPlayer(player) {
  157. if ((player == null) || (player == undefined)) {
  158. player = getCurrentTarget()[0];
  159.  
  160. if (player.indexOf("<i>") != -1)
  161. return;
  162. }
  163.  
  164. QueryServer("action=find&player=" + player);
  165. }
  166.  
  167. function QueryServer(query) {
  168. GM_xmlhttpRequest({
  169. method: 'POST',
  170. url: 'http://rveach.romhack.org/BvS/hackhelper.php',
  171. headers: {'Content-type' : 'application/x-www-form-urlencoded'},
  172. data: encodeURI(query),
  173.  
  174. onerror: function(response) {
  175. alert("Hack Download Failed!");
  176. },
  177. onload: function(response) {
  178. try {
  179. var text = response.responseText;
  180.  
  181. if (text.startsWith("Saved;")) {
  182. //saved hack info
  183. } else if (text.startsWith("Info;")) {
  184. GM_setValue("currentTarget_" + playerName, text.substr(5));
  185.  
  186. updateHackDisplay();
  187. } else if ((text == null) || (text.length == 0)) {
  188. alert("Hack Download Error:\n\nUnknown Error");
  189. } else if (text.length >= 200) {
  190. alert("Hack Download Error:\n\nError Message too big to display!");
  191. } else {
  192. alert("Hack Download Error:\n\n" + text);
  193. }
  194. } catch(e) {
  195. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  196. }
  197. }
  198. });
  199. }
  200.  
  201. function updateHackDisplay(info) {
  202. if ((info == null) || (info == undefined))
  203. info = getCurrentTarget();
  204.  
  205. if (info[0] == "")
  206. return;
  207. if ((info[1] == null) || (info[1] == undefined))
  208. info[1] = "";
  209.  
  210. var helper;
  211. var insert;
  212.  
  213. var snap = document.evaluate("//table/tbody/tr/td/form/a", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  214. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  215. if (match = temp.textContent.match(/.*Remove Target \(.* Core\).*/)) {
  216. if (helper = document.getElementById("minihackdisplay")) {
  217. insert = false;
  218. } else {
  219. insert = true;
  220. helper = document.createElement("div");
  221.  
  222. helper.setAttribute("id", "minihackdisplay");
  223. helper.setAttribute("style", helperBoxStyle + "margin-top: 5px; font-size: 12px;");
  224. }
  225. var helperText = "";
  226.  
  227. helperText += ("<b>" + info[0] + "</b><br>\n");
  228.  
  229. if (info[1] == "") { //no location saved
  230. helperText += "<i>Location Unknown</i>";
  231. } else {
  232. helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
  233. helperText += ("\n<br><input style='margin-bottom: 7px;' type='checkbox' id='targetfieldswitch2' value='1'> <a href='javascript:;' onclick='return switchTargetField(\"" + escape(info[1]) + "," + escape(info[2]) + "," + escape(info[3]) + "\", \"targetfieldswitch2\")' style='color: white;'>Switch to Field!</a>");
  234. }
  235.  
  236. helperText += "<br>\n<a href='javascript:;' id='hackretry2' style='color: white;'>Retry</a>";
  237.  
  238. helper.innerHTML = helperText;
  239.  
  240. if (insert)
  241. temp.parentNode.insertBefore(helper, temp.nextSibling);
  242.  
  243. document.getElementById("hackretry2").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
  244. break;
  245. }
  246. }
  247.  
  248. if (helper = document.getElementById("hackdisplay")) {
  249. helperText = ("<br>Current Target: <b>" + info[0] + "</b> [<a href='javascript:;' id='hackretry1' style='color: white;'>Retry</a>]<br>(");
  250. if (info[1] == "") { //no location saved
  251. helperText += "<i>Location Unknown</i>";
  252. } else {
  253. helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
  254. }
  255.  
  256. helperText += ")\n";
  257.  
  258. if (info[1] != "") {
  259. helperText += "<br><input type='checkbox' id='targetfieldswitch1' value='1'> <a href='javascript:;' onclick='return switchTargetField(\"" + escape(info[1]) + "," + escape(info[2]) + "," + escape(info[3]) + "\", \"targetfieldswitch1\")' style='color: white;'>Switch to Target's Last Known Field!</a><br>\n";
  260. }
  261.  
  262. helper.innerHTML = helperText;
  263.  
  264. document.getElementById("hackretry1").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
  265. }
  266. }
  267.  
  268. /////////////////////////////////////////////////////////////////
  269.  
  270. try {
  271. var match;
  272. var currentTime = Math.round(new Date().getTime()/1000.0);
  273.  
  274. /////////////////////////////////////////////////////////////////
  275. // Get Form Fields
  276. /////////////////////////////////////////////////////////////////
  277. var fieldForm = document.getElementsByName("field")[0];
  278. var playerName = document.getElementsByName("player")[0].value;
  279. var key_1;
  280. var key_2;
  281. var key_3;
  282. var element;
  283.  
  284. for (var i = 0; element = fieldForm.elements[i]; i++) {
  285. if (element.name == "key_1")
  286. key_1 = element;
  287. else if (element.name == "key_2")
  288. key_2 = element;
  289. else if (element.name == "key_3")
  290. key_3 = element;
  291. }
  292.  
  293. /////////////////////////////////////////////////////////////////
  294. // Insert JS Functions
  295. /////////////////////////////////////////////////////////////////
  296. var head = document.getElementsByTagName("head")[0];
  297. var node = document.createElement("script");
  298. node.type = "text/javascript";
  299. node.innerHTML = scripts;
  300. head.appendChild(node);
  301.  
  302. /////////////////////////////////////////////////////////////////
  303. // Create Helper
  304. /////////////////////////////////////////////////////////////////
  305. var helper = document.createElement("div");
  306. var helperText = "<center><h3 style='display: inline'>Hacker Helper</h3></center>\n";
  307. helper.setAttribute("style", helperBoxStyle);
  308. fieldForm.parentNode.insertBefore(helper, fieldForm.nextSibling);
  309.  
  310. /////////////////////////////////////////////////////////////////
  311. // Get Player List
  312. /////////////////////////////////////////////////////////////////
  313. var playerlist = "";
  314. var playertemp;
  315. var snap = document.evaluate("//table/tbody/tr/td/i", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  316. for (var i = 0; playertemp = snap.snapshotItem(i); i++) {
  317. if (match = playertemp.textContent.replace(/[\n\r\t]/g, " ").match(/.*Other Ninja on this Field:\s*(.*)/)) {
  318. playerlist = match[1].replace(/ /g, " ").replace(/, /g, ",");
  319. break;
  320. }
  321. }
  322.  
  323. /////////////////////////////////////////////////////////////////
  324. // Get New Target, Hacked Target, or Target Dropped (can't be both)
  325. /////////////////////////////////////////////////////////////////
  326. snap = document.evaluate("//table/tbody/tr/td/b", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  327. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  328. temp2 = temp.textContent.replace(/[\n\r\t]/g, " ");
  329. if (match = temp2.match(/.*Target Found:\s*(.*)/)) { //got new target
  330. GM_setValue("currentTarget_" + playerName, "");
  331. QueryServer_FindPlayer(match[1].replace(/ /g, " ").trim());
  332. break;
  333. } else if (match = temp2.match(/.*Hack Successful!.*/)) { //hacked target
  334. var info = getCurrentTarget();
  335.  
  336. if (info[0] != "")
  337. addHackedTarget(info[0]);
  338.  
  339. GM_setValue("currentTarget_" + playerName, "");
  340. break;
  341. } else if (match = temp2.match(/.*Get a Target.*/)) { //dropped hack
  342. GM_setValue("currentTarget_" + playerName, "");
  343. break;
  344. }
  345. }
  346.  
  347. /////////////////////////////////////////////////////////////////
  348. // Get Keys
  349. /////////////////////////////////////////////////////////////////
  350. var key1 = key_1[key_1.selectedIndex].text;
  351. var key2 = key_2[key_2.selectedIndex].text;
  352. var key3 = key_3[key_3.selectedIndex].text;
  353. var keyString = key1 + "," + key2 + "," + key3;
  354.  
  355. /////////////////////////////////////////////////////////////////
  356. // Logic
  357. /////////////////////////////////////////////////////////////////
  358. if (playerlist != "") {
  359. QueryServer("action=save&field=" + keyString + "&playerlist=" + playerlist);
  360.  
  361. var info = getCurrentTarget();
  362.  
  363. if (info[0] != "")
  364. playertemp.innerHTML = playertemp.innerHTML.replace(info[0], "<h3><u>" + info[0] + "</u></h3>");
  365. }
  366.  
  367. helperText += "<div id='hackdisplay'></div>";
  368. helperText += "<br><input type='checkbox' id='hackfieldswitch' value='1'> <a href='javascript:;' onclick='return switchHuntAndHack()' style='color: white;'>Switch to 'Hunt and Hack' Field!</a>\n";
  369.  
  370. var targets = getHackTargets();
  371. if (targets.length > 0) {
  372. helperText += "<br><br><b>" + countHacks24Hours(targets) + "</b> successful hacks in the past 24 hours.";
  373. helperText += "<br><b>" + (targets.length / 2) + "</b> in the past 48 hours.";
  374.  
  375. helperText += "<br><font size='1'>";
  376.  
  377. for (var i = 0; i < targets.length; i += 2) {
  378. if (i)
  379. helperText += ", ";
  380.  
  381. helperText += "<i><b>" + targets[i] + "</b></i> (" + getTimeAgo(targets[i+1]) + " ago)";
  382. }
  383.  
  384. helperText += "</font>";
  385. }
  386.  
  387. helper.innerHTML = helperText;
  388.  
  389. updateHackDisplay();
  390. } catch(e) {
  391. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  392. }