BvS Hacker Helper

BvS r00t Hacking Helper 1.3.5

目前为 2017-05-19 提交的版本。查看 最新版本

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