Skip to content
This repository has been archived by the owner on Sep 1, 2023. It is now read-only.

Concurrent Calls Error #10

Open
Flashdime opened this issue Dec 20, 2021 · 5 comments
Open

Concurrent Calls Error #10

Flashdime opened this issue Dec 20, 2021 · 5 comments

Comments

@Flashdime
Copy link

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
Copy link

Eugney commented Dec 20, 2021

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
Copy link
Author

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
Copy link

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

@dennym
Copy link

dennym commented Dec 20, 2021

@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
Copy link

MRinus commented Dec 25, 2021

@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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants