A plug and play, set and forget script that’ll farm in a moderately optimised fashion
Here we go again, V2 has arrived!
Hello once more, today I bring you a better chunk of code! But it’s slightly less easy to understand
100% plug and play, but put it in a .ns file instead of .script, create in and run from home
NOTICE: It will automatically create/overwrite 3 files in the home directory called “weak.script”, “grow.script” and “hack.script”
This guide has a little less documentation, but much higher gains than the last
Let me know if there is any issue you can see, or any way to improve it further 🙂
Please note that it takes a while to warm up the wallets before the farming can start
Code
/** @param {NS} ns**/
export async function main(ns) {
ns.disableLog("ALL"); //Visual clarity
//Welcome to the Auto Farm part 2: Electric Boogaloo
//This script is a little more complicated to explain easily, it dedicates high RAM servers to attack high profit servers
//This is also set and forget, your EXEs and hacking level are reacquired each second, so new servers are added without needing to reboot it
//Well I hope this brings you ideas, knowledge and or profits 😀
var files = ["weak.script", "grow.script", "hack.script"];//No touching, unless you understand everything here
await ns.write(files[0], "weaken(args)", "w"); await ns.write(files[1], "grow(args)", "w"); await ns.write(files[2], "hack(args)", "w");
var serverList; var targetList; var hostList; var exes; var temp; var manager = false;
var cycle = [0, "─", "\\", "|", "/"]; var latest = [["-", "-"], ["-", "-"], ["-", "-"]];
if (false) { brutessh(); ftpcrack(); relaysmtp(); httpworm(); sqlinject() } //Avoid RAM cost bypass error
var pServers = await ns.prompt("Use player servers as hosts?");
async function scanExes() {
exes = ["BruteSSH", "FTPCrack", "relaySMTP", "SQLInject", "HTTPWorm"];
for (let i = 0; i <= exes.length - 1; i++) { if (!ns.fileExists(exes[i] + ".exe")) { exes.splice(i, 1); i-- } }//Removes EXEs you don't have
}
function arraySort(array) { return array.sort(function (a, b) { return b[0] - a[0] }) }//Sorts nested arrays
function logBalance(server) {//For balance in display
return [ns.nFormat(ns.getServerMoneyAvailable(server), '0a')] + " / " + [ns.nFormat(ns.getServerMaxMoney(server), '0a')]
+ " : " + ns.nFormat(ns.getServerMoneyAvailable(server) / ns.getServerMaxMoney(server), '0%')
}
async function log() {//The display
if (cycle[0] >= 4) { cycle[0] = 0 }; cycle[0]++;//Speen
ns.clearLog();
ns.print("╔═══╦═╣ HOST ╠════════════════╣ TARGET ╠═╗");
ns.print("║ G ║ " + latest[0][0] + latest[0][1].padStart(34 - latest[0][0].length) + " ║")
ns.print("║ W ║ " + latest[1][0] + latest[1][1].padStart(34 - latest[1][0].length) + " ║")
ns.print("║ H ║ " + latest[2][0] + latest[2][1].padStart(34 - latest[2][0].length) + " ║")
ns.print("║ " + cycle[cycle[0]] + " ╠════════════════════════════════════╣")
if (targetList.length < 6) { ns.print("╚═══╝ ║") } else {
ns.print("╠═══╝ Priority Servers Balance ║")
for (let i = 0; i < 6; i++) {
temp = targetList[i][1];
ns.print("║ > " + temp + logBalance(temp).padStart(36 - temp.length) + " ║")
}
ns.print("╠════════════════════════════════════════╝")
ns.print("║ EXE " + exes.length + "/5 ║ HOSTS " + hostList.length + " ║ TARGETS " + targetList.length)
ns.print("╠════════════════════════════════════════╗")
if (manager) {
ns.print("╠══════╣ Managing " + ns.hacknet.numNodes() + " HNet Nodes ╠".padEnd(21, "═") + "╣")
}
}
}
async function scanServers() {//Finds all servers
serverList = ns.scan("home"); let serverCount = [serverList.length, 0]; let depth = 0; let checked = 0; let scanIndex = 0;
while (scanIndex <= serverCount[depth] - 1) {
let results = ns.scan(serverList[checked]); checked++;
for (let i = 0; i <= results.length - 1; i++) {
if (results[i] != "home" && !serverList.includes(results[i])) {
serverList.push(results[i]); serverCount[depth + 1]++
}
}
if (scanIndex == serverCount[depth] - 1) { scanIndex = 0; depth++; serverCount.push(0) } else { scanIndex++ };
}
}
async function checkServers() {//Sorts servers into lists based on RAM and money/hack time ratio: hostList and targetList
targetList = []; hostList = [[ns.getServerMaxRam("home"), "home"]];
if (pServers) {//Adds in player servers
temp = ns.getPurchasedServers();
for (let i = 0; i < temp.length; i++) {
hostList.push([ns.getServerMaxRam(temp[i]), temp[i]])
await ns.scp(files, "home", temp[i]);
}
}
for (let i = 0; i <= serverList.length - 1; i++) {
let cTarget = serverList[i];
if (ns.getServerMoneyAvailable(cTarget) > 0 || ns.getServerMaxRam(cTarget) > 2) {//Filters out servers like darkweb
if (ns.getServerNumPortsRequired(cTarget) <= exes.length) {
for (let i = 0; i <= exes.length - 1; i++) { ns[exes[i].toLowerCase()](cTarget) }//Runs all EXEs you have
ns.nuke(cTarget);//Ghandi.jpeg
temp = [Math.floor(ns.getServerMaxMoney(cTarget) / ns.getServerMinSecurityLevel(cTarget)), cTarget];
if (ns.getServerMoneyAvailable(cTarget) != 0 && !targetList.includes(temp) && ns.getServerRequiredHackingLevel(cTarget) <= ns.getHackingLevel()) {
targetList.push(temp); targetList = arraySort(targetList);
}
temp = [ns.getServerMaxRam(cTarget), cTarget];
if (ns.getServerMaxRam(cTarget) > 2 && !hostList.includes(cTarget)) {
hostList.push(temp); hostList = arraySort(hostList)
}
await ns.scp(files, "home", cTarget);
}
}
}
}
async function hackAll() {//Dedicates high RAM servers to attack high profit per second servers
let tarIndex = 0; let loop = false;
for (let i = 0; i <= hostList.length - 1; i++) {
if (tarIndex > targetList.length - 1) { tarIndex = 0; loop = true };
let hHost = hostList[i][1]; let hTarget = targetList[tarIndex][1]; let freeRam;
if (hHost == "home") { freeRam = Math.max(ns.getServerMaxRam(hHost) - ns.getServerUsedRam(hHost) - 50, 0) } else {
freeRam = ns.getServerMaxRam(hHost) - ns.getServerUsedRam(hHost)
}
if (freeRam >= 4) {
let threads = Math.floor(freeRam / 1.75); let bThreads = 0;
if (ns.getServerMoneyAvailable(hTarget) < ns.getServerMaxMoney(hTarget) * .70 || loop) {//Server money target here
latest[0][0] = hHost; latest[0][1] = hTarget;
if (threads > 2) {
ns.exec("weak.script", hHost, Math.ceil(0.08 * threads), hTarget);
ns.exec("grow.script", hHost, Math.floor(0.92 * threads), hTarget);
} else { ns.exec("grow.script", hHost, threads, hTarget) }
} else if (ns.getServerSecurityLevel(hTarget) > ns.getServerMinSecurityLevel(hTarget) + 5) {//Security target here
latest[1][0] = hHost; latest[1][1] = hTarget;
ns.exec("weak.script", hHost, threads, hTarget);
} else {
while (parseFloat(ns.hackAnalyze(hTarget)) * threads > .4) { threads--; bThreads++ }//Hack limit here
latest[2][0] = hHost; latest[2][1] = hTarget;
ns.exec("hack.script", hHost, threads, hTarget);
if (bThreads > 0) { ns.exec("weak.script", hHost, bThreads, hTarget) }
}
}
tarIndex++
}
}
//Put modules below here
manager = await ns.prompt("Activate Hacknet Manager?");
async function hnManager() {
let mode = ["Level", "Ram", "Core"]
function check(q) { return eval(q < ns.getPlayer().money / 5) }
if (check(ns.hacknet.getPurchaseNodeCost())) {
ns.hacknet.purchaseNode();
}
for (let i = 0; i < ns.hacknet.numNodes(); i++) {
for (let n = 0; n < 3; n++) {
if (check(ns.hacknet["get" + mode[n] + "UpgradeCost"](i))) {
ns.hacknet["upgrade" + mode[n]](i);
}
}
}
}
//But above here
ns.tail()
while (true) {//Keeps everything running once per second
await scanExes()
await scanServers()
await checkServers()
await hackAll()
if (manager) { await hnManager() }
await log()
await ns.asleep(1000)
}}
Here we come to an end for Bitburner Auto Farm Code/Script hope you enjoy it. If you think we forget something to include or we should make an update to the post let us know via comment, and we will fix it asap! Thanks and have a great day!
- Check All Bitburner Posts List
That’s a good script, it works well but the hack part of it. It nuked all the servers possible, managed all the hnNodes. But the hacking wont work. I don’t know why.
I found the bug. The arguments of the ns.scp command are in the wrong order.
It needs to be (files , destination , source ) in the script is destination and source changed. Game Version is v2.0.2
Im new to the whole coding thing and ive been doing some research on how to do it but I dont quite understand. Do I just copy and paste all of that into the script and it does the rest?
doesnt work with 1.6.0 anymore
Easy to fix, you should search in the mainscript (autofarm.js) for Weaken(args), grow(args) and hack(args) and should extend the args with ARGS[0].
You will find this in line 11 and should like set so.
await ns.write(files[0], “weaken(args[0])”, “w”); await ns.write(files[1], “grow(args[0])”, “w”); await ns.write(files[2], “hack(args[0])”, “w”);
This is that the argument is an array and so you need [0].
idk if there is already something like this, but have you added Deepscanv2?
Pretty terrific. I’m really struggling to figure out why it’s not working in BN5. Server money trends down instead of up. I’m guessing different ratios are required but don’t really understand why because it says only starting security level is changed.
This is so helpful. I’ve been struggling trying to figure out how to figure out which servers should be priority targets. The log display is so good too. Very well done.
Would be nice if it would actually purchase servers to run more threads in parallel
THIS
Easily done, buying servers is simple, create a function that does it, and add it to the while (true)
Here’s a simple script that you can run simultaneously (only takes 9.25GB of memory) that you can run whenever you need to upgrade your servers.
/** @param {NS} ns **/
export async function main(ns) {
var lowestRAM = 99999999;
var currentRAM = 99999999;
var highestRAM = 8;
var targetserver = ‘home’;
var host = ”;
var keepGoing = 1;
while (keepGoing == 1) {
// ns.tprint(‘This happened’);
let servers = (ns.getPurchasedServers());
let servernumber = servers.length;
let highestserver = servernumber;
for (let i = 0; i currentRAM) {
lowestRAM = currentRAM;
targetserver = servers[i];
}
if (highestRAM parseInt(servernumber)) {
servernumber = servernumber3digit;
}
if (parseInt(servernumber) > highestserver) {
highestserver = parseInt(servernumber)
}
}
if (lowestRAM == 1048576) {
keepGoing = 0;
ns.tprint(‘All upgraded! Goodbye!’);
ns.exit();
}
if (ns.getServerMoneyAvailable(“home”) > ns.getPurchasedServerCost(highestRAM * 8)) {
if (servers.length == 25) {
ns.killall(targetserver);
ns.deleteServer(targetserver);
}
host = “RAM” + highestRAM * 8 + “-” + (highestserver + 1);
ns.purchaseServer(host, highestRAM * 8);
} else if (ns.getServerMoneyAvailable(“home”) > ns.getPurchasedServerCost(highestRAM * 4)) {
if (servers.length == 25) {
ns.killall(targetserver);
ns.deleteServer(targetserver);
}
host = “RAM” + highestRAM * 4 + “-” + (highestserver + 1);
ns.purchaseServer(host, highestRAM * 4);
} else if (ns.getServerMoneyAvailable(“home”) > ns.getPurchasedServerCost(highestRAM * 2)) {
if (servers.length == 25) {
ns.killall(targetserver);
ns.deleteServer(targetserver);
}
host = “RAM” + highestRAM * 2 + “-” + (highestserver + 1);
ns.purchaseServer(host, highestRAM * 2);
} else if (ns.getServerMoneyAvailable(“home”) > ns.getPurchasedServerCost(highestRAM) && servers.length < 25) {
host = "RAM" + highestRAM + "-" + (highestserver + 1);
ns.purchaseServer(host, highestRAM);
} else if (lowestRAM ns.getPurchasedServerCost(highestRAM)) {
// If we have enough money, then:
// 1. Kill scripts on worst server.
// 2. Scrap the worst server.
// 3. Purchase the new server
// 4. rerun pwnAll to make sure all servers are appropriately attacked.
ns.killall(targetserver);
ns.deleteServer(targetserver);
host = “RAM” + highestRAM + “-” + (highestserver + 1);
ns.purchaseServer(host, highestRAM);
}
else while (lowestRAM < (highestRAM / 2)) {
if (lowestRAM ns.getPurchasedServerCost(highestRAM / 2)) {
// If we have enough money, then:
// 1. Kill scripts on worst server.
// 2. Scrap the worst server.
// 3. Purchase the new server
// 4. rerun pwnAll to make sure all servers are appropriately attacked.
ns.killall(targetserver);
ns.deleteServer(targetserver);
host = “RAM” + highestRAM / 2 + “-” + (highestserver + 1);
ns.purchaseServer(host, highestRAM / 2);
highestRAM = lowestRAM;
}
} highestRAM = highestRAM / 2
}
}
if (host != ”) {
ns.toast(‘Welcome new server: ‘ + host);
host = ”;
}
//ns.run(‘pwnAll.js’, 1);
lowestRAM = 99999999;
await (ns.asleep(10000));
}
}
Works kind of good, but I did notice that on the big servers with 2b/2b it wouldn’t sell and I had to manually do it. the security level is all the way down to minimum already, its just not executing hack.script [hostname]
thank you very much for this! works great, much better than other codes out there 🙂
RUNTIME ERROR
AutoFarm.js@home
Identifier ‘main’ has already been declared (sorry we can’t be more helpful) — Any know of how to fix? Not really a coder so help would be appreciated
why is it taking so much money from me to run?
works great! Would recommend for farming!