Für diejenigen, die hier etwas Nützliches suchen. Ich hoffe, Sie werden es nicht blind kopieren und in Ihr Spiel einfügen, sondern ein paar neue Ideen für die Strukturierung Ihres Codes finden.
Außerdem sehe ich mehrere Räume für Verbesserungen:
- Erstellen Sie einen Supervisor-Prozess, der nach neuen verfügbaren Knoten sucht und sie für Sie nukleiert, sodass Sie so etwas wie „run nuke-all-supervisor.js“ nur einmal pro Installation von Erweiterungen ausführen müssen.
- Ein weiterer Raum für Verbesserungen ist die Installation von Backdoor. Sie müssen jedoch ein wenig im Spiel vorankommen, um die erforderliche API freizuschalten.
Anwendungsbereich
Führen Sie nuke-all.js aus
Atomisiert alle Server, die Sie haben, um das Hacking-Level zu erreichen. So einfach wie es aussieht. Es ist keine weitere Aufmerksamkeit erforderlich. Das Branding-Image enthält meinen allerersten Schritt nach der Installation von Augments.
Speicherverbrauch
Wie Sie unten sehen können, liegt der Speicherverbrauch für dieses Skript unter 8 GB, was bedeutet, dass Sie es im frühen Spiel verwenden können. Ich habe erst jetzt erkannt, dass die getPurchasedServers-Funktion die Hälfte des RAM benötigt und nicht wirklich benötigt, sodass Sie den Speicherverbrauch für Ihre Anforderungen verbessern können.
[home ~/]> mem nuke-all.js Dieses Skript benötigt 4.75 GB RAM zur Ausführung für 1 Thread(s) 2.25 GB | getPurchasedServers (fn) 1.60 GB | Basiskosten (Sonstiges) 200.00 MB | scannen (fn) 100.00 MB | getServerRequiredHackingLevel (fn) 100.00 MB | getServerNumPortsRequired (fn) 100.00 MB | fileExists (fn) 50.00 MB | hasRootAccess (fn) 50.00 MB | getHackingLevel (fn) 50.00 MB | Atombombe (fn) 50.00 MB | brutal (fn) 50.00 MB | ftpcrack (fn) 50.00 MB | relaysmtp (fn) 50.00 MB | httpwurm (fn) 50.00 MB | sqlinject (fn)
Scripts
nuke-all.js – Ausführbares Skript verwendet Bibliotheksfunktionen, um das Verhalten zu verdeutlichen und zu vereinfachen.
import { erwerbenRootAccess, buildNetwork, networkToServerList } from 'utils' /** @param {NS} ns **/ export async function main(ns) { const network = buildNetwork(ns) const networkList = networkToServerList(network) const notNuked = networkList .filter((server) => !ns.hasRootAccess(server)) for (const host of notNuked) { erwerbenRootAccess(ns, host) } ns.toast(`${ns.getScriptName()} done`) }
Utils.js – Satz von Hilfs-/Bibliotheksfunktionen
/** * Gibt eine Liste von Callables zurück, die Sie verwenden können, um Ports auf dem angegebenen Server zu öffnen. * * @param {NS} ns * @returns {Array.<(server: string): void>} */ export function getAvailableMethods(ns) { const methods = [] for (const [method, file] of [ [ns .brutessh, 'BruteSSH.exe'], [ns.ftpcrack, 'FTPCrack.exe'], [ns.relaysmtp, 'relaySMTP.exe'], [ns.httpworm, 'HTTPWorm.exe'], [ns.sqlinject , 'SQLInject.exe'] ]) { if (ns.fileExists(file)) { methods.push(method) } } return methods } /** * Versuchen Sie, Root-Zugriff auf den Zielserver zu erlangen. * * @param {NS} ns * @param {string} Name des Zielservers, auf den Root-Zugriff erhalten werden soll. * @returns {boolean} War Versuch erfolgreich oder nicht. */ Exportfunktion erwerbenRootAccess(ns, Ziel) { if (!ns.hasRootAccess(target)) { if (ns.getHackingLevel() < ns.getServerRequiredHackingLevel(target)) { ns.print(`ERROR: Not enough hacking level for ${target}`) gebe false zurück } const methods = getAvailableMethods(ns); if (methods.length < ns.getServerNumPortsRequired(target)) { ns.print(`ERROR: Not enough breaking methods for ${target}`) return false } for (const method of methods) { method(target) } ns. nuke(target) } return true } /** * Einfache gerichtete Graphdarstellung eines Netzwerks, die aus * seinem Namen und einer Liste von untergeordneten Knoten besteht. * * @typedef {{name: string, children: NetworkNode[]}} NetworkNode */ /** * Gibt die Netzwerkdarstellung in Form eines gerichteten Graphen mit DFS zurück. * Der häufigste Fall ist, dass Sie sich nicht um Netzwerkknoten kümmern, die Sie * derzeit nicht nuklear machen können. Aus diesem Grund gibt diese Funktion nur Knoten für * zurück, für die Sie das Hacking-Level erreicht haben. * * @param {NS} ns * @param {string} name Name des Netzwerkknotens/Servers, mit dem wir arbeiten. * @param {string[]} used Liste der Knoten, die wir bereits verarbeitet haben. * @returns {NetworkNode} Gerichteter Graph */ Exportfunktion buildNetwork(ns, name = 'home', used = []) { used.push(name) const node = { name: name, children: [] } const serverList = ns.getPurchasedServers() for (const child of ns.scan(node.name)) { if (ns.getServerRequiredHackingLevel(child) <= ns.getHackingLevel() && !used.includes(child) && !serverList.includes(child ) ) { node.children.push(buildNetwork(ns, child, used)) } } return node } /** * Es ist nicht unbedingt erforderlich, mit einem Netzwerk in Form eines Diagramms zu arbeiten. * Manchmal müssen wir nur wissen, welche Knoten vorhanden sind. Dafür * ist diese Funktion da: Um das Datenstrukturformat von einem gerichteten * Graphen in eine einfache Liste von Netzwerkknoten zu konvertieren. * * @param {NetworkNode} node * @returns {string[]} Liste aller Server im Netzwerk. */ export function networkToServerList(node) { const list = [node.name] if (node.children.length) { for (const child of node.children) { list.push(...networkToServerList(child)) } } Rückgabeliste }
Das ist alles, was wir heute dafür teilen Bitbrenner führen. Dieses Handbuch wurde ursprünglich erstellt und geschrieben von koutoftimer. Falls wir dieses Handbuch nicht aktualisieren, finden Sie das neueste Update, indem Sie diesen folgen Link.