Bitburner

Bitburner

188 ratings
[OUTDATED] Intermediate Auto Farm + Modules
By PG SDVX
May no longer work, but could be useful for study?
19
10
3
3
5
2
3
2
2
   
Award
Favorite
Favorited
Unfavorite
Here we go again, V3 has arrived!
Hello once more, today I bring you a better chunk of code!
100% plug and play, but put it in a .ns file instead of .script, create in and run from home
This guide has 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 :)

NOTICE: It will automatically create/overwrite 3 files in the home directory called "weak.script", "grow.script" and "hack.script" and uses 14.8GB to run without modules, 20.05GB with
Server RAM utilisation may temporarily be low when weakening, this is intended
Also it takes a while to warm up the wallets before the farming can start

- Advanced Update -
Rewrote the code to be cleaner and to work better, gains increased further
Leaving old code here so that people can move up from the basic if they're studying it
Old modules will work only with intermediate version, advanced has them preinstalled
Improved Intermediate Code - Modules Preinstalled
/** @param {NS} ns**/
export async function main(ns) {
ns.disableLog('ALL');

//Welcome to the Auto Farm part 2: Electric Boogaloo - Advanced Edition
//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 :D

var files = ['grow.script', 'weak.script', 'hack.script'];
await ns.write(files[0], 'grow(args[0])', 'w'); await ns.write(files[1], 'weaken(args[0])', 'w'); await ns.write(files[2], 'hack(args[0])', 'w');

var exclude = [''] //Servers names that won't be used as hosts or deleted

var servers; var hosts; var targets; var exes; var tarIndex; var loop; var hType; var tmp; var act;
var netManager = false; var serverManager = false;
var cycle = [0, '▄', '█', '▀', '█'];
if (false) { brutessh(); ftpcrack(); relaysmtp(); httpworm(); sqlinject() }

const checkM = (c, d) => eval(c < ns.getPlayer().money / d)
const arraySort = (arr) => arr.sort((a, b) => b[0] - a[0])
function str(s) { if (s.length > 14) { return s.substring(0, 14) + '...' } else { return s } }
function info(t, s) {
if (t == 'MM') { return ns.getServerMaxMoney(s) }
if (t == 'MA') { return ns.getServerMoneyAvailable(s) }
if (t == 'MR') { return ns.getServerMaxRam(s) }
if (t == 'UR') { return ns.getServerUsedRam(s) }
if (t == 'NPR') { return ns.getServerNumPortsRequired(s) }
if (t == 'RHL') { return ns.getServerRequiredHackingLevel(s) }
if (t == 'SL') { return ns.getServerSecurityLevel(s) }
if (t == 'MSL') { return ns.getServerMinSecurityLevel(s) }
}

async function scanExes() { for (let hack of ['brutessh', 'ftpcrack', 'relaysmtp', 'sqlinject', 'httpworm']) { if (ns.fileExists(hack + '.exe')) { exes.push(hack) } } }

function log() {
if (cycle[0] >= 4) { cycle[0] = 0 }; cycle[0]++; ns.clearLog();
ns.print('╔═══╦════════════════════════════════════╗')
tmp = targets.slice(0, 12)
ns.print(`║ ${cycle[cycle[0]]} ║ HIGH PROFIT BALANCE ║`)
for (let t of tmp) {
ns.print(`║ ${act[t[1]]} ║ ${str(t[1])}` + `${ns.nFormat(info('MA', t[1]), '0a')} / ${ns.nFormat(info('MM', t[1]), '0a')} : ${ns.nFormat(info('MA', t[1]) / info('MM', t[1]), '0%')} ║`.padStart(36 - str(t[1]).length))
}
ns.print('╠═══╩════════════════════════════════════╝')
ns.print(`║ EXE ${exes.length}/5 ║ HOSTS ${hosts.length} ║ TARGETS ${targets.length}`)
ns.print('╠═════════════════════════════════════════')

if (netManager || serverManager) {
tmp = '║ MANAGER'
if (netManager) { tmp += ' ║ HN-Nodes ' + ns.hacknet.numNodes() }
if (serverManager) { tmp += ' ║ P-Servers ' + ns.getPurchasedServers().length }
ns.print(tmp + '\n╠═════════════════════════════════════════')
}
}

async function scanServers(host, current) {//Combined scan and check
for (let server of ns.scan(current)) {
if ((ns.getPurchasedServers().includes(server) || info('NPR', server) <= exes.length) && host != server) {
if (!ns.getPurchasedServers().includes(server)) { for (let hack of exes) { ns[hack](server) }; ns.nuke(server) }
if (info('MM', server) != 0 && info('RHL', server) <= ns.getHackingLevel() && info('MSL', server) < 100) {
targets.push([Math.floor(info('MM', server) / info('MSL', server)), server]); targets = arraySort(targets)
}
if (info('MR', server) > 4 && !exclude.includes(server)) { hosts.push([info('MR', server), server]); hosts = arraySort(hosts) }
servers.push(server)
await ns.scp(files, 'home', server)
await scanServers(current, server)
}
}
}

async function hackAll() {//Dedicates high RAM servers to high value ones
for (let host of hosts) {
if (tarIndex > targets.length - 1) { tarIndex = 0; loop = true };
let target = targets[tarIndex][1];
function fRam() { return info('MR', host[1]) - info('UR', host[1]) }
if (info('MA', target) < info('MM', target) * .80) { hType = 0 }
else if (info('SL', target) > info('MSL', target) + 5 || loop) {
hType = 1;
if (fRam() / info('MR', host[1]) > .13 && fRam() > 4) {
tmp = Math.floor(fRam() / 1.75); if (tmp > 0) { ns.exec(files[1], host[1], tmp, target) }
}
} else {
hType = 2; for (let h of hosts) { if (ns.isRunning(files[2], h[1], target) && h[1] != host[1]) { hType = 0; break } }
if (hType == 2 && !ns.scriptRunning(files[2], host[1])) {
if (fRam() < 2) { ns.killall(host[1]) }
tmp = [1, Math.floor(fRam() / 1.7)]; while (ns.hackAnalyze(target) * tmp[0] < .7 && tmp[0] < tmp[1]) { tmp[0]++ }
ns.exec(files[2], host[1], tmp[0], target)
}
}
if ((hType == 0 || hType == 2) && fRam() > 3.9) {
tmp = [Math.ceil(info('MR', host[1]) / 1.75 * .14), Math.floor(info('MR', host[1]) / 1.75 * .79)]
if (tmp[1] > 0 && fRam() / info('MR', host[1]) >= .80) { ns.exec(files[0], host[1], tmp[1], target) }
if (tmp[0] > 0 && fRam() / info('MR', host[1]) >= .15) { ns.exec(files[1], host[1], tmp[0], target) }
}
if (!loop) { if (hType == 0) { act[target] = 'G' }; if (hType == 1) { act[target] = 'W' }; if (hType == 2) { act[target] = 'H' }; }
tarIndex++;
}
}
//MODULES BELOW HERE
netManager = await ns.prompt('Activate Hacknet Manager?');
async function hnManager() {
if (checkM(ns.hacknet.getPurchaseNodeCost(), 20)) { ns.hacknet.purchaseNode() }
for (let i = 0; i < ns.hacknet.numNodes(); i++) {
for (let part of ['Level', 'Ram', 'Core']) {
if (checkM(ns.hacknet['get' + part + 'UpgradeCost'](i), 20)) {
ns.hacknet['upgrade' + part](i);
}
}
}
}
serverManager = await ns.prompt('Activate Player Server Manager?');
async function pServerManager() {
let ram = 0; let ramList = [8]; for (let num of ramList) {
if (num <= 1048576 && checkM(ns.getPurchasedServerCost(num), 20)) { ramList.push(num * 2); ram = num; } else { break };
}
function buyServer(r) { ns.purchaseServer('SERVER-' + ns.nFormat(r * 1000000000, '0.0b'), r) }
if (ns.getPurchasedServers().length < 25 && ram > 0) { buyServer(ram) }
for (let i = ns.getPurchasedServers().length - 1; i >= 0; i--) {
tmp = ns.getPurchasedServers()[i]
if (info('MR', tmp) < ram && checkM(ns.getPurchasedServerCost(ram), 20) && !exclude.includes(tmp)) {
ns.killall(tmp); ns.deleteServer(tmp); buyServer(ram);
}
}
}
//MODULES ABOVE HERE
ns.tail()
while (true) {//Keeps everything running once per second
servers = []; targets = []; hosts = [[Math.max(info('MR', 'home') - 50, 0), 'home']]; exes = []
tarIndex = 0; loop = false; act = {}
await scanExes()
await scanServers('', 'home')
await hackAll()
if (netManager) { await hnManager() }
if (serverManager) { await pServerManager() }
log()
await ns.asleep(1000)
}}
Old - Intermediate 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 :D

var files = ["grow.script", "weak.script", "hack.script"];//I advise against modifying the scripts
await ns.write(files[0], "grow(args)", "w"); await ns.write(files[1], "weaken(args)", "w"); await ns.write(files[2], "hack(args)", "w");

var serverList; var targetList; var hostList; var exes; var temp;
var netManager = false; var serverManager = 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 str(s) { if (s.length > 14) { return s.substring(0, 14) + "..." } else { return s } }//Truncate long strings
function checkM(c, d) { return eval(c < ns.getPlayer().money / d) }
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]++;//Bounce
ns.clearLog();
ns.print("╔═══╦═╣ HOST ╠════════════════╣ TARGET ╠═╗");
ns.print("║ G ║ " + str(latest[0][0]) + str(latest[0][1]).padStart(34 - str(latest[0][0]).length) + " ║")
ns.print("║ W ║ " + str(latest[1][0]) + str(latest[1][1]).padStart(34 - str(latest[1][0]).length) + " ║")
ns.print("║ H ║ " + str(latest[2][0]) + str(latest[2][1]).padStart(34 - str(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 (netManager) { ns.print("╠═════════╣ Managing " + ns.hacknet.numNodes() + " Hacknet Nodes") }
if (serverManager) { ns.print("╠═════════╣ Managing " + ns.getPurchasedServers().length + " Player Servers") }
}
}

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: hostList and targetList
targetList = []; hostList = [[ns.getServerMaxRam("home"), "home"]];
for (let i = 0; i <= serverList.length - 1; i++) {
let cTarget = serverList[i];
if (ns.getServerMaxMoney(cTarget) > 0 || ns.getServerMaxRam(cTarget) > 0) {
temp = ns.getPurchasedServers().includes(cTarget)
if ((ns.getServerNumPortsRequired(cTarget) <= exes.length && !temp) || (temp && pServers)) {
if (!temp) {
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.getServerMaxMoney(cTarget) != 0 && ns.getServerRequiredHackingLevel(cTarget) <= ns.getHackingLevel() && ns.getServerMinSecurityLevel(cTarget) < 100) {
targetList.push(temp); targetList = arraySort(targetList);
}
temp = [ns.getServerMaxRam(cTarget), cTarget];
if (ns.getServerMaxRam(cTarget) > 4) {
hostList.push(temp); hostList = arraySort(hostList)
}
await ns.scp(files, "home", cTarget);
}
}
}
}

async function hackAll() {//Dedicates high RAM servers to high value ones
let tarIndex = 0; let loop = false; let hType; let threads; let freeRam;
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];
async function fRam() {
let f = ns.getServerMaxRam(hHost) - ns.getServerUsedRam(hHost)
if (hHost == "home") { freeRam = Math.max(f - 50, 0) } else { freeRam = f }
}
fRam();
if (ns.getServerMoneyAvailable(hTarget) < ns.getServerMaxMoney(hTarget) * .80) { hType = 0 }
else if (ns.getServerSecurityLevel(hTarget) > ns.getServerMinSecurityLevel(hTarget) + 5 || loop) { hType = 1 } else { hType = 2 }
threads = Math.floor(freeRam / ns.getScriptRam(files[hType]));
if (hType == 2 && !ns.scriptRunning(files[2], hHost)) {
temp = true;
for (let i = 0; i < hostList.length; i++) {
if (ns.isRunning(files[2], hostList[i][1], hTarget) && hostList[i][1] != hHost) { temp = false }
}
if (temp) {
ns.scriptKill(files[0], hHost); ns.scriptKill(files[1], hHost); fRam();
threads = Math.floor(freeRam / ns.getScriptRam(files[hType]));
while (parseFloat(ns.hackAnalyze(hTarget)) * threads > .5) { threads-- }
} else { hType = 0 }
}
if (hType == 0 && freeRam > 4) {
ns.exec(files[1], hHost, Math.ceil(0.17 * threads), hTarget);
threads = Math.floor(0.83 * threads)
}
if (freeRam > 4) { ns.exec(files[hType], hHost, threads, hTarget); latest[hType][0] = hHost; latest[hType][1] = hTarget; }
fRam();
if ((hType == 0 || hType == 1) && freeRam / ns.getServerMaxRam(hHost) > .5) {
ns.scriptKill(files[0], hHost); ns.scriptKill(files[1], hHost)
}
tarIndex++
}
}
//Put modules below here

//But above here
ns.tail()
while (true) {//Keeps everything running once per second
await scanExes()
await scanServers()
await checkServers()
await hackAll()
if (netManager) { await hnManager() }
if (serverManager) { await pServerManager() }
await log()
await ns.asleep(1000)
}
}
Old - Modules
Copy n paste these snippets of code down the bottom of the script, where it says to, and they'll work once you start/restart the script

If you want to deactivate an active module while the script is running, simply kill and run again from the script log window to have the options re displayed



Hacknet Manager
Purchases and upgrades hacknet nodes, buys something if the cost of the upgrade is less than 1/20 of your money


netManager = await ns.prompt("Activate Hacknet Manager?");
async function hnManager() {
let mode = ["Level", "Ram", "Core"]
if (checkM(ns.hacknet.getPurchaseNodeCost(), 20)) { ns.hacknet.purchaseNode() }
for (let i = 0; i < ns.hacknet.numNodes(); i++) {
for (let n = 0; n < 3; n++) {
if (checkM(ns.hacknet["get" + mode[n] + "UpgradeCost"](i), 20)) {
ns.hacknet["upgrade" + mode[n]](i);
}
}
}
}



Player Server Manager
Purchases and "upgrades" (deletes and re buys) player servers, will buy the highest amount of RAM it can with 1/20 of your money


serverManager = await ns.prompt("Auto buy and upgrade player servers?");
async function pServerManager() {
let canAfford = 0; let ram = [8]; for (let i = 0; ram[i] < 1048576; i++) { ram.push(ram[i] * 2) }
for (let i = 0; checkM(ns.getPurchasedServerCost(ram[i]), 20) && i < ram.length; i++) { canAfford = ram[i] }
if (ns.getPurchasedServers().length < 25 && canAfford > 0) { ns.purchaseServer("SERVER-" + ns.nFormat(canAfford * 1000000000, "0.0b"), canAfford) }
for (let i = ns.getPurchasedServers().length - 1; i >= 0; i--) {
temp = ns.getPurchasedServers()[i]
if (ns.getServerMaxRam(temp) < canAfford && checkM(ns.getPurchasedServerCost(canAfford), 20)) {
ns.killall(temp); ns.deleteServer(temp); ns.purchaseServer("SERVER-" + ns.nFormat(canAfford * 1000000000, "0.0b"), canAfford);
}
}
}



266 Comments
DarkTesseract 13 Sep, 2024 @ 9:55pm 
not sure if I quite got this right yet, but I *think* the "weaken loop" it sometimes gets stuck on can get partially fixed by going to line 92/93 and switching around .15 and .80? from what I can tell, it's weakening during 'grow mode' way more often than it's actually growing, and doing that seems to have made the money generation start working
AR45H 16 Mar, 2024 @ 6:15pm 
nvm, I just looked at the code and it doesn't even use the upgrade function. Safe to say it's very outdated.
AR45H 16 Mar, 2024 @ 6:13pm 
Thanks for the updated code @<script>alert(`lmao`);</script>,
Does the script buy servers for the heck of it? I don't see it use em at all.
<script>alert(`lmao`);</script> 28 Feb, 2024 @ 8:03am 
wget https://pastebin.com/raw/SqapV1ZP main.js

Updated on latest API, removed deprecations :steamhappy:
Manguard 3 Dec, 2023 @ 4:10am 
Replace line 42 with the following code: " ns.print(`║ ${act[t[1]]} ║ ${str(t[1])}` + `${ns.formatNumber(info('MA', t[1]), '0a')} / ${ns.formatNumber(info('MM', t[1]), '0a')} : ${ns.formatPercent(info('MA', t[1]) / info('MM', t[1]), '0%')} ║`.padStart(36 - str(t[1]).length))"

Replace Line 65 with the following: " await ns.scp(files, server, 'home')"

Replace Line 116 with the following: " function buyServer(r) { ns.purchaseServer('SERVER-' + ns.formatNumber(r * 1000000000, '0.0b'), r) }"

Cheers and make sure to thank me later.
borandi 17 Sep, 2023 @ 5:21am 
change:
await ns.scp(files, 'home', server)
to
await ns.scp(files, server, 'home')
CynerG 14 Nov, 2022 @ 6:24pm 
if this script is stuck on weaken change the following:

if (info('SL', target) > info('MSL', target) + 5 || loop)

to

if (info('SL', target) > info('MSL', target) + 5 && loop)

mines still only hacking a single server but it is at least producing
PG SDVX  [author] 21 Oct, 2022 @ 9:42pm 
Completely forgot, updated the title as I don't have time to update these days
TheRatMan 21 Oct, 2022 @ 11:28am 
its only useing home to weak and grow
Mycroft Jr. 26 Aug, 2022 @ 2:19am 
@IAM049 the hacknet manager tends to do that, yes
I usually don't run it