Advertisement
Guest User

masterHack.js V2

a guest
Jan 19th, 2022
2,272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** @param {NS} ns **/
  2. export async function main(ns) {
  3.     // Parameters
  4.     // param 1: Server you want to hack
  5.     // param 2: OPTIONAL - Server you want to start the hack from, i.e. any public servers, purchased servers or 'home'
  6.     //
  7.     // EXAMPLE 1: run masterHack.js joesguns
  8.     // This will start hacking 'joesguns' using the RAM of 'joesguns'
  9.     //
  10.     // EXAMPLE 2: run masterHack.js joesguns s1
  11.     // This will start hacking 'joesguns' using the RAM of my purchased server 's1'
  12.     //
  13.     // This 'masterHack.js' process will stay active on whatever server you execute it from.
  14.     // I usually start it from 'home', then I can track all my earnings in one place.
  15.     // Keep in mind, when using 'home' as second parameter the script might use all available RAM
  16.     // and you might become unable to execute any other scripts on 'home' until you kill the process.
  17.  
  18.     var target = ns.args[0];
  19.     var serverToHackFrom = target; // For single argument calls - server will hack itself
  20.     var hackScript = "hack.js";
  21.     var growScript = "grow.js";
  22.     var weakenScript = "weaken.js";
  23.     var growScriptRAM = ns.getScriptRam(growScript);
  24.     var serverMaxMoney = ns.getServerMaxMoney(target);
  25.     var serverMaxRAM;
  26.     // var batchServers;
  27.     var moneyThresh = serverMaxMoney * 0.9; // 0.90 to maintain near 100% server money.  You can use 0.75 when starting out/using low thread counts
  28.     var securityThresh = ns.getServerMinSecurityLevel(target) + 5;
  29.     var currentServerMoney;
  30.     var currentServerSecurity;
  31.     var useThreadsHack, useThreadsWeaken1, useThreadsWeaken2, useThreadsGrow;
  32.     var possibleThreads;
  33.     var maxHackFactor = 0.01;
  34.     var growWeakenRatio = 0.9; // How many threads are used for growing vs. weaking (90:10).
  35.     var sleepTimeHack, sleepTimeGrow, sleepTimeWeaken, sleepDelay = 200; // Sleep delay should range between 20ms and 200ms as per the documentation. I'll keep the default at 200, adjust as needed.
  36.  
  37.     // If second argument is provided, hack will run from this server instead
  38.     if (ns.args[1]) {
  39.         /* if(ns.args[1] == "batch")
  40.             batchServers = ns.getPurchasedServers();
  41.         else */
  42.             serverToHackFrom = ns.args[1];
  43.     }
  44.     serverMaxRAM = ns.getServerMaxRam(serverToHackFrom);
  45.  
  46.     // Gain root access. Make sure you have the nuke.js script on 'home'
  47.     if (!ns.hasRootAccess(target)) {
  48.         ns.exec("nuke.js", "home", 1, target);
  49.         await ns.sleep(1000);
  50.     }
  51.  
  52.     // Copy the work scripts, if not already on server
  53.     if (!ns.fileExists(hackScript, serverToHackFrom)) {
  54.         await ns.scp(hackScript, "home", serverToHackFrom);
  55.     }
  56.     if (!ns.fileExists(growScript, serverToHackFrom)) {
  57.         await ns.scp(growScript, "home", serverToHackFrom);
  58.     }
  59.     if (!ns.fileExists(weakenScript, serverToHackFrom)) {
  60.         await ns.scp(weakenScript, "home", serverToHackFrom);
  61.     }
  62.  
  63.     // To prevent the script from crashing/terminating after closing and restarting the game.
  64.     while (ns.isRunning(hackScript, serverToHackFrom, target) || ns.isRunning(growScript, serverToHackFrom, target) || ns.isRunning(weakenScript, serverToHackFrom, target)) {
  65.         await ns.sleep(10000);
  66.     }
  67.  
  68.     // Main loop - will terminate if no RAM available
  69.     while (3 < (possibleThreads = Math.floor((serverMaxRAM - ns.getServerUsedRam(serverToHackFrom)) / growScriptRAM))) {
  70.         currentServerMoney = ns.getServerMoneyAvailable(target);
  71.         currentServerSecurity = ns.getServerSecurityLevel(target);
  72.  
  73.         // The first to cases are for new servers with high SECURITY LEVELS and to quickly grow the server to above the threshold
  74.         if (currentServerSecurity > securityThresh && currentServerMoney < moneyThresh) {
  75.             sleepTimeWeaken = ns.getWeakenTime(target) + sleepDelay; // Added 100 milliseconds to the 'sleepTime' variables to prevent any issues with overlapping work scripts
  76.             ns.exec(growScript, serverToHackFrom, Math.ceil(possibleThreads / 2), target);
  77.             ns.exec(weakenScript, serverToHackFrom, Math.floor(possibleThreads / 2), target);
  78.             await ns.sleep(sleepTimeWeaken); // wait for the weaken command to finish
  79.         } else if (currentServerMoney < moneyThresh) {
  80.             sleepTimeWeaken = ns.getWeakenTime(target) + sleepDelay;
  81.             ns.exec(growScript, serverToHackFrom, Math.floor(possibleThreads * growWeakenRatio), target);
  82.             ns.exec(weakenScript, serverToHackFrom, Math.ceil(possibleThreads * (1 - growWeakenRatio)), target);
  83.             await ns.sleep(sleepTimeWeaken); // wait for the weaken command to finish
  84.         } else {
  85.             // Define max amount that can be restored with one grow and therefore will be used to define hack threads.
  86.             // The max grow threads are considering the weaken threads needed to weaken hack security and the weaken threads needed to weaken grow security.
  87.             // I didn't bother optimizing the 'growWeakenRatio' further, as 90% is good enough already. It will be just a few more hack threads, if any at all - even with large RAM sizes.
  88.             while (maxHackFactor < 0.999 &&
  89.                 Math.floor((possibleThreads - (useThreadsHack = Math.floor(ns.hackAnalyzeThreads(target, currentServerMoney * maxHackFactor))) - Math.ceil(useThreadsHack / 25)) * growWeakenRatio)
  90.                 > Math.ceil(ns.growthAnalyze(target, serverMaxMoney / (serverMaxMoney * (1 - maxHackFactor))))) {
  91.                 maxHackFactor += 0.001; // increase by 0.1% with each iteration
  92.             }
  93.             maxHackFactor -= 0.001; // Since it's more than 'possibleThreads' can handle now, we need to dial it back once.
  94.             useThreadsHack = Math.floor(ns.hackAnalyzeThreads(target, currentServerMoney * maxHackFactor)); // Forgot this in the first version.
  95.             useThreadsWeaken1 = Math.ceil(useThreadsHack / 25); // You can weaken the security of 25 hack threads with 1 weaken thread
  96.             useThreadsGrow = Math.floor((possibleThreads - useThreadsWeaken1 - useThreadsHack) * growWeakenRatio);
  97.             useThreadsWeaken2 = possibleThreads - useThreadsHack - useThreadsGrow - useThreadsWeaken1;
  98.             sleepTimeHack = ns.getHackTime(target);
  99.             sleepTimeGrow = ns.getGrowTime(target);
  100.             sleepTimeWeaken = ns.getWeakenTime(target);
  101.             ns.exec(weakenScript, serverToHackFrom, useThreadsWeaken1, target, "1");
  102.             await ns.sleep(2 * sleepDelay);
  103.             ns.exec(weakenScript, serverToHackFrom, useThreadsWeaken2, target, "2"); // Second weaken script runs after the first
  104.             await ns.sleep(sleepTimeWeaken - sleepTimeGrow - sleepDelay);
  105.             ns.exec(growScript, serverToHackFrom, useThreadsGrow, target); // Grow script ends before second weaken script
  106.             await ns.sleep(sleepTimeGrow - sleepTimeHack - 2 * sleepDelay);
  107.             ns.exec(hackScript, serverToHackFrom, useThreadsHack, target); // Hack script ends before first weaken script
  108.             await ns.sleep(sleepTimeHack + 4 * sleepDelay); // wait after second weaken script
  109.             maxHackFactor = 0.01;
  110.         }
  111.     }
  112.     ns.tprint("Script was terminated. Not enough RAM available on '" + serverToHackFrom + "'.")
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement