- // ==UserScript==
- // @name BvS Hacker Helper
- // @namespace rvHack
- // @description BvS r00t Hacking Helper 1.3.5
- // @include http*://*animecubed.com/billy/bvs/villagefields.html
- // @include http*://*animecubedgaming.com/billy/bvs/villagefields.html
- // @version 1.3.7
- // @history 1.3.7 New domain - animecubedgaming.com - Channel28
- // @history 1.3.6 (5/19/2017) Now https compatible (Updated by Channel28)
- // @history 1.3.5 (9/9/2014) Added grant permissions.
- // @history 1.3.4 (1/15/2013) Made Firefox 17 compatible by removing CDATA.
- // @history 1.3.3 (3/12/2011) Made Firefox 4 compatible.
- // @history 1.3.2 (1/1/2010) Fixed some bad code I put in in 1.3.1.
- // @history 1.3.1 (12/31/2009) fixed an error because of new changes McM made to the display when you hacked someone
- // @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
- // @history 1.2 fixed error with field changing when one key is "Dealer's Room" because of the single quote.
- // @history 1.2 add a link text change when you click "Retry" so the user knows when the server responds.
- // @history 1.2 changed execution address from '*.animecubed' to '*animecubed' as requested.
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_xmlhttpRequest
- // ==/UserScript==
-
- var helperBoxStyle = "background-color: black; color: white; border: #A1A100 2px solid;";
-
- /////////////////////////////////////////////////////////////////
- // Functions
- /////////////////////////////////////////////////////////////////
-
- var scripts = 'function switchHuntAndHack() {\n' +
- ' return switchTargetField("Cursed,Filthy,Noodle Shop", "hackfieldswitch");\n' +
- '}\n' +
- '\n' +
- 'function switchTargetField(target, confirm) {\n' +
- ' if ((target == null) || (target == ""))\n' +
- ' return false;\n' +
- '\n' +
- ' try {\n' +
- ' if (document.getElementById(confirm).checked) {\n' +
- ' var field = target.split(",");\n' +
- '\n' +
- ' switchField(field[0], field[1], field[2]);\n' +
- ' } else {\n' +
- ' alert("Please check the confirm box!");\n' +
- ' }\n' +
- ' } catch(e) {\n' +
- ' alert("Exception!\\n\\nError name: " + e.name + "\\nError message: " + e.message);\n' +
- ' }\n' +
- '\n' +
- ' return false;\n' +
- '}\n' +
- '\n' +
- 'function switchField(key1, key2, key3) {\n' +
- ' try {\n' +
- ' switchFieldKey(document.field.key_1, unescape(key1));\n' +
- ' switchFieldKey(document.field.key_2, unescape(key2));\n' +
- ' switchFieldKey(document.field.key_3, unescape(key3));\n' +
- '\n' +
- ' document.field.submit();\n' +
- ' } catch(e) {\n' +
- ' if (e == "KeyError")\n' +
- ' alert("Failed to switch to the desired Field. You may not have the keys necessary to travel there.");\n' +
- ' else\n' +
- ' throw(e);\n' +
- ' }\n' +
- '}\n' +
- '\n' +
- 'function switchFieldKey(keyfield, keyvalue) {\n' +
- ' for (var i = 0; i < keyfield.length; i++) {\n' +
- ' if (keyfield[i].text == keyvalue)\n' +
- ' break;\n' +
- ' }\n' +
- '\n' +
- ' if (i == keyfield.length)\n' +
- ' throw("KeyError");\n' +
- '\n' +
- ' keyfield.selectedIndex = i;\n' +
- '}\n';
-
- String.prototype.startsWith = function(str) { return (this.match("^"+str) == str); }
- String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); }
-
-
- function getCurrentTarget() {
- var target = GM_getValue("currentTarget_" + playerName, "");
-
- if (target != "") {
- var info = target.split(";");
- if (info[0] == "")
- info[0] = "[<i>Unknown Hacker</i>]";
-
- return info;
- }
-
- return new Array("", "");
- }
-
- function getHackTargets() {
- var rtrn = GM_getValue("oldTargets_" + playerName, "").split(",");
- var removed = false;
-
- while (rtrn.length > 0) {
- if (currentTime >= (parseInt(rtrn[1]) || 0) + 172800) { //2 days
- rtrn.splice(0, 2);
- remove = true;
- } else
- break;
- }
-
- if (removed) {
- GM_setValue("oldTargets_" + playerName, rtrn.join(","))
- }
-
- return rtrn;
- }
-
- function saveHackTargets(targets) {
- GM_setValue("oldTargets_" + playerName, targets.join(","))
- }
-
- function addHackedTarget(targetName) {
- var targets = getHackTargets();
-
- targets.push(targetName);
- targets.push(currentTime);
-
- saveHackTargets(targets);
- }
-
- function countHacks24Hours(targets) {
- var count = 0;
-
- for (var i = 0; i < targets.length; i += 2) {
- if (currentTime < (parseInt(targets[i+1]) || 0) + 86400) { //1 day
- count++;
- }
- }
-
- return count;
- }
-
- function getTimeAgo(time) {
- var diff = currentTime - time;
- var rtrn = "";
-
- if (diff >= 3600) {
- rtrn += Math.round(diff / 3600) + " hrs ";
- diff %= 3600;
- }
-
- rtrn += Math.round(diff / 60) + " mins";
-
- return rtrn;
- }
-
- function QueryServer_FindPlayer(player) {
- if ((player == null) || (player == undefined)) {
- player = getCurrentTarget()[0];
-
- if (player.indexOf("<i>") != -1)
- return;
- }
-
- QueryServer("action=find&player=" + player);
- }
-
- function QueryServer(query) {
- GM_xmlhttpRequest({
- method: 'POST',
- url: 'http://rveach.romhack.org/BvS/hackhelper.php',
- headers: {'Content-type' : 'application/x-www-form-urlencoded'},
- data: encodeURI(query),
-
- onerror: function(response) {
- alert("Hack Download Failed!");
- },
- onload: function(response) {
- try {
- var text = response.responseText;
-
- if (text.startsWith("Saved;")) {
- //saved hack info
- } else if (text.startsWith("Info;")) {
- GM_setValue("currentTarget_" + playerName, text.substr(5));
-
- updateHackDisplay();
- } else if ((text == null) || (text.length == 0)) {
- alert("Hack Download Error:\n\nUnknown Error");
- } else if (text.length >= 200) {
- alert("Hack Download Error:\n\nError Message too big to display!");
- } else {
- alert("Hack Download Error:\n\n" + text);
- }
- } catch(e) {
- alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
- }
- }
- });
- }
-
- function updateHackDisplay(info) {
- if ((info == null) || (info == undefined))
- info = getCurrentTarget();
-
- if (info[0] == "")
- return;
- if ((info[1] == null) || (info[1] == undefined))
- info[1] = "";
-
- var helper;
- var insert;
-
- var snap = document.evaluate("//table/tbody/tr/td/form/a", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0; temp = snap.snapshotItem(i); i++) {
- if (match = temp.textContent.match(/.*Remove Target \(.* Core\).*/)) {
- if (helper = document.getElementById("minihackdisplay")) {
- insert = false;
- } else {
- insert = true;
- helper = document.createElement("div");
-
- helper.setAttribute("id", "minihackdisplay");
- helper.setAttribute("style", helperBoxStyle + "margin-top: 5px; font-size: 12px;");
- }
- var helperText = "";
-
- helperText += ("<b>" + info[0] + "</b><br>\n");
-
- if (info[1] == "") { //no location saved
- helperText += "<i>Location Unknown</i>";
- } else {
- helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
- 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>");
- }
-
- helperText += "<br>\n<a href='javascript:;' id='hackretry2' style='color: white;'>Retry</a>";
-
- helper.innerHTML = helperText;
-
- if (insert)
- temp.parentNode.insertBefore(helper, temp.nextSibling);
-
- document.getElementById("hackretry2").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
- break;
- }
- }
-
- if (helper = document.getElementById("hackdisplay")) {
- helperText = ("<br>Current Target: <b>" + info[0] + "</b> [<a href='javascript:;' id='hackretry1' style='color: white;'>Retry</a>]<br>(");
- if (info[1] == "") { //no location saved
- helperText += "<i>Location Unknown</i>";
- } else {
- helperText += ("<b>" + info[1] + "</b>, <b>" + info[2] + "</b>, <b>" + info[3] + "</b> saved <b>" + info[4] + "</b>");
- }
-
- helperText += ")\n";
-
- if (info[1] != "") {
- 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";
- }
-
- helper.innerHTML = helperText;
-
- document.getElementById("hackretry1").addEventListener("click", function() { this.innerHTML = "Requesting"; QueryServer_FindPlayer(); }, false);
- }
- }
-
- /////////////////////////////////////////////////////////////////
-
- try {
- var match;
- var currentTime = Math.round(new Date().getTime()/1000.0);
-
- /////////////////////////////////////////////////////////////////
- // Get Form Fields
- /////////////////////////////////////////////////////////////////
- var fieldForm = document.getElementsByName("field")[0];
- var playerName = document.getElementsByName("player")[0].value;
- var key_1;
- var key_2;
- var key_3;
- var element;
-
- for (var i = 0; element = fieldForm.elements[i]; i++) {
- if (element.name == "key_1")
- key_1 = element;
- else if (element.name == "key_2")
- key_2 = element;
- else if (element.name == "key_3")
- key_3 = element;
- }
-
- /////////////////////////////////////////////////////////////////
- // Insert JS Functions
- /////////////////////////////////////////////////////////////////
- var head = document.getElementsByTagName("head")[0];
- var node = document.createElement("script");
- node.type = "text/javascript";
- node.innerHTML = scripts;
- head.appendChild(node);
-
- /////////////////////////////////////////////////////////////////
- // Create Helper
- /////////////////////////////////////////////////////////////////
- var helper = document.createElement("div");
- var helperText = "<center><h3 style='display: inline'>Hacker Helper</h3></center>\n";
- helper.setAttribute("style", helperBoxStyle);
- fieldForm.parentNode.insertBefore(helper, fieldForm.nextSibling);
-
- /////////////////////////////////////////////////////////////////
- // Get Player List
- /////////////////////////////////////////////////////////////////
- var playerlist = "";
- var playertemp;
- var snap = document.evaluate("//table/tbody/tr/td/i", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0; playertemp = snap.snapshotItem(i); i++) {
- if (match = playertemp.textContent.replace(/[\n\r\t]/g, " ").match(/.*Other Ninja on this Field:\s*(.*)/)) {
- playerlist = match[1].replace(/ /g, " ").replace(/, /g, ",");
- break;
- }
- }
-
- /////////////////////////////////////////////////////////////////
- // Get New Target, Hacked Target, or Target Dropped (can't be both)
- /////////////////////////////////////////////////////////////////
- snap = document.evaluate("//table/tbody/tr/td/b", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0; temp = snap.snapshotItem(i); i++) {
- temp2 = temp.textContent.replace(/[\n\r\t]/g, " ");
- if (match = temp2.match(/.*Target Found:\s*(.*)/)) { //got new target
- GM_setValue("currentTarget_" + playerName, "");
- QueryServer_FindPlayer(match[1].replace(/ /g, " ").trim());
- break;
- } else if (match = temp2.match(/.*Hack Successful!.*/)) { //hacked target
- var info = getCurrentTarget();
-
- if (info[0] != "")
- addHackedTarget(info[0]);
-
- GM_setValue("currentTarget_" + playerName, "");
- break;
- } else if (match = temp2.match(/.*Get a Target.*/)) { //dropped hack
- GM_setValue("currentTarget_" + playerName, "");
- break;
- }
- }
-
- /////////////////////////////////////////////////////////////////
- // Get Keys
- /////////////////////////////////////////////////////////////////
- var key1 = key_1[key_1.selectedIndex].text;
- var key2 = key_2[key_2.selectedIndex].text;
- var key3 = key_3[key_3.selectedIndex].text;
- var keyString = key1 + "," + key2 + "," + key3;
-
- /////////////////////////////////////////////////////////////////
- // Logic
- /////////////////////////////////////////////////////////////////
- if (playerlist != "") {
- QueryServer("action=save&field=" + keyString + "&playerlist=" + playerlist);
-
- var info = getCurrentTarget();
-
- if (info[0] != "")
- playertemp.innerHTML = playertemp.innerHTML.replace(info[0], "<h3><u>" + info[0] + "</u></h3>");
- }
-
- helperText += "<div id='hackdisplay'></div>";
- 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";
-
- var targets = getHackTargets();
- if (targets.length > 0) {
- helperText += "<br><br><b>" + countHacks24Hours(targets) + "</b> successful hacks in the past 24 hours.";
- helperText += "<br><b>" + (targets.length / 2) + "</b> in the past 48 hours.";
-
- helperText += "<br><font size='1'>";
-
- for (var i = 0; i < targets.length; i += 2) {
- if (i)
- helperText += ", ";
-
- helperText += "<i><b>" + targets[i] + "</b></i> (" + getTimeAgo(targets[i+1]) + " ago)";
- }
-
- helperText += "</font>";
- }
-
- helper.innerHTML = helperText;
-
- updateHackDisplay();
- } catch(e) {
- alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
- }