Advertisement
Guest User

controlHackScript

a guest
Sep 27th, 2024
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.70 KB | None | 0 0
  1. /** @param {NS} ns */
  2. export async function main(ns) {
  3. let supportServers = ns.getPurchasedServers()
  4. let hackServers = [
  5. 'harakiri-sushi',
  6. 'joesguns',
  7. 'hong-fang-tea',
  8. 'phantasy',
  9. 'the-hub',
  10. 'crush-fitness',
  11. 'silver-helix',
  12. 'omega-net',
  13. 'iron-gym',
  14. 'zer0',
  15. 'CSEC',
  16. 'avmnite-02h',
  17. 'max-hardware',
  18. //'computek',
  19. 'johnson-ortho'
  20. ]
  21. //let hackPercentage = .2 //TODO:CHANGE!!!!!change based on hack level and hackServer security.
  22. let availableServerRam;
  23.  
  24. let maxServerMoney;
  25. let currentServerMoney;
  26.  
  27. let serverSecurityLevel;
  28. let securityMin;
  29.  
  30. let serverStatus = {}; // Track thread usage per hack server
  31.  
  32. for (let hackServer of hackServers) {
  33. if (!ns.hasRootAccess(hackServer)) {
  34. ns.exec('nukeit.js', 'home', 1, hackServer)
  35. }
  36. if (!serverStatus[hackServer]) {
  37. serverStatus[hackServer] = { growth: 0, weaken: 0, hack: 0 };
  38. }
  39. }
  40. await ns.sleep(1000)
  41.  
  42. const basePort = 3000
  43. while (true) {
  44. for (let hackServer of hackServers) {
  45.  
  46. let hackPercentage = getHackPercentage(ns, hackServer)
  47. let growPort = basePort + hackServers.indexOf(hackServer) * 3;
  48. let weakenPort = growPort + 1;
  49. let hackPort = growPort + 2;
  50.  
  51. // Read results from ports dedicated to this hackServer
  52. let growResult = ns.readPort(growPort) || 'NULL PORT DATA';
  53. let weakenResult = ns.readPort(weakenPort) || 'NULL PORT DATA';
  54. let hackResult = ns.readPort(hackPort) || 'NULL PORT DATA';
  55.  
  56. // Update used threads based on results
  57. if (growResult !== 'NULL PORT DATA') {
  58. serverStatus[hackServer].growth -= parseInt(growResult);
  59. ns.print(`Growth completed for ${hackServer} with ${growResult} threads used.`);
  60. }
  61. if (weakenResult !== 'NULL PORT DATA') {
  62. serverStatus[hackServer].weaken -= parseInt(weakenResult);
  63. ns.print(`Weaken completed for ${hackServer} with ${weakenResult} threads used.`);
  64. }
  65. if (hackResult !== 'NULL PORT DATA') {
  66. serverStatus[hackServer].hack -= parseInt(hackResult);
  67. ns.print(`Hack completed for ${hackServer} with ${hackResult} threads used.`);
  68. }
  69. maxServerMoney = ns.getServerMaxMoney(hackServer);
  70. currentServerMoney = ns.getServerMoneyAvailable(hackServer)
  71.  
  72. serverSecurityLevel = ns.getServerSecurityLevel(hackServer);
  73. securityMin = ns.getServerMinSecurityLevel(hackServer) + 5;
  74.  
  75. if (serverSecurityLevel > securityMin) {
  76. let totalWeakenThreadsNeeded = getWeakenThreads(ns, serverSecurityLevel, securityMin, supportServers);
  77. if (serverStatus[hackServer].weaken < totalWeakenThreadsNeeded) {
  78. let threadsToLaunch = totalWeakenThreadsNeeded - serverStatus[hackServer].weaken;
  79. DistributeWeaken(ns, hackServer, supportServers, threadsToLaunch, weakenPort);
  80. }
  81. }
  82. if (currentServerMoney < (maxServerMoney * hackPercentage)) {
  83. let totalGrowthThreadsNeeded = getGrowThreads(ns, maxServerMoney, currentServerMoney, supportServers, hackServer, hackPercentage);
  84. if (serverStatus[hackServer].growth < totalGrowthThreadsNeeded) {
  85. let threadsToLaunch = totalGrowthThreadsNeeded - serverStatus[hackServer].growth;
  86. DistributeGrow(ns, threadsToLaunch, hackServer, supportServers, growPort);
  87. }
  88. }
  89. if ((currentServerMoney >= maxServerMoney * hackPercentage) && ns.getServerRequiredHackingLevel(hackServer) < ns.getHackingLevel()) {
  90. let totalHackThreadsNeeded = getHackThreads(ns, hackServer, hackPercentage, maxServerMoney, currentServerMoney);
  91.  
  92. if (serverStatus[hackServer].hack < totalHackThreadsNeeded) {
  93. let threadsToLaunch = totalHackThreadsNeeded - serverStatus[hackServer].hack;
  94. DistributeHack(ns, threadsToLaunch, hackServer, supportServers, hackPort, hackPercentage);
  95. }
  96. }
  97. }
  98. await ns.sleep(100);
  99. }
  100.  
  101.  
  102.  
  103. //returns total threads needed to complete weakening hackServer
  104. function getWeakenThreads(ns, serverSecurityLevel, securityMin, supportServers) {
  105. let totalWeakenThreadsNeeded = 0;
  106.  
  107. let securityDeficit = serverSecurityLevel - securityMin;
  108.  
  109. for (let supportServer of supportServers) {
  110. let serverCores = getServerCores(ns, supportServer)
  111. let weakenAnalyze = ns.weakenAnalyze(1, serverCores);
  112. let weakenThreadsNeeded = Math.ceil(securityDeficit / weakenAnalyze);
  113.  
  114. totalWeakenThreadsNeeded += weakenThreadsNeeded;
  115. securityDeficit -= weakenThreadsNeeded * weakenAnalyze;
  116.  
  117. if (securityDeficit <= 0) break; // If security is weakened enough, stop
  118. }
  119. return totalWeakenThreadsNeeded;
  120. }
  121.  
  122. function DistributeWeaken(ns, hackServer, supportServers, totalWeakenThreads, weakenPort) {
  123. let remainingWeaknessThreads = totalWeakenThreads
  124. for (let supportServer of supportServers) {
  125. if (remainingWeaknessThreads > 0) {
  126. let availableThreads = getAvailableThreads(ns, supportServer)
  127. let weakenThreadsToUse = Math.min(availableThreads, remainingWeaknessThreads)
  128. if (weakenThreadsToUse > 0) {
  129. ns.scp('weaken.js', supportServer, 'home')
  130. ns.exec('weaken.js', supportServer, weakenThreadsToUse, hackServer, weakenThreadsToUse, weakenPort)
  131. ns.print(`[${supportServer}] is weakening ${hackServer} using ${weakenThreadsToUse} threads / ${remainingWeaknessThreads}`);
  132. remainingWeaknessThreads -= weakenThreadsToUse
  133. serverStatus[hackServer].weaken += weakenThreadsToUse
  134. }
  135. }
  136. }
  137. }
  138.  
  139. function getGrowThreads(ns, maxServerMoney, currentServerMoney, supportServers, hackServer, hackPercentage) {
  140. let totalGrowthThreadsNeeded = 0;
  141. let growthTarget = maxServerMoney * hackPercentage;
  142.  
  143. let growthDeficit = growthTarget / currentServerMoney;
  144.  
  145. if (growthDeficit <= 1) {
  146. return 0;
  147. }
  148.  
  149. for (let supportServer of supportServers) {
  150. let serverCores = getServerCores(ns, supportServer);
  151.  
  152. let neededGrowthThreads = ns.growthAnalyze(hackServer, growthDeficit, serverCores);
  153.  
  154. totalGrowthThreadsNeeded += Math.ceil(neededGrowthThreads);
  155.  
  156. if (totalGrowthThreadsNeeded >= neededGrowthThreads) break;
  157. }
  158.  
  159. return totalGrowthThreadsNeeded;
  160. }
  161.  
  162.  
  163.  
  164.  
  165. function DistributeGrow(ns, totalGrowthThreads, hackServer, supportServers, growPort) {
  166. let remainingGrowthThreads = totalGrowthThreads
  167. for (let supportServer of supportServers) {
  168. if (remainingGrowthThreads > 0) {
  169. let availableThreads = getAvailableThreads(ns, supportServer)
  170. let growthThreadsToUse = Math.min(availableThreads, remainingGrowthThreads)
  171. if (growthThreadsToUse > 0) {
  172. ns.scp('growth.js', supportServer, 'home')
  173. ns.exec('growth.js', supportServer, growthThreadsToUse, hackServer, growthThreadsToUse, growPort)
  174. ns.print(`[${supportServer}] is growing ${hackServer} using ${growthThreadsToUse} threads / ${remainingGrowthThreads}`);
  175. serverStatus[hackServer].growth += growthThreadsToUse
  176. remainingGrowthThreads -= growthThreadsToUse;
  177. }
  178. }
  179. }
  180. }
  181.  
  182. function getHackThreads(ns, hackServer, hackPercentage, maxServerMoney, currentServerMoney) {
  183. let hackMoneyDelta = currentServerMoney - maxServerMoney * hackPercentage
  184. let neededHackThreads = ns.hackAnalyzeThreads(hackServer, hackMoneyDelta)
  185. return Math.ceil(neededHackThreads)
  186. }
  187.  
  188. function DistributeHack(ns, totalHackThreads, hackServer, supportServers, hackPort, hackPercentage) {
  189. let remainingHackThreads = totalHackThreads
  190. for (let supportServer of supportServers) {
  191. if (remainingHackThreads > 0) {
  192. let availableThreads = getAvailableThreads(ns, supportServer)
  193. let hackThreadsToUse = Math.min(availableThreads, remainingHackThreads)
  194. if (hackThreadsToUse > 0) {
  195. ns.scp('hack.js', supportServer, 'home')
  196. ns.exec('hack.js', supportServer, hackThreadsToUse, hackServer, hackThreadsToUse, hackPort)
  197. ns.tprint(`[${supportServer}] is hacking ${hackServer} ${hackPercentage}% using ${hackThreadsToUse} threads / ${remainingHackThreads}`);
  198. serverStatus[hackServer].hack += hackThreadsToUse
  199. remainingHackThreads -= hackThreadsToUse;
  200. }
  201. }
  202. }
  203. }
  204. function getAvailableThreads(ns, supportServer) {
  205. availableServerRam = (ns.getServerMaxRam(supportServer) - ns.getServerUsedRam(supportServer))
  206. return Math.floor(availableServerRam / 1.75)
  207. }
  208. function getServerCores(ns, supportServer) {
  209. return ns.getServer(supportServer).cpuCores
  210. }
  211. function getHackPercentage(ns, hackServer) {
  212. let maxMoney = ns.getServerMaxMoney(hackServer);
  213. let currentMoney = ns.getServerMoneyAvailable(hackServer);
  214. let securityLevel = ns.getServerSecurityLevel(hackServer);
  215. let minSecurity = ns.getServerMinSecurityLevel(hackServer);
  216. let hackingLevel = ns.getHackingLevel();
  217. let requiredHackingLevel = ns.getServerRequiredHackingLevel(hackServer);
  218. let growthMultiplier = ns.getServerGrowth(hackServer);
  219.  
  220. // Base percentage scales with how much money is available on the server
  221. let percentage = (currentMoney / maxMoney) * 0.5;
  222.  
  223. // Adjust percentage based on security level (penalize if security is high)
  224. let securityFactor = Math.max(0, 1 - ((securityLevel - minSecurity) / minSecurity));
  225. percentage *= securityFactor;
  226.  
  227. let levelFactor = Math.min(1, hackingLevel / (requiredHackingLevel * 1.5));
  228. percentage *= 1 + (levelFactor * 0.5);
  229.  
  230.  
  231. let growthFactor = Math.max(0.5, 100 / growthMultiplier);
  232. percentage *= growthFactor;
  233.  
  234. percentage = Math.min(Math.max(percentage, 0.05), 0.8);
  235.  
  236. return percentage;
  237. }
  238.  
  239. }
  240.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement