BvS Hacker Helper

BvS r00t Hacking Helper 1.3.4

目前为 2014-08-18 提交的版本。查看 最新版本

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