2017-06-28 11:47:42 +02:00
function NetscriptFunctions ( workerScript ) {
return {
hacknetnodes : Player . hacknetNodes ,
scan : function ( ip = workerScript . serverIp ) {
var server = getServer ( ip ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , 'Invalid IP or hostname passed into scan() command' ) ;
}
var out = [ ] ;
for ( var i = 0 ; i < server . serversOnNetwork . length ; i ++ ) {
var entry = server . getServerOnNetwork ( i ) . hostname ;
if ( entry == null ) {
continue ;
2017-06-11 08:52:52 +02:00
}
2017-06-28 11:47:42 +02:00
out . push ( entry ) ;
}
workerScript . scriptRef . log ( 'scan() returned ' + server . serversOnNetwork . length + ' connections for ' + server . hostname ) ;
return out ;
} ,
hack : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Hack() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping..." ) ;
throw makeRuntimeRejectMsg ( workerScript , "hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping..." ) ;
2017-06-05 06:48:37 +02:00
}
2017-07-25 03:06:40 +02:00
//Calculate the hacking time
2017-06-28 11:47:42 +02:00
var hackingTime = scriptCalculateHackingTime ( server ) ; //This is in seconds
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot hack this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot hack this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
if ( server . requiredHackingSkill > Player . hacking _skill ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot hack this server (" + server . hostname + ") because user's hacking skill is not high enough" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot hack this server (" + server . hostname + ") because user's hacking skill is not high enough" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . log ( "Attempting to hack " + ip + " in " + hackingTime . toFixed ( 3 ) + " seconds (t=" + threads + ")" ) ;
//console.log("Hacking " + server.hostname + " after " + hackingTime.toString() + " seconds (t=" + threads + ")");
return netscriptDelay ( hackingTime * 1000 ) . then ( function ( ) {
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
var hackChance = scriptCalculateHackingChance ( server ) ;
var rand = Math . random ( ) ;
var expGainedOnSuccess = scriptCalculateExpGain ( server ) * threads ;
var expGainedOnFailure = ( expGainedOnSuccess / 4 ) ;
if ( rand < hackChance ) { //Success!
var moneyGained = scriptCalculatePercentMoneyHacked ( server ) ;
moneyGained = Math . floor ( server . moneyAvailable * moneyGained ) * threads ;
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//Over-the-top safety checks
if ( moneyGained <= 0 ) {
moneyGained = 0 ;
expGainedOnSuccess = expGainedOnFailure ;
2017-06-15 03:19:52 +02:00
}
2017-06-28 11:47:42 +02:00
if ( moneyGained > server . moneyAvailable ) { moneyGained = server . moneyAvailable ; }
server . moneyAvailable -= moneyGained ;
if ( server . moneyAvailable < 0 ) { server . moneyAvailable = 0 ; }
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
Player . gainMoney ( moneyGained ) ;
workerScript . scriptRef . onlineMoneyMade += moneyGained ;
workerScript . scriptRef . recordHack ( server . ip , moneyGained , threads ) ;
Player . gainHackingExp ( expGainedOnSuccess ) ;
workerScript . scriptRef . onlineExpGained += expGainedOnSuccess ;
//console.log("Script successfully hacked " + server.hostname + " for $" + formatNumber(moneyGained, 2) + " and " + formatNumber(expGainedOnSuccess, 4) + " exp");
workerScript . scriptRef . log ( "Script SUCCESSFULLY hacked " + server . hostname + " for $" + formatNumber ( moneyGained , 2 ) + " and " + formatNumber ( expGainedOnSuccess , 4 ) + " exp (t=" + threads + ")" ) ;
server . fortify ( CONSTANTS . ServerFortifyAmount * threads ) ;
return Promise . resolve ( true ) ;
2017-07-25 03:06:40 +02:00
} else {
2017-06-28 11:47:42 +02:00
//Player only gains 25% exp for failure? TODO Can change this later to balance
Player . gainHackingExp ( expGainedOnFailure ) ;
workerScript . scriptRef . onlineExpGained += expGainedOnFailure ;
//console.log("Script unsuccessful to hack " + server.hostname + ". Gained " + formatNumber(expGainedOnFailure, 4) + " exp");
workerScript . scriptRef . log ( "Script FAILED to hack " + server . hostname + ". Gained " + formatNumber ( expGainedOnFailure , 4 ) + " exp (t=" + threads + ")" ) ;
return Promise . resolve ( false ) ;
2017-06-15 03:19:52 +02:00
}
2017-06-28 11:47:42 +02:00
} ) ;
} ,
2017-07-22 00:54:55 +02:00
sleep : function ( time , log = true ) {
2017-06-28 11:47:42 +02:00
if ( time === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "sleep() call has incorrect number of arguments. Takes 1 argument" ) ;
2017-06-15 03:19:52 +02:00
}
2017-07-22 00:54:55 +02:00
if ( log ) {
workerScript . scriptRef . log ( "Sleeping for " + time + " milliseconds" ) ;
}
2017-07-13 18:54:29 +02:00
return netscriptDelay ( time ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
return Promise . resolve ( true ) ;
} ) ;
} ,
grow : function ( ip ) {
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "grow() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot grow(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot grow(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot grow this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot grow this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var growTime = scriptCalculateGrowTime ( server ) ;
//console.log("Executing grow() on server " + server.hostname + " in " + formatNumber(growTime/1000, 3) + " seconds")
workerScript . scriptRef . log ( "Executing grow() on server " + server . hostname + " in " + formatNumber ( growTime / 1000 , 3 ) + " seconds (t=" + threads + ")" ) ;
return netscriptDelay ( growTime ) . then ( function ( ) {
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
server . moneyAvailable += ( 1 * threads ) ; //It can be grown even if it has no money
var growthPercentage = processSingleServerGrowth ( server , 450 * threads ) ;
workerScript . scriptRef . recordGrow ( server . ip , threads ) ;
var expGain = scriptCalculateExpGain ( server ) * threads ;
if ( growthPercentage == 1 ) {
expGain = 0 ;
2017-06-11 22:28:20 +02:00
}
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Available money on " + server . hostname + " grown by "
+ formatNumber ( growthPercentage * 100 - 100 , 6 ) + "%. Gained " +
formatNumber ( expGain , 4 ) + " hacking exp (t=" + threads + ")" ) ;
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . onlineExpGained += expGain ;
2017-07-25 03:06:40 +02:00
Player . gainHackingExp ( expGain ) ;
2017-06-28 11:47:42 +02:00
return Promise . resolve ( growthPercentage ) ;
2017-07-25 03:06:40 +02:00
} ) ;
2017-06-28 11:47:42 +02:00
} ,
weaken : function ( ip ) {
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "weaken() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot weaken(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot weaken(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot weaken this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot weaken this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var weakenTime = scriptCalculateWeakenTime ( server ) ;
//console.log("Executing weaken() on server " + server.hostname + " in " + formatNumber(weakenTime/1000, 3) + " seconds")
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Executing weaken() on server " + server . hostname + " in " +
2017-06-28 11:47:42 +02:00
formatNumber ( weakenTime / 1000 , 3 ) + " seconds (t=" + threads + ")" ) ;
return netscriptDelay ( weakenTime ) . then ( function ( ) {
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
server . weaken ( CONSTANTS . ServerWeakenAmount * threads ) ;
workerScript . scriptRef . recordWeaken ( server . ip , threads ) ;
var expGain = scriptCalculateExpGain ( server ) * threads ;
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Server security level on " + server . hostname + " weakened to " + server . hackDifficulty +
2017-06-28 11:47:42 +02:00
". Gained " + formatNumber ( expGain , 4 ) + " hacking exp (t=" + threads + ")" ) ;
workerScript . scriptRef . onlineExpGained += expGain ;
2017-07-25 03:06:40 +02:00
Player . gainHackingExp ( expGain ) ;
2017-06-28 11:47:42 +02:00
return Promise . resolve ( CONSTANTS . ServerWeakenAmount * threads ) ;
2017-07-25 03:06:40 +02:00
} ) ;
2017-06-28 11:47:42 +02:00
} ,
print : function ( args ) {
if ( args === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "print() call has incorrect number of arguments. Takes 1 argument" ) ;
}
workerScript . scriptRef . log ( args . toString ( ) ) ;
} ,
2017-07-22 00:54:55 +02:00
clearLog : function ( ) {
workerScript . scriptRef . clearLog ( ) ;
} ,
2017-06-28 11:47:42 +02:00
nuke : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . NukeProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the NUKE.exe virus!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( server . openPortCount < server . numOpenPortsRequired ) {
throw makeRuntimeRejectMsg ( workerScript , "Not enough ports opened to use NUKE.exe virus" ) ;
}
if ( server . hasAdminRights ) {
workerScript . scriptRef . log ( "Already have root access to " + server . hostname ) ;
} else {
server . hasAdminRights = true ;
workerScript . scriptRef . log ( "Executed NUKE.exe virus on " + server . hostname + " to gain root access" ) ;
}
return true ;
} ,
brutessh : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . BruteSSHProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the BruteSSH.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . sshPortOpen ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Executed BruteSSH.exe on " + server . hostname + " to open SSH port (22)" ) ;
2017-07-25 03:06:40 +02:00
server . sshPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
workerScript . scriptRef . log ( "SSH Port (22) already opened on " + server . hostname ) ;
}
return true ;
} ,
ftpcrack : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . FTPCrackProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the FTPCrack.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . ftpPortOpen ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Executed FTPCrack.exe on " + server . hostname + " to open FTP port (21)" ) ;
2017-07-25 03:06:40 +02:00
server . ftpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
workerScript . scriptRef . log ( "FTP Port (21) already opened on " + server . hostname ) ;
}
return true ;
} ,
relaysmtp : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . RelaySMTPProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the relaySMTP.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . smtpPortOpen ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Executed relaySMTP.exe on " + server . hostname + " to open SMTP port (25)" ) ;
2017-07-25 03:06:40 +02:00
server . smtpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
workerScript . scriptRef . log ( "SMTP Port (25) already opened on " + server . hostname ) ;
}
return true ;
} ,
httpworm : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . HTTPWormProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the HTTPWorm.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . httpPortOpen ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Executed HTTPWorm.exe on " + server . hostname + " to open HTTP port (80)" ) ;
2017-07-25 03:06:40 +02:00
server . httpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
workerScript . scriptRef . log ( "HTTP Port (80) already opened on " + server . hostname ) ;
}
return true ;
} ,
sqlinject : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . SQLInjectProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the SQLInject.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . sqlPortOpen ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Executed SQLInject.exe on " + server . hostname + " to open SQL port (1433)" ) ;
2017-07-25 03:06:40 +02:00
server . sqlPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
workerScript . scriptRef . log ( "SQL Port (1433) already opened on " + server . hostname ) ;
}
return true ;
} ,
2017-07-13 18:54:29 +02:00
run : function ( scriptname , threads = 1 ) {
2017-06-28 11:47:42 +02:00
if ( scriptname === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "run() call has incorrect number of arguments. Usage: run(scriptname, [numThreads], [arg1], [arg2]...)" ) ;
}
if ( isNaN ( threads ) || threads < 1 ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into run(). Must be numeric and greater than 0" ) ;
}
2017-07-13 18:54:29 +02:00
var argsForNewScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForNewScript . push ( arguments [ i ] ) ;
}
2017-06-28 11:47:42 +02:00
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
return runScriptFromScript ( scriptServer , scriptname , argsForNewScript , workerScript , threads ) ;
} ,
2017-07-13 18:54:29 +02:00
exec : function ( scriptname , ip , threads = 1 ) {
2017-06-28 11:47:42 +02:00
if ( scriptname === undefined || ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "exec() call has incorrect number of arguments. Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)" ) ;
}
if ( isNaN ( threads ) || threads < 1 ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into exec(). Must be numeric and greater than 0" ) ;
}
2017-07-13 18:54:29 +02:00
var argsForNewScript = [ ] ;
for ( var i = 3 ; i < arguments . length ; ++ i ) {
argsForNewScript . push ( arguments [ i ] ) ;
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid hostname/ip passed into exec() command: " + args [ 1 ] ) ;
}
return runScriptFromScript ( server , scriptname , argsForNewScript , workerScript , threads ) ;
} ,
2017-07-13 18:54:29 +02:00
kill : function ( filename , ip ) {
2017-06-28 11:47:42 +02:00
if ( filename === undefined || ip === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "kill() call has incorrect number of arguments. Usage: kill(scriptname, server, [arg1], [arg2]...)" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "kill() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "kill() failed. Invalid IP or hostname passed in: " + ip ) ;
}
var argsForKillTarget = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForKillTarget . push ( arguments [ i ] ) ;
2017-06-28 11:47:42 +02:00
}
var runningScriptObj = findRunningScript ( filename , argsForKillTarget , server ) ;
if ( runningScriptObj == null ) {
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) ) ;
return false ;
}
var res = killWorkerScript ( runningScriptObj , server . ip ) ;
if ( res ) {
workerScript . scriptRef . log ( "Killing " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) + ". May take up to a few minutes for the scripts to die..." ) ;
return true ;
} else {
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) ) ;
return false ;
}
} ,
killall : function ( ip ) {
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "killall() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "killall() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "killall() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
for ( var i = server . runningScripts . length - 1 ; i >= 0 ; -- i ) {
killWorkerScript ( server . runningScripts [ i ] , server . ip ) ;
}
workerScript . scriptRef . log ( "killall(): Killing all scripts on " + server . hostname + ". May take a few minutes for the scripts to die" ) ;
return true ;
} ,
scp : function ( scriptname , ip ) {
if ( scriptname === undefined || ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "scp() call has incorrect number of arguments. Takes 2 arguments" ) ;
}
var destServer = getServer ( ip ) ;
if ( destServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid hostname/ip passed into scp() command: " + ip ) ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var currServ = getServer ( workerScript . serverIp ) ;
if ( currServ == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server ip for this script. This is a bug please contact game developer" ) ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var sourceScript = null ;
for ( var i = 0 ; i < currServ . scripts . length ; ++ i ) {
if ( scriptname == currServ . scripts [ i ] . filename ) {
sourceScript = currServ . scripts [ i ] ;
break ;
2017-06-11 22:28:20 +02:00
}
2017-06-28 11:47:42 +02:00
}
if ( sourceScript == null ) {
workerScript . scriptRef . log ( scriptname + " does not exist. scp() failed" ) ;
return false ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//Overwrite script if it already exists
for ( var i = 0 ; i < destServer . scripts . length ; ++ i ) {
if ( scriptname == destServer . scripts [ i ] . filename ) {
workerScript . scriptRef . log ( "WARNING: " + scriptname + " already exists on " + destServer . hostname + " and it will be overwritten." ) ;
workerScript . scriptRef . log ( scriptname + " overwritten on " + destServer . hostname ) ;
var oldScript = destServer . scripts [ i ] ;
oldScript . code = sourceScript . code ;
oldScript . ramUsage = sourceScript . ramUsage ;
return true ;
2017-06-18 06:36:16 +02:00
}
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//Create new script if it does not already exist
var newScript = new Script ( ) ;
newScript . filename = scriptname ;
newScript . code = sourceScript . code ;
newScript . ramUsage = sourceScript . ramUsage ;
newScript . server = destServer . ip ;
destServer . scripts . push ( newScript ) ;
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
return true ;
} ,
hasRootAccess : function ( ip ) {
2017-07-13 18:54:29 +02:00
if ( ip === undefined ) {
2017-06-28 11:47:42 +02:00
throw makeRuntimeRejectMsg ( workerScript , "hasRootAccess() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-13 18:54:29 +02:00
return server . hasAdminRights ;
2017-06-28 11:47:42 +02:00
} ,
getHostname : function ( ) {
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ;
}
return scriptServer . hostname ;
} ,
getHackingLevel : function ( ) {
Player . updateSkillLevels ( ) ;
workerScript . scriptRef . log ( "getHackingLevel() returned " + Player . hacking _skill ) ;
return Player . hacking _skill ;
} ,
getServerMoneyAvailable : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot getServerMoneyAvailable(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot getServerMoneyAvailable(). Invalid IP or hostname passed in: " + ip ) ;
}
if ( server . hostname == "home" ) {
//Return player's money
workerScript . scriptRef . log ( "getServerMoneyAvailable('home') returned player's money: $" + formatNumber ( Player . money , 2 ) ) ;
return Player . money ;
2017-06-28 11:47:42 +02:00
}
workerScript . scriptRef . log ( "getServerMoneyAvailable() returned " + formatNumber ( server . moneyAvailable , 2 ) + " for " + server . hostname ) ;
return server . moneyAvailable ;
} ,
getServerSecurityLevel : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
workerScript . scriptRef . log ( "getServerSecurityLevel() returned " + formatNumber ( server . hackDifficulty , 3 ) + " for " + server . hostname ) ;
return server . hackDifficulty ;
} ,
getServerBaseSecurityLevel : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
workerScript . scriptRef . log ( "getServerBaseSecurityLevel() returned " + formatNumber ( server . baseDifficulty , 3 ) + " for " + server . hostname ) ;
return server . baseDifficulty ;
} ,
getServerRequiredHackingLevel : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
workerScript . scriptRef . log ( "getServerRequiredHackingLevel returned " + formatNumber ( server . requiredHackingSkill , 0 ) + " for " + server . hostname ) ;
return server . requiredHackingSkill ;
} ,
getServerMaxMoney : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
workerScript . scriptRef . log ( "getServerMaxMoney() returned " + formatNumber ( server . moneyMax , 0 ) + " for " + server . hostname ) ;
return server . moneyMax ;
} ,
2017-07-13 18:54:29 +02:00
getServerNumPortsRequired : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip ) ;
}
workerScript . scriptRef . log ( "getServerNumPortsRequired() returned " + formatNumber ( server . numOpenPortsRequired , 0 ) + " for " + server . hostname ) ;
return server . numOpenPortsRequired ;
} ,
2017-07-25 03:06:40 +02:00
getServerRam : function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerRam() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerRam() failed. Invalid IP or hostname passed in: " + ip ) ;
}
workerScript . scriptRef . log ( "getServerRam() returned [" + formatNumber ( server . maxRam , 2 ) + "GB, " + formatNumber ( server . ramUsed , 2 ) + "GB]" ) ;
return [ server . maxRam , server . ramUsed ] ;
} ,
2017-06-28 11:47:42 +02:00
fileExists : function ( filename , ip = workerScript . serverIp ) {
if ( filename === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "fileExists() call has incorrect number of arguments. Usage: fileExists(scriptname, [server])" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "fileExists() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "fileExists() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
for ( var i = 0 ; i < server . scripts . length ; ++ i ) {
if ( filename == server . scripts [ i ] . filename ) {
return true ;
}
}
2017-07-13 18:54:29 +02:00
for ( var i = 0 ; i < server . programs . length ; ++ i ) {
if ( filename . toLowerCase ( ) == server . programs [ i ] . toLowerCase ( ) ) {
return true ;
}
2017-06-28 11:47:42 +02:00
}
return false ;
} ,
2017-07-13 18:54:29 +02:00
isRunning : function ( filename , ip ) {
2017-06-28 11:47:42 +02:00
if ( filename === undefined || ip === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "isRunning() call has incorrect number of arguments. Usage: isRunning(scriptname, server, [arg1], [arg2]...)" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "isRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "isRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
}
var argsForTargetScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForTargetScript . push ( arguments [ i ] ) ;
}
return ( findRunningScript ( filename , argsForTargetScript , server ) != null ) ;
} ,
purchaseHacknetNode : purchaseHacknet ,
getStockPrice : function ( symbol ) {
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use getStockPrice()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPrice()" ) ;
}
return parseFloat ( stock . price . toFixed ( 3 ) ) ;
} ,
getStockPosition : function ( symbol ) {
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use getStockPosition()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPrice()" ) ;
}
return [ stock . playerShares , stock . playerAvgPx ] ;
} ,
buyStock : function ( symbol , shares ) {
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use buyStock()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPrice()" ) ;
}
if ( shares == 0 ) { return false ; }
if ( stock == null || shares < 0 || isNaN ( shares ) ) {
workerScript . scriptRef . log ( "Error: Invalid 'shares' argument passed to buyStock()" ) ;
return false ;
}
shares = Math . round ( shares ) ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
var totalPrice = stock . price * shares ;
if ( Player . money < totalPrice + CONSTANTS . StockMarketCommission ) {
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + formatNumber ( shares , 0 ) + " shares of " +
symbol + ". Need $" +
2017-07-13 18:54:29 +02:00
formatNumber ( totalPrice + CONSTANTS . StockMarketCommission , 2 ) . toString ( ) ) ;
return false ;
}
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
var origTotal = stock . playerShares * stock . playerAvgPx ;
Player . loseMoney ( totalPrice + CONSTANTS . StockMarketCommission ) ;
var newTotal = origTotal + totalPrice ;
2017-07-25 03:06:40 +02:00
stock . playerShares += shares ;
2017-07-13 18:54:29 +02:00
stock . playerAvgPx = newTotal / stock . playerShares ;
if ( Engine . currentPage == Engine . Page . StockMarket ) {
updateStockPlayerPosition ( stock ) ;
}
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Bought " + formatNumber ( shares , 0 ) + " shares of " + stock . symbol + " at $" +
2017-07-13 18:54:29 +02:00
formatNumber ( stock . price , 2 ) + " per share" ) ;
return true ;
} ,
sellStock : function ( symbol , shares ) {
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use sellStock()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPrice()" ) ;
}
if ( shares == 0 ) { return false ; }
if ( stock == null || shares < 0 || isNaN ( shares ) ) {
workerScript . scriptRef . log ( "Error: Invalid 'shares' argument passed to sellStock()" ) ;
return false ;
2017-06-28 11:47:42 +02:00
}
2017-07-13 18:54:29 +02:00
if ( shares > stock . playerShares ) { shares = stock . playerShares ; }
if ( shares == 0 ) { return false ; }
var gains = stock . price * shares - CONSTANTS . StockMarketCommission ;
Player . gainMoney ( gains ) ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
//Calculate net profit and add to script stats
var netProfit = ( ( stock . price - stock . playerAvgPx ) * shares ) - CONSTANTS . StockMarketCommission ;
if ( isNaN ( netProfit ) ) { netProfit = 0 ; }
workerScript . scriptRef . onlineMoneyMade += netProfit ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
stock . playerShares -= shares ;
if ( stock . playerShares == 0 ) {
stock . playerAvgPx = 0 ;
}
if ( Engine . currentPage == Engine . Page . StockMarket ) {
updateStockPlayerPosition ( stock ) ;
}
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Sold " + formatNumber ( shares , 0 ) + " shares of " + stock . symbol + " at $" +
formatNumber ( stock . price , 2 ) + " per share. Gained " +
2017-07-13 18:54:29 +02:00
"$" + formatNumber ( gains , 2 ) ) ;
return true ;
} ,
purchaseServer : function ( hostname , ram ) {
var hostnameStr = String ( hostname ) ;
hostnameStr = hostnameStr . replace ( /\s\s+/g , '' ) ;
if ( hostnameStr == "" ) {
workerScript . scriptRef . log ( "Error: Passed empty string for hostname argument of purchaseServer()" ) ;
return "" ;
}
2017-07-25 03:06:40 +02:00
2017-07-27 04:56:14 +02:00
if ( Player . purchasedServers . length >= CONSTANTS . PurchasedServerLimit ) {
workerScript . scriptRef . log ( "Error: You have reached the maximum limit of " + CONSTANTS . PurchasedServerLimit +
" servers. You cannot purchase any more." ) ;
return "" ;
}
2017-07-13 18:54:29 +02:00
ram = Math . round ( ram ) ;
if ( isNaN ( ram ) || ! powerOfTwo ( ram ) ) {
workerScript . scriptRef . log ( "Error: Invalid ram argument passed to purchaseServer(). Must be numeric and a power of 2" ) ;
return "" ;
}
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
var cost = 2 * ram * CONSTANTS . BaseCostFor1GBOfRamServer ;
if ( cost > Player . money ) {
workerScript . scriptRef . log ( "Error: Not enough money to purchase server. Need $" + formatNumber ( cost , 2 ) ) ;
return "" ;
}
var newServ = new Server ( ) ;
newServ . init ( createRandomIp ( ) , hostnameStr , "" , true , false , true , true , ram ) ;
AddToAllServers ( newServ ) ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
Player . purchasedServers . push ( newServ . ip ) ;
var homeComputer = Player . getHomeComputer ( ) ;
homeComputer . serversOnNetwork . push ( newServ . ip ) ;
newServ . serversOnNetwork . push ( homeComputer . ip ) ;
Player . loseMoney ( cost ) ;
workerScript . scriptRef . log ( "Purchased new server with hostname " + newServ . hostname + " for $" + formatNumber ( cost , 2 ) ) ;
return newServ . hostname ;
2017-06-28 11:47:42 +02:00
} ,
2017-07-27 04:56:14 +02:00
deleteServer : function ( hostname ) {
var hostnameStr = String ( hostname ) ;
hostnameStr = hostnameStr . replace ( /\s\s+/g , '' ) ;
var server = GetServerByHostname ( hostnameStr ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "Error: Could not find server with hostname " + hostnameStr + ". deleteServer() failed" ) ;
return false ;
}
if ( ! server . purchasedByPlayer ) {
workerScript . scriptRef . log ( "Error: Server " + server . hostname + " is not a purchased server. " +
"Cannot be deleted. deleteSErver failed" ) ;
return false ;
}
var ip = server . ip ;
//Delete from all servers
delete AllServers [ ip ] ;
//Delete from player's purchasedServers array
var found = false ;
for ( var i = 0 ; i < Player . purchasedServers . length ; ++ i ) {
if ( ip == Player . purchasedServers [ i ] ) {
found = true ;
Player . purchasedServers . splice ( i , 1 ) ;
break ;
}
}
if ( ! found ) {
workerScript . scriptRef . log ( "Error: Could not identify server " + server . hostname +
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
}
//Delete from home computer
found = false ;
var homeComputer = Player . getHomeComputer ( ) ;
for ( var i = 0 ; i < homeComputer . serversOnNetwork . length ; ++ i ) {
if ( ip == homeComputer . serversOnNetwork [ i ] ) {
homeComputer . serversOnNetwork . splice ( i , 1 ) ;
workerScript . scriptRef . log ( "Deleted server " + hostnameStr ) ;
return true ;
}
}
//Wasn't found on home computer
workerScript . scriptRef . log ( "Error: Could not find server " + server . hostname +
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
} ,
2017-07-13 18:54:29 +02:00
round : function ( n ) {
if ( isNaN ( n ) ) { return 0 ; }
return Math . round ( n ) ;
2017-07-22 00:54:55 +02:00
} ,
write : function ( port , data = "" ) {
if ( ! isNaN ( port ) ) {
//Port 1-10
if ( port < 1 && port > 10 ) {
throw makeRuntimeRejectMsg ( workerScript , "Trying to write to invalid port: " + port + ". Only ports 1-10 are valid." ) ;
}
var portName = "Port" + String ( port ) ;
var port = NetscriptPorts [ portName ] ;
if ( port == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
port . push ( data ) ;
2017-07-25 16:39:56 +02:00
if ( port . length > Settings . MaxPortCapacity ) {
2017-07-22 00:54:55 +02:00
port . shift ( ) ;
return true ;
}
return false ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for port: " + port + ". Must be a number between 1 and 10" ) ;
}
} ,
read : function ( port ) {
if ( ! isNaN ( port ) ) {
//Port 1-10
if ( port < 1 && port > 10 ) {
throw makeRuntimeRejectMsg ( workerScript , "Trying to write to invalid port: " + port + ". Only ports 1-10 are valid." ) ;
}
var portName = "Port" + String ( port ) ;
var port = NetscriptPorts [ portName ] ;
if ( port == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
if ( port . length == 0 ) {
return "NULL PORT DATA" ;
} else {
return port . shift ( ) ;
}
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for port: " + port + ". Must be a number between 1 and 10" ) ;
}
2017-07-13 18:54:29 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-05 08:24:30 +02:00
}
2017-06-05 06:48:37 +02:00
}