From 25e28df42b4323e437dcd071e37d0fbfca43fc4b Mon Sep 17 00:00:00 2001 From: Nikolai Korolev Date: Mon, 7 Mar 2022 16:18:58 +0300 Subject: [PATCH] Fix Static Ram Circumventing for all NS functions --- src/NetscriptFunctions.ts | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/NetscriptFunctions.ts b/src/NetscriptFunctions.ts index da3acdb4e..8877922c8 100644 --- a/src/NetscriptFunctions.ts +++ b/src/NetscriptFunctions.ts @@ -550,6 +550,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return calculatePercentMoneyHacked(server, Player); }, hackAnalyzeSecurity: function (threads: any): number { + updateDynamicRam("hackAnalyzeSecurity", getRamCost(Player, "hackAnalyzeSecurity")); return CONSTANTS.ServerFortifyAmount * threads; }, hackAnalyzeChance: function (hostname: any): any { @@ -564,6 +565,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return calculateHackingChance(server, Player); }, sleep: function (time: any): any { + updateDynamicRam("sleep", getRamCost(Player, "sleep")); if (time === undefined) { throw makeRuntimeErrorMsg("sleep", "Takes 1 argument."); } @@ -573,6 +575,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { }); }, asleep: function (time: any): any { + updateDynamicRam("asleep", getRamCost(Player, "asleep")); if (time === undefined) { throw makeRuntimeErrorMsg("asleep", "Takes 1 argument."); } @@ -650,6 +653,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return numCycleForGrowth(server, Number(growth), Player, cores); }, growthAnalyzeSecurity: function (threads: any): number { + updateDynamicRam("growthAnalyzeSecurity", getRamCost(Player, "growthAnalyzeSecurity")); return 2 * CONSTANTS.ServerFortifyAmount * threads; }, weaken: function (hostname: any, { threads: requestedThreads }: any = {}): any { @@ -702,10 +706,12 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { }); }, weakenAnalyze: function (threads: any, cores: any = 1): number { + updateDynamicRam("weakenAnalyze", getRamCost(Player, "weakenAnalyze")); const coreBonus = 1 + (cores - 1) / 16; return CONSTANTS.ServerWeakenAmount * threads * coreBonus * BitNodeMultipliers.ServerWeakenRate; }, share: function (): Promise { + updateDynamicRam("share", getRamCost(Player, "share")); workerScript.log("share", () => "Sharing this computer."); const end = StartSharing(workerScript.scriptRef.threads * calculateIntelligenceBonus(Player.intelligence, 2)); return netscriptDelay(10000, workerScript).finally(function () { @@ -714,21 +720,25 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { }); }, getSharePower: function (): number { + updateDynamicRam("getSharePower", getRamCost(Player, "getSharePower")); return CalculateShareMult(); }, print: function (...args: any[]): void { + updateDynamicRam("print", getRamCost(Player, "print")); if (args.length === 0) { throw makeRuntimeErrorMsg("print", "Takes at least 1 argument."); } workerScript.print(argsToString(args)); }, printf: function (format: string, ...args: any[]): void { + updateDynamicRam("printf", getRamCost(Player, "printf")); if (typeof format !== "string") { throw makeRuntimeErrorMsg("printf", "First argument must be string for the format."); } workerScript.print(vsprintf(format, args)); }, tprint: function (...args: any[]): void { + updateDynamicRam("tprint", getRamCost(Player, "tprint")); if (args.length === 0) { throw makeRuntimeErrorMsg("tprint", "Takes at least 1 argument."); } @@ -752,6 +762,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { Terminal.print(`${workerScript.scriptRef.filename}: ${str}`); }, tprintf: function (format: any, ...args: any): any { + updateDynamicRam("tprintf", getRamCost(Player, "tprintf")); if (typeof format !== "string") { throw makeRuntimeErrorMsg("tprintf", "First argument must be string for the format."); } @@ -776,9 +787,11 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { Terminal.print(`${str}`); }, clearLog: function (): any { + updateDynamicRam("clearLog", getRamCost(Player, "clearLog")); workerScript.scriptRef.clearLog(); }, disableLog: function (fn: any): any { + updateDynamicRam("disableLog", getRamCost(Player, "disableLog")); if (fn === "ALL") { for (fn of Object.keys(possibleLogs)) { workerScript.disableLogs[fn] = true; @@ -792,6 +805,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { } }, enableLog: function (fn: any): any { + updateDynamicRam("enableLog", getRamCost(Player, "enableLog")); if (fn === "ALL") { for (fn of Object.keys(possibleLogs)) { delete workerScript.disableLogs[fn]; @@ -804,12 +818,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { workerScript.log("enableLog", () => `Enabled logging for ${fn}`); }, isLogEnabled: function (fn: any): any { + updateDynamicRam("isLogEnabled", getRamCost(Player, "isLogEnabled")); if (possibleLogs[fn] === undefined) { throw makeRuntimeErrorMsg("isLogEnabled", `Invalid argument: ${fn}.`); } return workerScript.disableLogs[fn] ? false : true; }, getScriptLogs: function (fn: any, hostname: any, ...scriptArgs: any): any { + updateDynamicRam("getScriptLogs", getRamCost(Player, "getScriptLogs")); const runningScriptObj = getRunningScript(fn, hostname, "getScriptLogs", scriptArgs); if (runningScriptObj == null) { workerScript.log("getScriptLogs", () => getCannotFindRunningScriptErrorMessage(fn, hostname, scriptArgs)); @@ -819,6 +835,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return runningScriptObj.logs.slice(); }, tail: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any): any { + updateDynamicRam("tail", getRamCost(Player, "tail")); let runningScriptObj; if (arguments.length === 0) { runningScriptObj = workerScript.scriptRef; @@ -1085,6 +1102,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return scriptsRunning; }, exit: function (): any { + updateDynamicRam("exit", getRamCost(Player, "exit")); workerScript.running = false; // Prevent workerScript from "finishing execution naturally" if (killWorkerScript(workerScript)) { workerScript.log("exit", () => "Exiting..."); @@ -1628,6 +1646,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return cost; }, purchaseServer: function (aname: any, aram: any): any { + updateDynamicRam("purchaseServer", getRamCost(Player, "purchaseServer")); const name = helper.string("purchaseServer", "name", aname); const ram = helper.number("purchaseServer", "ram", aram); updateDynamicRam("purchaseServer", getRamCost(Player, "purchaseServer")); @@ -1772,6 +1791,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return res; }, writePort: function (port: any, data: any = ""): any { + updateDynamicRam("writePort", getRamCost(Player, "writePort")); if (typeof data !== "string" && typeof data !== "number") { throw makeRuntimeErrorMsg( "writePort", @@ -1854,6 +1874,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { } }, readPort: function (port: any): any { + updateDynamicRam("readPort", getRamCost(Player, "readPort")); // Read from port const iport = helper.getValidPort("readPort", port); const x = iport.read(); @@ -1913,6 +1934,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return 0; }, clearPort: function (port: any): any { + updateDynamicRam("clearPort", getRamCost(Player, "clearPort")); // Clear port const iport = helper.getValidPort("clearPort", port); return iport.clear(); @@ -1961,6 +1983,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return suc; }, getScriptName: function (): any { + updateDynamicRam("getScriptName", getRamCost(Player, "getScriptName")); return workerScript.name; }, getScriptRam: function (scriptname: any, hostname: any = workerScript.hostname): any { @@ -2092,6 +2115,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { } }, nFormat: function (n: any, format: any): any { + updateDynamicRam("nFormat", getRamCost(Player, "nFormat")); if (isNaN(n) || isNaN(parseFloat(n)) || typeof format !== "string") { return ""; } @@ -2099,6 +2123,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return numeralWrapper.format(parseFloat(n), format); }, tFormat: function (milliseconds: any, milliPrecision: any = false): any { + updateDynamicRam("tFormat", getRamCost(Player, "tFormat")); return convertTimeMsToTimeElapsedString(milliseconds, milliPrecision); }, getTimeSinceLastAug: function (): any { @@ -2106,10 +2131,12 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return Player.playtimeSinceLastAug; }, alert: function (message: any): void { + updateDynamicRam("alert", getRamCost(Player, "alert")); message = argsToString([message]); dialogBoxCreate(message); }, toast: function (message: any, variant: any = "success", duration: any = 2000): void { + updateDynamicRam("toast", getRamCost(Player, "toast")); if (!["success", "info", "warning", "error"].includes(variant)) throw new Error(`variant must be one of "success", "info", "warning", or "error"`); @@ -2117,6 +2144,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { SnackbarEvents.emit(message, variant, duration); }, prompt: function (txt: any): any { + updateDynamicRam("prompt", getRamCost(Player, "prompt")); if (!isString(txt)) { txt = JSON.stringify(txt); } @@ -2129,6 +2157,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { }); }, wget: async function (url: any, target: any, hostname: any = workerScript.hostname): Promise { + updateDynamicRam("wget", getRamCost(Player, "wget")); if (!isScriptFilename(target) && !target.endsWith(".txt")) { workerScript.log("wget", () => `Invalid target file: '${target}'. Must be a script or text file.`); return Promise.resolve(false); @@ -2170,7 +2199,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction); }, getOwnedSourceFiles: function (): SourceFileLvl[] { - helper.updateDynamicRam("getOwnedSourceFiles", getRamCost(Player, "getOwnedSourceFiles")); + updateDynamicRam("getOwnedSourceFiles", getRamCost(Player, "getOwnedSourceFiles")); const res: SourceFileLvl[] = []; for (let i = 0; i < Player.sourceFiles.length; ++i) { res.push({ @@ -2181,7 +2210,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return res; }, getPlayer: function (): INetscriptPlayer { - helper.updateDynamicRam("getPlayer", getRamCost(Player, "getPlayer")); + updateDynamicRam("getPlayer", getRamCost(Player, "getPlayer")); const data = { hacking: Player.hacking, @@ -2276,6 +2305,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { return data; }, atExit: function (f: any): void { + updateDynamicRam("atExit", getRamCost(Player, "atExit")); if (typeof f !== "function") { throw makeRuntimeErrorMsg("atExit", "argument should be function"); }