moriakaice / bitburner

Collection of scripts for https://danielyxie.github.io/bitburner/
ISC License
114 stars 145 forks source link

Concurrent Calls Error #10

Open Flashdime opened 2 years ago

Flashdime commented 2 years ago

I know this has been discussed already, but I still get a Concurrent Calls error trying to run mainHack.ns even after deleting the *1000 at end of lines 181-183. Is there something else I've missed? thanks

image

Eugney commented 2 years ago

const settings = { homeRamReserved: 20, homeRamReservedBase: 20, homeRamExtraRamReserved: 12, homeRamBigMode: 64, minSecurityLevelOffset: 1, maxMoneyMultiplayer: 0.9, minSecurityWeight: 100, mapRefreshInterval: 24 60 60 1000, maxWeakenTime: 30 60 * 1000, keys: { serverMap: 'BB_SERVER_MAP', }, changes: { hack: 0.002, grow: 0.004, weaken: 0.05, }, }

function getItem(key) { let item = localStorage.getItem(key)

return item ? JSON.parse(item) : undefined }

function setItem(key, value) { localStorage.setItem(key, JSON.stringify(value)) }

const hackPrograms = ['BruteSSH.exe', 'FTPCrack.exe', 'relaySMTP.exe', 'HTTPWorm.exe', 'SQLInject.exe'] const hackScripts = ['hack.ns', 'grow.ns', 'weaken.ns']

function getPlayerDetails(ns) { let portHacks = 0

hackPrograms.forEach((hackProgram) => { if (ns.fileExists(hackProgram, 'home')) { portHacks += 1 } })

return { hackingLevel: ns.getHackingLevel(), portHacks, } }

function convertMSToHHMMSS(ms = 0) { if (ms <= 0) { return '00:00:00' }

if (!ms) { ms = new Date().getTime() }

return new Date(ms).toISOString().substr(11, 8) }

function localeHHMMSS(ms = 0) { if (!ms) { ms = new Date().getTime() }

return new Date(ms).toLocaleTimeString() }

function numberWithCommas(x) { return x.toString().replace(/\B(?<!.\d*)(?=(\d{3})+(?!\d))/g, ',') }

function createUUID() { var dt = new Date().getTime() var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (dt + Math.random() * 16) % 16 | 0 dt = Math.floor(dt / 16) return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16) }) return uuid }

function weakenCyclesForGrow(growCycles) { return Math.max(0, Math.ceil(growCycles * (settings.changes.grow / settings.changes.weaken))) }

function weakenCyclesForHack(hackCycles) { return Math.max(0, Math.ceil(hackCycles * (settings.changes.hack / settings.changes.weaken))) }

async function getHackableServers(ns, servers) { const playerDetails = getPlayerDetails(ns)

const hackableServers = Object.keys(servers) .filter((hostname) => ns.serverExists(hostname)) .filter((hostname) => servers[hostname].ports <= playerDetails.portHacks || ns.hasRootAccess(hostname)) .filter((hostname) => servers[hostname].ram >= 2)

for (const hostname of hackableServers) { if (hostname === 'home') continue; if (!ns.hasRootAccess(hostname)) { hackPrograms.forEach((hackProgram) => { if (ns.fileExists(hackProgram, 'home')) { nshackProgram.split('.').shift().toLocaleLowerCase() } }) ns.nuke(hostname) } await ns.scp(hackScripts, hostname)

}

hackableServers.sort((a, b) => servers[a].ram - servers[b].ram) return hackableServers }

function findTargetServer(ns, serversList, servers, serverExtraData) { const playerDetails = getPlayerDetails(ns)

serversList = serversList .filter((hostname) => servers[hostname].hackingLevel <= playerDetails.hackingLevel) .filter((hostname) => servers[hostname].maxMoney) .filter((hostname) => hostname !== 'home') .filter((hostname) => ns.getWeakenTime(hostname) < settings.maxWeakenTime)

let weightedServers = serversList.map((hostname) => { const fullHackCycles = Math.ceil(100 / Math.max(0.00000001, ns.hackAnalyze(hostname)))

serverExtraData[hostname] = {
  fullHackCycles,
}

const serverValue = servers[hostname].maxMoney * (settings.minSecurityWeight / (servers[hostname].minSecurityLevel + ns.getServerSecurityLevel(hostname)))

return {
  hostname,
  serverValue,
  minSecurityLevel: servers[hostname].minSecurityLevel,
  securityLevel: ns.getServerSecurityLevel(hostname),
  maxMoney: servers[hostname].maxMoney,
}

})

weightedServers.sort((a, b) => b.serverValue - a.serverValue) ns.print(JSON.stringify(weightedServers, null, 2))

return weightedServers.map((server) => server.hostname) }

export async function main(ns) { ns.tprint([${localeHHMMSS()}] Starting mainHack.ns)

let hostname = ns.getHostname()

if (hostname !== 'home') { throw new Exception('Run the script from home') }

while (true) { const serverExtraData = {} const serverMap = getItem(settings.keys.serverMap) if (serverMap.servers.home.ram >= settings.homeRamBigMode) { settings.homeRamReserved = settings.homeRamReservedBase + settings.homeRamExtraRamReserved }

if (!serverMap || serverMap.lastUpdate < new Date().getTime() - settings.mapRefreshInterval) {
  ns.tprint(`[${localeHHMMSS()}] Spawning spider.ns`)
  ns.spawn('spider.ns', 1, 'mainHack.ns')
  ns.exit()
  return
}
serverMap.servers.home.ram = Math.max(0, serverMap.servers.home.ram - settings.homeRamReserved)

const hackableServers = await getHackableServers(ns, serverMap.servers)

const targetServers = findTargetServer(ns, hackableServers, serverMap.servers, serverExtraData)
const bestTarget = targetServers.shift()
const hackTime = ns.getHackTime(bestTarget) 
const growTime = ns.getGrowTime(bestTarget) 
const weakenTime = ns.getWeakenTime(bestTarget) 

const growDelay = Math.max(0, weakenTime - growTime - 15 * 1000)
const hackDelay = Math.max(0, growTime + growDelay - hackTime - 15 * 1000)

const securityLevel = ns.getServerSecurityLevel(bestTarget)
const money = ns.getServerMoneyAvailable(bestTarget)

let action = 'weaken'
if (securityLevel > serverMap.servers[bestTarget].minSecurityLevel + settings.minSecurityLevelOffset) {
  action = 'weaken'
} else if (money < serverMap.servers[bestTarget].maxMoney * settings.maxMoneyMultiplayer) {
  action = 'grow'
} else {
  action = 'hack'
}

let hackCycles = 0
let growCycles = 0
let weakenCycles = 0

for (let i = 0; i < hackableServers.length; i++) {
  const server = serverMap.servers[hackableServers[i]]
  hackCycles += Math.floor(server.ram / 1.7)
  growCycles += Math.floor(server.ram / 1.75)
}
weakenCycles = growCycles

ns.tprint(
  `[${localeHHMMSS()}] Selected ${bestTarget} for a target. Planning to ${action} the server. Will wake up around ${localeHHMMSS(
    new Date().getTime() + weakenTime + 300
  )}`
)
ns.tprint(
  `[${localeHHMMSS()}] Stock values: baseSecurity: ${serverMap.servers[bestTarget].baseSecurityLevel}; minSecurity: ${serverMap.servers[bestTarget].minSecurityLevel
  }; maxMoney: $${numberWithCommas(parseInt(serverMap.servers[bestTarget].maxMoney, 10))}`
)
ns.tprint(`[${localeHHMMSS()}] Current values: security: ${Math.floor(securityLevel * 1000) / 1000}; money: $${numberWithCommas(parseInt(money, 10))}`)
ns.tprint(
  `[${localeHHMMSS()}] Time to: hack: ${convertMSToHHMMSS(hackTime)}; grow: ${convertMSToHHMMSS(growTime)}; weaken: ${convertMSToHHMMSS(weakenTime)}`
)
ns.tprint(`[${localeHHMMSS()}] Delays: ${convertMSToHHMMSS(hackDelay)} for hacks, ${convertMSToHHMMSS(growDelay)} for grows`)

if (action === 'weaken') {
  if (settings.changes.weaken * weakenCycles > securityLevel - serverMap.servers[bestTarget].minSecurityLevel) {
    weakenCycles = Math.ceil((securityLevel - serverMap.servers[bestTarget].minSecurityLevel) / settings.changes.weaken)
    growCycles -= weakenCycles
    growCycles = Math.max(0, growCycles)

    weakenCycles += weakenCyclesForGrow(growCycles)
    growCycles -= weakenCyclesForGrow(growCycles)
    growCycles = Math.max(0, growCycles)
  } else {
    growCycles = 0
  }

  ns.tprint(
    `[${localeHHMMSS()}] Cycles ratio: ${growCycles} grow cycles; ${weakenCycles} weaken cycles; expected security reduction: ${Math.floor(settings.changes.weaken * weakenCycles * 1000) / 1000
    }`
  )

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.75))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, growCycles))

    if (growCycles) {
      await ns.exec('grow.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, growDelay, createUUID())
      growCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
} else if (action === 'grow') {
  weakenCycles = weakenCyclesForGrow(growCycles)
  growCycles -= weakenCycles

  ns.tprint(`[${localeHHMMSS()}] Cycles ratio: ${growCycles} grow cycles; ${weakenCycles} weaken cycles`)

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.75))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, growCycles))

    if (growCycles) {
      await ns.exec('grow.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, growDelay, createUUID())
      growCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
} else {
  if (hackCycles > serverExtraData[bestTarget].fullHackCycles) {
    hackCycles = serverExtraData[bestTarget].fullHackCycles

    if (hackCycles * 100 < growCycles) {
      hackCycles *= 10
    }

    growCycles = Math.max(0, growCycles - Math.ceil((hackCycles * 1.7) / 1.75))

    weakenCycles = weakenCyclesForGrow(growCycles) + weakenCyclesForHack(hackCycles)
    growCycles -= weakenCycles
    hackCycles -= Math.ceil((weakenCyclesForHack(hackCycles) * 1.75) / 1.7)

    growCycles = Math.max(0, growCycles)
  } else {
    growCycles = 0
    weakenCycles = weakenCyclesForHack(hackCycles)
    hackCycles -= Math.ceil((weakenCycles * 1.75) / 1.7)
  }

  ns.tprint(`[${localeHHMMSS()}] Cycles ratio: ${hackCycles} hack cycles; ${growCycles} grow cycles; ${weakenCycles} weaken cycles`)

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.7))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, hackCycles))

    if (hackCycles) {
      await ns.exec('hack.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, hackDelay, createUUID())
      hackCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    const freeRam = server.ram - cyclesToRun * 1.7
    cyclesFittable = Math.max(0, Math.floor(freeRam / 1.75))

    if (cyclesFittable && growCycles) {
      const growCyclesToRun = Math.min(growCycles, cyclesFittable)

      await ns.exec('grow.ns', server.host, growCyclesToRun, bestTarget, growCyclesToRun, growDelay, createUUID())
      growCycles -= growCyclesToRun
      cyclesFittable -= growCyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
}

await ns.sleep(weakenTime + 300)

} }

Flashdime commented 2 years ago

Thank you! I had to do a little bit of troubleshooting on that, but much easier than trying to figure out the concurrent calls. Pasting the final troubleshooted code, possibly screwed some functionality up but it works so...

const settings = { homeRamReserved: 20, homeRamReservedBase: 20, homeRamExtraRamReserved: 12, homeRamBigMode: 64, minSecurityLevelOffset: 1, maxMoneyMultiplayer: 0.9, minSecurityWeight: 100, mapRefreshInterval: 24 60 60 1000, maxWeakenTime: 30 60 * 1000, keys: { serverMap: 'BB_SERVER_MAP', }, changes: { hack: 0.002, grow: 0.004, weaken: 0.05, }, }

function getItem(key) { let item = localStorage.getItem(key)

return item ? JSON.parse(item) : undefined }

function setItem(key, value) { localStorage.setItem(key, JSON.stringify(value)) }

const hackPrograms = ['BruteSSH.exe', 'FTPCrack.exe', 'relaySMTP.exe', 'HTTPWorm.exe', 'SQLInject.exe'] const hackScripts = ['hack.ns', 'grow.ns', 'weaken.ns']

function getPlayerDetails(ns) { let portHacks = 0

hackPrograms.forEach((hackProgram) => { if (ns.fileExists(hackProgram, 'home')) { portHacks += 1 } })

return { hackingLevel: ns.getHackingLevel(), portHacks, } }

function convertMSToHHMMSS(ms = 0) { if (ms <= 0) { return '00:00:00' }

if (!ms) { ms = new Date().getTime() }

return new Date(ms).toISOString().substr(11, 8) }

function localeHHMMSS(ms = 0) { if (!ms) { ms = new Date().getTime() }

return new Date(ms).toLocaleTimeString() }

function numberWithCommas(x) { return x.toString().replace(/\B(?<!.\d*)(?=(\d{3})+(?!\d))/g, ',') }

function createUUID() { var dt = new Date().getTime() var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (dt + Math.random() * 16) % 16 | 0 dt = Math.floor(dt / 16) return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16) }) return uuid }

function weakenCyclesForGrow(growCycles) { return Math.max(0, Math.ceil(growCycles * (settings.changes.grow / settings.changes.weaken))) }

function weakenCyclesForHack(hackCycles) { return Math.max(0, Math.ceil(hackCycles * (settings.changes.hack / settings.changes.weaken))) }

async function getHackableServers(ns, servers) { const playerDetails = getPlayerDetails(ns)

const hackableServers = Object.keys(servers) .filter((hostname) => ns.serverExists(hostname)) .filter((hostname) => servers[hostname].ports <= playerDetails.portHacks || ns.hasRootAccess(hostname)) .filter((hostname) => servers[hostname].ram >= 2)

for (const hostname of hackableServers) { if (hostname === 'home') continue; if (!ns.hasRootAccess(hostname)) { hackPrograms.forEach((hackProgram) => { if (ns.fileExists(hackProgram, 'home')) { hackProgram.split('.').shift().toLocaleLowerCase() } }) } await ns.scp(hackScripts, hostname)

}

hackableServers.sort((a, b) => servers[a].ram - servers[b].ram) return hackableServers }

function findTargetServer(ns, serversList, servers, serverExtraData) { const playerDetails = getPlayerDetails(ns)

serversList = serversList .filter((hostname) => servers[hostname].hackingLevel <= playerDetails.hackingLevel) .filter((hostname) => servers[hostname].maxMoney) .filter((hostname) => hostname !== 'home') .filter((hostname) => ns.getWeakenTime(hostname) < settings.maxWeakenTime)

let weightedServers = serversList.map((hostname) => { const fullHackCycles = Math.ceil(100 / Math.max(0.00000001, ns.hackAnalyze(hostname)))

serverExtraData[hostname] = {
  fullHackCycles,
}

const serverValue = servers[hostname].maxMoney * (settings.minSecurityWeight / (servers[hostname].minSecurityLevel + ns.getServerSecurityLevel(hostname)))

return {
  hostname,
  serverValue,
  minSecurityLevel: servers[hostname].minSecurityLevel,
  securityLevel: ns.getServerSecurityLevel(hostname),
  maxMoney: servers[hostname].maxMoney,
}

})

weightedServers.sort((a, b) => b.serverValue - a.serverValue) ns.print(JSON.stringify(weightedServers, null, 2))

return weightedServers.map((server) => server.hostname) }

export async function main(ns) { ns.tprint('[${ localeHHMMSS() }] Starting mainHack.ns')

let hostname = ns.getHostname()

if (hostname !== 'home') { throw new Exception('Run the script from home') }

while (true) { const serverExtraData = {} const serverMap = getItem(settings.keys.serverMap) if (serverMap.servers.home.ram >= settings.homeRamBigMode) { settings.homeRamReserved = settings.homeRamReservedBase + settings.homeRamExtraRamReserved }

if (!serverMap || serverMap.lastUpdate < new Date().getTime() - settings.mapRefreshInterval) {
  ns.tprint(`[${localeHHMMSS()}] Spawning spider.ns`)
  ns.spawn('spider.ns', 1, 'mainHack.ns')
  ns.exit()
  return
}
serverMap.servers.home.ram = Math.max(0, serverMap.servers.home.ram - settings.homeRamReserved)

const hackableServers = await getHackableServers(ns, serverMap.servers)

const targetServers = findTargetServer(ns, hackableServers, serverMap.servers, serverExtraData)
const bestTarget = targetServers.shift()
const hackTime = ns.getHackTime(bestTarget)
const growTime = ns.getGrowTime(bestTarget)
const weakenTime = ns.getWeakenTime(bestTarget)

const growDelay = Math.max(0, weakenTime - growTime - 15 * 1000)
const hackDelay = Math.max(0, growTime + growDelay - hackTime - 15 * 1000)

const securityLevel = ns.getServerSecurityLevel(bestTarget)
const money = ns.getServerMoneyAvailable(bestTarget)

let action = 'weaken'
if (securityLevel > serverMap.servers[bestTarget].minSecurityLevel + settings.minSecurityLevelOffset) {
  action = 'weaken'
} else if (money < serverMap.servers[bestTarget].maxMoney * settings.maxMoneyMultiplayer) {
  action = 'grow'
} else {
  action = 'hack'
}

let hackCycles = 0
let growCycles = 0
let weakenCycles = 0

for (let i = 0; i < hackableServers.length; i++) {
  const server = serverMap.servers[hackableServers[i]]
  hackCycles += Math.floor(server.ram / 1.7)
  growCycles += Math.floor(server.ram / 1.75)
}
weakenCycles = growCycles

ns.tprint(
  `[${localeHHMMSS()}] Selected ${bestTarget} for a target. Planning to ${action} the server. Will wake up around ${localeHHMMSS(
    new Date().getTime() + weakenTime + 300
  )}`
)
ns.tprint(
  `[${localeHHMMSS()}] Stock values: baseSecurity: ${serverMap.servers[bestTarget].baseSecurityLevel}; minSecurity: ${serverMap.servers[bestTarget].minSecurityLevel
  }; maxMoney: $${numberWithCommas(parseInt(serverMap.servers[bestTarget].maxMoney, 10))}`
)
ns.tprint(`[${localeHHMMSS()}] Current values: security: ${Math.floor(securityLevel * 1000) / 1000}; money: $${numberWithCommas(parseInt(money, 10))}`)
ns.tprint(
  `[${localeHHMMSS()}] Time to: hack: ${convertMSToHHMMSS(hackTime)}; grow: ${convertMSToHHMMSS(growTime)}; weaken: ${convertMSToHHMMSS(weakenTime)}`
)
ns.tprint(`[${localeHHMMSS()}] Delays: ${convertMSToHHMMSS(hackDelay)} for hacks, ${convertMSToHHMMSS(growDelay)} for grows`)

if (action === 'weaken') {
  if (settings.changes.weaken * weakenCycles > securityLevel - serverMap.servers[bestTarget].minSecurityLevel) {
    weakenCycles = Math.ceil((securityLevel - serverMap.servers[bestTarget].minSecurityLevel) / settings.changes.weaken)
    growCycles -= weakenCycles
    growCycles = Math.max(0, growCycles)

    weakenCycles += weakenCyclesForGrow(growCycles)
    growCycles -= weakenCyclesForGrow(growCycles)
    growCycles = Math.max(0, growCycles)
  } else {
    growCycles = 0
  }

  ns.tprint(
    `[${localeHHMMSS()}] Cycles ratio: ${growCycles} grow cycles; ${weakenCycles} weaken cycles; expected security reduction: ${Math.floor(settings.changes.weaken * weakenCycles * 1000) / 1000
    }`
  )

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.75))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, growCycles))

    if (growCycles) {
      await ns.exec('grow.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, growDelay, createUUID())
      growCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
} else if (action === 'grow') {
  weakenCycles = weakenCyclesForGrow(growCycles)
  growCycles -= weakenCycles

  ns.tprint(`[${localeHHMMSS()}] Cycles ratio: ${growCycles} grow cycles; ${weakenCycles} weaken cycles`)

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.75))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, growCycles))

    if (growCycles) {
      await ns.exec('grow.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, growDelay, createUUID())
      growCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
} else {
  if (hackCycles > serverExtraData[bestTarget].fullHackCycles) {
    hackCycles = serverExtraData[bestTarget].fullHackCycles

    if (hackCycles * 100 < growCycles) {
      hackCycles *= 10
    }

    growCycles = Math.max(0, growCycles - Math.ceil((hackCycles * 1.7) / 1.75))

    weakenCycles = weakenCyclesForGrow(growCycles) + weakenCyclesForHack(hackCycles)
    growCycles -= weakenCycles
    hackCycles -= Math.ceil((weakenCyclesForHack(hackCycles) * 1.75) / 1.7)

    growCycles = Math.max(0, growCycles)
  } else {
    growCycles = 0
    weakenCycles = weakenCyclesForHack(hackCycles)
    hackCycles -= Math.ceil((weakenCycles * 1.75) / 1.7)
  }

  ns.tprint(`[${localeHHMMSS()}] Cycles ratio: ${hackCycles} hack cycles; ${growCycles} grow cycles; ${weakenCycles} weaken cycles`)

  for (let i = 0; i < hackableServers.length; i++) {
    const server = serverMap.servers[hackableServers[i]]
    let cyclesFittable = Math.max(0, Math.floor(server.ram / 1.7))
    const cyclesToRun = Math.max(0, Math.min(cyclesFittable, hackCycles))

    if (hackCycles) {
      await ns.exec('hack.ns', server.host, cyclesToRun, bestTarget, cyclesToRun, hackDelay, createUUID())
      hackCycles -= cyclesToRun
      cyclesFittable -= cyclesToRun
    }

    const freeRam = server.ram - cyclesToRun * 1.7
    cyclesFittable = Math.max(0, Math.floor(freeRam / 1.75))

    if (cyclesFittable && growCycles) {
      const growCyclesToRun = Math.min(growCycles, cyclesFittable)

      await ns.exec('grow.ns', server.host, growCyclesToRun, bestTarget, growCyclesToRun, growDelay, createUUID())
      growCycles -= growCyclesToRun
      cyclesFittable -= growCyclesToRun
    }

    if (cyclesFittable) {
      await ns.exec('weaken.ns', server.host, cyclesFittable, bestTarget, cyclesFittable, 0, createUUID())
      weakenCycles -= cyclesFittable
    }
  }
}

await ns.sleep(weakenTime + 300)

} }

niklaren81 commented 2 years ago

just curious how do i change the code in mainHack.ns when it redownloads everytime i run start.ns?

dennym commented 2 years ago

@niklaren81 Just change the code in the ingame nano and start from running killAll.ns (which would be the next script that gets started from start.ns)

MRinus commented 2 years ago

@moriakaice Hey :) Great work! I'd just like to ask kindly if you could merge the pull request into your repo as it solved the discussed issues apparently a while ago :) <3