// commented out the /f l line, but can be uncommented if you wich // added white screen of death fix and also some print txt for testing 2-17-11 stairbuilder // added stagger leech joining 9-25-11 by stair // added single /f l try to enter games for switching keys and missing the game join message 9-25-11 by stair // added a while loop and manager print if a bad cd key is used or bad account or password stair 9-25-11 // added gameDoesNotExistDelay and txt file joining. Must use updated leader entry point for the txt joining // added 3 new config options tryLeaderGame1x, retryLeaderGame, tryLeaderGame1x 12-22-2011 // changed where the game count increase is called to right when bot enters chat instead of waiting for game name. Saves a second or 2 credit for this goes to stib 1-21-12 // fixed /f l delay to only apply after the first /f l 1-21-12 // added fastJoin option. read comments next to setting below 1/22/12 /////////////////////////////////////////////////////////////////////////////////////////////////////////// // Renamed from LeechStarter2.3 to LeechStarter on 4/27/2013 by Tru // Version of the LeechStarter remains at 2.3! // ============================================================================= // Leader Account settings // ============================================================================= var leaderAccountName = "zorbz"; var leaderName = "OYOYOYOY"; // ============================================================================= // Leecher game entry delays use to stagger when leechers join game // [characterName, delay in milliseconds] - leave these as-is to not use them // ============================================================================= var leecher1 = ["OYOOYOY", 100]; var leecher2 = ["characterName", 750]; var leecher3 = ["characterName", 1250]; var leecher4 = ["characterName", 2000]; //============================================================================== // join options //============================================================================== var useFL = true; // set true if you wish your leecher to use /f l to join games. useFL MUST be set to 0 for this to work var useFLCount = 1; // this is seperate from the above setting allows you to use /f l to join, but will only spam /f l the set number of times. set to 0 to disable var delayFL = 3000; // milliseconds before the bot will use the /f l command in loby var reEnterSameGame = false; // set to false to keep the bot from using /f l to re enter same game also must be set to false if you don't want bot to re enter same game for txt joining var useTextFileJoin = false; // use txt file communication between leader and leecher to join games var gameDoesNotExistDelay = 10; // time to idle before trying if leader's game does not exist. In seconds. var tryLeaderGame1x = false; // will only try to enter the game one time. Good for when leader drops before leecher gets in. var retryLeaderGame = 0; // nuber of times you would like to try joining leaders game. Note tryLeaderGame1x = true bypasses this and the delay below var retryLeaderGameDelay = 10; // time in seconds to delay between retrying to enter leaders game var fastJoin = true; // this has preconfigured delays for easy switching. Gets you leecher in game in about 3 seconds. THIS MAY CAUSE JOIN PROBLEMS FOR SOME USERS!!!!! var ftjDelay = 180; // time to idle before trying if leecher failed to join. In seconds. // ============================================================================= // Game password (leave blank if none) // ============================================================================= var gamepassword = "sk"; // ============================================================================= // UseCDKeyChangeTrick : // if true, the follow bot will say his gamename/gamepwd (set in the OOG) in chat before each game // in order to increment his number of runs (to switch CDKeys after xx runs) // if false, the follow bot will never change his CDKey // ============================================================================= var UseCDKeyChangeTrick = false; // ============================================================================= // Debug : set to true if you are experiencing problems with your JoinBot // it will log in your OOG the lobby chat actions // ============================================================================= var Debug = false; //////////////////////////////////////////////////////////////////////////////// // Lobby chat settings : //////////////////////////////////////////////////////////////////////////////// var joinChatAfterGame = true; // Set to true to join the chat after each game (needed for JoinBot) var firstJoinMessage = ""; // Message said when you first enter the chat var chatMessageAfterGame = ""; // Message said after each game var joinRandomChannel = false; // if this is true, will join a random channel, otherwise it will use the channel below.. var joinChannelInChat = "OP Etal"; // Name of the channel you want to join (leave blank if you want to stay in the default channel) //////////////////////////////////////////////////////////////////////////////// // Delays: //////////////////////////////////////////////////////////////////////////////// // Minimum game length, waits in the lobby if last game was too short // I recommend to keep a value > 300000 (milliseconds) to avoid bnet temporary ban var gameMinLength = 420000; // Milliseconds // Realm Delays var unableToConnectRetry = 20; // Minutes var realmDownRetry = 480; // Minutes var disconnectedRetry = 5; // Minutes var cdkeyInUseRetry = 5; // Minutes if(fastJoin) { // interface delays (milliseconds) var connectingToBnetTimeout = 20000; var characterScreenTimeout = 10000; var pleaseWaitTimeout = 10000; var createGameThreshold = 10000; var createGameThresholdRandom = 1000; var createGameTimeout = 15000; var waitInLineTimeout = 15000; var characterSelectDelay = 1000; var loginDelay = 1000; var clickDelay = 0; var textDelay = 0; var clickDelayRandom = 0; var textDelayRandom = 0; var gameDoesNotExistDelayMin = 600000; // this not for leech configuration. Look for gameDoesNotExistDelay above var gameDoesNotExistDelayMax = 900000; // this not for leech configuration. Look for gameDoesNotExistDelay above var gameDoesNotExistTimeout = 30000; var waitBeforeEnterChatMin = 1000; var waitBeforeEnterChatMax = 2000; var waitInChatBeforeActionsMin = 2000; var waitInChatBeforeActionsMax = 3000; } else { var connectingToBnetTimeout = 20000; var characterScreenTimeout = 10000; var pleaseWaitTimeout = 10000; var createGameThreshold = 10000; var createGameThresholdRandom = 1000; var createGameTimeout = 15000; var waitInLineTimeout = 15000; var characterSelectDelay = 1000; var loginDelay = 1000; var clickDelay = 500; var textDelay = 500; var clickDelayRandom = 500; var textDelayRandom = 500; var gameDoesNotExistDelayMin = 600000; // this not for leech configuration. Look for gameDoesNotExistDelay above var gameDoesNotExistDelayMax = 900000; // this not for leech configuration. Look for gameDoesNotExistDelay above var gameDoesNotExistTimeout = 30000; var waitBeforeEnterChatMin = 1000; var waitBeforeEnterChatMax = 2000; var waitInChatBeforeActionsMin = 2000; var waitInChatBeforeActionsMax = 3000; } // Only for JoinBot (friend list delay, milliseconds) var LeaderOfflineDelay = 30000; var LeaderInChatDelay = 10000; var GameIsFullDelay = 30000; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // DO NOT EDIT ANYTHING BELOW THIS //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //D2NT Manager Command const D2NT_MGR_LOADING = 1; const D2NT_MGR_READY = 2; const D2NT_MGR_LOGIN = 3; const D2NT_MGR_CREATE_GAME = 4; const D2NT_MGR_INGAME = 5; const D2NT_MGR_RESTART = 6; const D2NT_MGR_CHICKEN = 7; const D2NT_MGR_PRINT_STATUS = 8; const D2NT_MGR_PRINT_LOG = 9; var lastGameMade = GetTickCount(); var lastGameStatus = 0; var nextGameMake = 0; var inGameAt = 0; var chatActionsDone = false; var lastGameFailed = false; var sayChatMsgAfterGame = false; var ftjcount = 0; Include("libs/controlInfo.ntl"); Include("libs/common/NTColorConverter.ntl"); var controlData = new controlInfo(); var increaseGameCount = true; var firstTimeFl = true; var retryLeaderGameCount = 0; var lastGame = ""; var retryFL = 0; var game = ''; var _gamename = ""; var _gamepassword = ""; var _leaderOfflineTick = -LeaderOfflineDelay; var _leaderInChatTick = -LeaderInChatDelay; var _GameIsFullTick = -GameIsFullDelay; function NTMain() { Delay(1000); var _ingame = false; controlData.clickDelay = clickDelay; controlData.textDelay = textDelay; controlData.clickDelayRandom = clickDelayRandom; controlData.textDelayRandom = textDelayRandom; while(1) { if(me.ingame) { _gamename = me.gamename; _gamepassword = me.gamepassword; if(!inGameAt) inGameAt = GetTickCount(); if(!_ingame) { RunGC(); // run garbage collector between each game if(Load("NTBot/NTBotGame.ntj")) { if(!reEnterSameGame) { NT_File("logs/messagecomands/"+me.charname+"-lastgame.txt", 1, me.gamename); } // writes current game for comparing to new game to join next time in lobby retryFL = 0; // sets the counter back to 0 upon game entry. _ingame = true; retryLeaderGameCount = 0; firstTimeFl = true; increaseGameCount = true; if(me.playtype > 0) sendEventToOOG(D2NT_MGR_INGAME, "In Game[IP:" + me.gameserverip.split(".")[3] + "]", 0); else sendEventToOOG(D2NT_MGR_INGAME, "In Game", 0); lastGameStatus = 2; // in game successful } } Delay(1000); } else { if(_ingame) { My_ExitGame_Check(); // out of korean modded d2nt fixes white screen of death _ingame = false; sayChatMsgAfterGame = true; sendEventToOOG(D2NT_MGR_READY, "", 0); } locationAction(controlData.getLocation()); Delay(500); } } } function locationAction(location) { switch(location.id) { case 3: // Lobby Chat sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0); //ftjcheck if (ftjcount >= 10 && lastGameStatus == 1) { sendEventToOOG(D2NT_MGR_PRINT_LOG, COLOR_1 + "FTJ detected...........Idling", 0); ftjcount = 0; inGameAt = 0; lastGameStatus = 0; setNextGameMake(); locationTimeout(ftjDelay*1000, location); } //LogPrintSimple(me.account + "MyAccountTest.txt", me.account + " / " + me.charname) // this is to check for 2nd account login if (UseCDKeyChangeTrick && increaseGameCount) { sendEventToOOG(D2NT_MGR_CREATE_GAME, location.name, 0); increaseGameCount = false; Delay(1000); } if(!chatActionsDone) { Delay(Random(waitInChatBeforeActionsMin, waitInChatBeforeActionsMax)); if(joinRandomChannel || joinChannelInChat != "") { Say("/join " + (joinRandomChannel ? getRandomString(Random(3,10)) : joinChannelInChat)); Delay(1000); } if(firstJoinMessage) { Say(firstJoinMessage); Delay(200); } chatActionsDone = true; } if (chatMessageAfterGame && _gamename != "" && sayChatMsgAfterGame == true) { Say(chatMessageAfterGame); sayChatMsgAfterGame = false; Delay(200); } game = ''; if(useTextFileJoin) { NT_RetrievenextGame(); //read message from txt file and set game and gamepassword vars from that } else { if(useFL || useFLCount > 0) { var _tick = GetTickCount(); if ((_leaderOfflineTick < 0 || (_leaderOfflineTick + LeaderOfflineDelay) < _tick) // maybe play with this so it skips it for 30 seconds && (_leaderInChatTick < 0 || (_leaderInChatTick + LeaderInChatDelay) < _tick) && (_GameIsFullTick < 0 || (_GameIsFullTick + GameIsFullDelay) < _tick)) { Delay(500); DebugInOOG('Locating the leader : '+leaderAccountName); if(useFLCount > 0 && retryFL < useFLCount) { if(!firstTimeFl) { Delay(delayFL); } else { firstTimeFl = false; } Say('/f l'); retryFL++; } else if(useFL) { if(!firstTimeFl) { Delay(delayFL); } else { firstTimeFl = false; } Say('/f l'); } } } if(chat = controlData.get(controlData.controls.lobby.chat.textBox.channelText)) { var found_leader = false; lines = chat.GetText(); if(!lines) { break; } for (var line_id = lines.length - 1; line_id > -1; line_id--) { if (found_leader) // useless... :/ break; if (lines[line_id].substring(0,1) == " ") continue; // retrieving the whole message var msg = lines[line_id].replace(/^\s+|\s+$/, ""); var msglines = 1; while (lines[line_id+msglines] != undefined && lines[line_id+msglines].substring(0,2) == " ") { msg += " " + lines[line_id+msglines].replace(/^\s+|\s+$/, ""); msglines++; } if (msg.lastIndexOf(leaderName) >= 0) DebugInOOG("yc8found him :;"+msg); // checking if the msg is a friendly whisper if (msg.lastIndexOf(leaderName + ' (*' +leaderAccountName+')') > -1 || msg.lastIndexOf(leaderName + '@' + GateWayToName() + ' (*' +leaderAccountName+')') > -1) // if (msg.lastIndexOf(leaderName + ' (*' +leaderAccountName+')') > -1) // need to modify this and then add another to handle the "@USWest { // should be just a matter of leaderName + '@' and then register the 2nd line as game name var regGameNameWhispered=/^.*in_new_game\s+(.*)$/gi; // replaced below with this to join on mesage upon entering game //var regGameNameWhispered=/^.*(game|partie|spiel|partita|partida).*(nomm[^\s]*|called|chiamata)\s*([\w\s-]*\w)\s*\.\s*$/gi; if (msg.match(regGameNameWhispered)) game = msg.replace(regGameNameWhispered, "$1"); // replaced below with this to join on mesage upon entering game //game = msg.replace(regGameNameWhispered, "$3"); if (game != '') { found_leader = true; break; } } // checking if the msg is from the friend list if (msg.lastIndexOf(': '+leaderAccountName+',') > -1) { found_leader = true; var regOffline=/^.*(offline|desconectado).*$/gi; var regInChat=/^.*(channel|canale?)\s*([\w\s-]*\w)\.?\s*$/gi; var regGameName=/^.*(game|partie|spiel|partita|partida)\s*([\w\s-]*\w)\s*\(priv[^\)]*\)\.\s*$/gi; if (msg.match(regOffline) && (_leaderOfflineTick < 0 || (_leaderOfflineTick + LeaderOfflineDelay) < _tick)) { DebugInOOG('Leader is offline, delay '+Math.round(LeaderOfflineDelay/1000)+' sec for next /f l.'); _leaderOfflineTick = GetTickCount(); } else if (msg.match(regInChat) && (_leaderInChatTick < 0 || (_leaderInChatTick + LeaderInChatDelay) < _tick)) { DebugInOOG('Leader is in the chat "'+msg.replace(regInChat, "$2")+'", delay '+Math.round(LeaderInChatDelay/1000)+' sec for next /f l.'); _leaderInChatTick = GetTickCount(); } else if (msg.match(regGameName) && ((_leaderOfflineTick < 0 || (_leaderOfflineTick + LeaderOfflineDelay) < _tick) && (_leaderInChatTick < 0 || (_leaderInChatTick + LeaderInChatDelay) < _tick))) { game = msg.replace(regGameName, "$2"); } else if ((_leaderInChatTick < 0 || (_leaderInChatTick + LeaderInChatDelay) < _tick) && (_leaderOfflineTick < 0 || (_leaderOfflineTick + LeaderOfflineDelay) < _tick)) { // unhandled line, supposelly "In Realm" DebugInOOG('The leader was in the the lobby but not in chat, delay '+Math.round(LeaderInChatDelay/1000)+' sec for next /f l.'); _leaderInChatTick = GetTickCount(); } break; } } if (found_leader == false) DebugInOOG('I couldn\'t find the leader in my friend list!'); } else { DebugInOOG('I can\'t read the chat!'); //DebugInOOG('You probably haven\'t added the lobby chat controlinfo coordinates!'); Delay(30000); } } if(!reEnterSameGame) { // added to check game name. If same as last game then don't re enter. NT_RetrieveLastGame(); //Delay(250); if(lastGame == game) { game = ""; } } if (game!="") { DebugInOOG('Leader is in the game "' + game + '"'); controlData.click(controlData.controls.lobby.button.join); Delay(100); } break; case 1: // Lobby if(location.id == 1 && joinChatAfterGame) { //LogPrintSimple(me.account + "MyAccountTest.txt", me.account + " / " + me.charname) // this is to check for 2nd account login Delay(Random(waitBeforeEnterChatMin, waitBeforeEnterChatMax)); controlData.click(controlData.controls.lobby.button.enterChat); break; } break; case 2: // Waiting In Line if(GetTickCount()-lastGameMade > waitInLineTimeout) controlData.click(controlData.controls.lobby.inLine.button.cancel); break; case 4: // Create Game if(!controlData.get(controlData.controls.lobby.create.editBox.gameName)) { controlData.click(controlData.controls.lobby.button.join); Delay (500); controlData.click(controlData.controls.lobby.button.create); Delay (500); break; } sendEventToOOG(D2NT_MGR_CREATE_GAME, location.name, 0); locationTimeout(5000, location); lastGameMade = GetTickCount(); lastGameStatus = 1; // pending creation break; case 5: // Join Game if (game) { if(retryLeaderGameCount > 0 && retryLeaderGameDelay > 0) { Delay(retryLeaderGameDelay * 1000); } controlData.setText( controlData.controls.lobby.join.editBox.gameName, game); Delay (100); controlData.setText( controlData.controls.lobby.join.editBox.password, gamepassword); //SendCopyData("D2NT Manager", null, 9<<16, "-- Debug : " + COLOR_1 +me.charname); if(leecher1[0] == me.charname){ Delay(leecher1[1]); } else if(leecher2[0] == me.charname){ Delay(leecher2[1]); } else if(leecher3[0] == me.charname){ Delay(leecher3[1]); } else if(leecher4[0] == me.charname){ Delay(leecher4[1]); } else{ Delay(100); } if(tryLeaderGame1x && retryLeaderGame <= 0) { NT_File("logs/messagecomands/"+me.charname+"-lastgame.txt", 1, game); // writes current game for comparing to new game to join next time in lobby game = ""; } if(retryLeaderGame > 0 && !tryLeaderGame1x && retryLeaderGameCount < retryLeaderGame) { // increases the leadergamecount retryLeaderGameCount++; } if(retryLeaderGame > 0 && !tryLeaderGame1x && retryLeaderGameCount >= retryLeaderGame) { // sets game name to "" because we have made as many attempts as configured to join game = ""; } controlData.click(controlData.controls.lobby.join.button.joinGame); RunGC(); // run garbage collector between each game locationTimeout(5000, location); lastGameStatus = 1; // pending join } else { DebugInOOG('No game to join : cancelling'); me.Cancel(1); Delay(1000); } break; case 6: // Ladder break; case 7: // Channel List break; case 8: // Main Menu if(controlData.getCurrentRealmIndex() == me.gatewayid) { outputGameLength(); controlData.click(controlData.gameTypes[me.playtype]); } else controlData.click(controlData.controls.mainMenu.button.gateway); break; case 9: // Login sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0); Delay(loginDelay); controlData.setText(controlData.controls.login.editBox.accountName, me.account); sendEventToOOG(D2NT_MGR_LOGIN, location.name, 0); locationTimeout(5000, location); break; case 10: // Login Error (this is a fatal error, so stop) sendEventToOOG(D2NT_MGR_PRINT_LOG, COLOR_1 + "Bad Account or PW Entered.......Idling", 0); while(1) { Delay(500); } //sendEventToOOG(D2NT_MGR_RESTART, location.name, 10); Delay(3500); break; case 11: // Unable To Connect timeoutDelay(unableToConnectRetry*60*1000, location) controlData.click(controlData.controls.login.unableToConnect.button.ok); break; case 12: // Character Select var _time, _control; sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0); for(_time = 0 ; _time < characterScreenTimeout ; _time += 500) { _control = controlData.get(controlData.controls.characterSelect.textBox.characterInfo[me.charloc]); if(_control && _control.GetText() != undefined) break; Delay(500); } if(_time < characterScreenTimeout) { Delay(characterSelectDelay); controlData.click(controlData.controls.characterSelect.textBox.characters[me.charloc], 0, 0, 1); controlData.click(controlData.controls.characterSelect.textBox.characterInfo[me.charloc], 0, 0, 1); // reset last game made, so it doesnt make a game immediately inGameAt = 0; setNextGameMake(); } else { controlData.click(controlData.controls.characterSelect.button.exit); timeoutDelay(realmDownRetry*60*1000, location); } break; case 13: // Realm Down - Character Select screen controlData.click(controlData.controls.characterSelect.button.exit); timeoutDelay(realmDownRetry*60*1000, location); break; case 14: // Character Select - Disconnected timeoutDelay(disconnectedRetry*60*1000, location); controlData.click(controlData.controls.characterSelect.disconnected.button.ok); break; case 15: // New Character break; case 16: // Character Select - Please Wait popup if(!locationTimeout(pleaseWaitTimeout, location)) controlData.click(controlData.controls.characterSelect.pleaseWait.button.cancel); break; case 17: // Lobby - Lost Connection - just click okay, since we're toast anyway controlData.click(controlData.controls.lobby.lostConnection.button.ok); break; case 18: // D2 Splash controlData.click(controlData.controls.d2Splash.textBox.copyright); break; case 19: // Login - Cdkey In Use timeoutDelay(cdkeyInUseRetry*60*1000, location); controlData.click(controlData.controls.login.cdkeyInUse.button.ok); break; case 20: // Single Player - Select Difficulty controlData.click(controlData.singlePlayerDifficulties[me.diff]); break; case 21: // Main Menu - Connecting if(!locationTimeout(connectingToBnetTimeout, location)) controlData.click(controlData.controls.mainMenu.connecting.button.cancel); break; case 22: // Login - Invalid Cdkey (classic or xpac) sendEventToOOG(D2NT_MGR_PRINT_LOG, COLOR_1 + "Bad CD Key...........Idling", 0); while(1) { Delay(500); } //sendEventToOOG(D2NT_MGR_RESTART, location.name, 3600); Delay(3500); break; case 23: // Character Select - Connecting if(!locationTimeout(characterScreenTimeout, location)) controlData.click(controlData.controls.characterSelect.button.exit); break; case 24: // Server Down - not much to do but wait.. break; case 25: // Lobby - Please Wait if(!locationTimeout(pleaseWaitTimeout, location)) controlData.click(controlData.controls.lobby.pleaseWait.button.cancel); break; case 26: // Lobby - Game Name Exists sendEventToOOG(D2NT_MGR_PRINT_LOG, "yE00000Game already exists", 0); inGameAt = 0; lastGameStatus = 0; setNextGameMake(); locationTimeout(15000, location); break; case 27: // Gateway Select controlData.clickRealmEntry(me.gatewayid); controlData.click(controlData.controls.gateway.button.ok); break; case 28: // Lobby - Game Does Not Exist sendEventToOOG(D2NT_MGR_PRINT_LOG, COLOR_1 + "Leader's game does not exist...........Idling", 0); Delay(gameDoesNotExistDelay*1000); inGameAt = Random(gameDoesNotExistDelayMin, gameDoesNotExistDelayMax); lastGameStatus = 0; setNextGameMake(); locationTimeout(gameDoesNotExistTimeout, location); break; default: if (lastGameStatus == 1) { sendEventToOOG(D2NT_MGR_PRINT_STATUS, "Please Wait...", 0); for (ftjcount=0; ftjcount<=10 && !me.ingame; ftjcount++) { Delay(1000) } } DebugInOOG("Unhandled location : "+location.id); break; } DebugInOOG("Location : "+location.id); } function sendEventToOOG(locationId, statusString, pendingTime) { return SendCopyData("D2NT Manager", null, (locationId<<16)|pendingTime, statusString); } function setNextGameMake() { lastGameMade = GetTickCount(); nextGameMake = lastGameMade + createGameThreshold + Random(0-createGameThresholdRandom, createGameThresholdRandom) + inGameAt; inGameAt = 0; chatActionsDone = false; } function outputGameLength() { if(inGameAt) { duration = GetTickCount() - inGameAt; inGameAt = (duration < gameMinLength ? gameMinLength - duration : 0); } } function locationTimeout(time, location) { endtime = GetTickCount() + time; while(controlData.getLocation().id == location.id && endtime > GetTickCount()) { sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name + " (" + parseInt((endtime-GetTickCount())/1000) + "s)", 0); Delay(500); } return (controlData.getLocation().id != location.id); } function timeoutDelay(time, location) { endtime = GetTickCount() + time; while(endtime > GetTickCount()) { sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name + " (" + parseInt((endtime-GetTickCount())/1000) + "s)", 0); Delay(1000); } } function getRandomString(_length) { _retString = ""; _charSet = "0123456789abcdefghijklmnopqrstuvwxyz"; while(_length--) { _retString += _charSet.charAt(Random(0, _charSet.length-1)); Delay(1); } return _retString; } function DebugInOOG(logString) { if (Debug) return SendCopyData("D2NT Manager", null, 9<<16, "-- Debug : " + logString); else return false; } function My_ExitGame_Check() { for (var i = 0; i < 40; i++) { if (controlData.getLocation().id != undefined) break; if (i > 38) { LogPrintSimple(me.account + " StarterTest.txt", "White Screen of Death: Restarting") sendEventToOOG(D2NT_MGR_PRINT_LOG, COLOR_1 + "White Screen of Death: Restarting", 0); sendEventToOOG(D2NT_MGR_RESTART, "", 5); My_Delay(); // make sure and add this also } Delay(500); } } function My_Delay(retry) { if (arguments.length < 1) retry = 20; while (retry-- > 0) Delay(1000); } function LogPrintSimple(filepath, mesg){ var _filepath = filepath; var _mesg = mesg; var date = new Date().toLocaleFormat("<%a, %b %d, %H:%M>"); var logfile = FileOpen(_filepath, 2); // opens file if(!logfile) var logfile = FileOpen(_filepath, 1); // if file not there then creates it logfile.WriteLine(date + " " + _mesg ); logfile.Close(); } function GateWayToName(){ switch(me.gatewayid){ case 0: return 'USWest'; case 1: return 'USEast'; case 2: return 'Asia'; case 3: return 'Europe'; default: return 'ugly'; // not sure how asia1, asia2, etc work so adding this for now } } // modes 0 = read only, 1 = overwrite the file, 2 = add to file function NT_File(path, mode, msg, delay) { //big thanks to all the koreans out there var _msg = ""; var _line = ""; var _fileHandle; var _isFileCheck = false; if (arguments.length < 3) { msg = ""; } if (arguments.length < 4) { delay = (mode > 0) ? 5 : 2; } while (delay--) { if (mode == 2 && !_isFileCheck) { _fileHandle = FileOpen(path, 0); if (!_fileHandle) _fileHandle = FileOpen(path, 1); if (_fileHandle) _fileHandle.Close(); _isFileCheck = true; } _fileHandle = FileOpen(path, mode); if (_fileHandle) break; if (delay) Delay(200); } if (_fileHandle) { if (mode == 0) { while (!_fileHandle.eof) { _line = _fileHandle.ReadLine(); if (_line || !_fileHandle.eof) _msg += _line + msg; } } else if (msg) _fileHandle.WriteLine(msg); _fileHandle.Close(); } return _msg; } function NT_RetrieveLastGame() { var grabLastGame = FileOpen("logs/messagecomands/"+me.charname+"-lastgame.txt", 0); // open file in read only if(!grabLastGame){ var grabLastGame = FileOpen("logs/messagecomands/"+me.charname+"-lastgame.txt", 1); // because the file doesn't exist create it } if(grabLastGame){ lastGame = grabLastGame.ReadLine(); //retrieve the line and set the lastGame variable to it so we can check it against the game we may want to join grabLastGame.Close(); } return; } function NT_RetrievenextGame() { // to retrieve game and pw var grabLine; var grabNextGame = FileOpen("logs/messagecomands/"+leaderName+"-nextgame.txt", 0); // open file in read only if(!grabNextGame){ var grabNextGame = FileOpen("logs/messagecomands/"+leaderName+"-nextgame.txt", 1); // because the file doesn't exist create it } if(grabNextGame){ grabLine = grabNextGame.ReadLine(); //retrieve the line and set the nextGame variable to it so we can check it against the game we may want to join game = grabLine.substring(0, grabLine.indexOf('/')); //extracting game name from beginning of line to the "/" gamepassword = grabLine.substring(grabLine.indexOf('/') + 1, grabLine.length); //Parse after symbol till end of line. grabNextGame.Close(); } return; } // so now we need to add code to get the next game and pw as well as check it against the last game