Register for your free account! | Forgot your password?

Go Back   elitepvpers > Other Online Games > Diablo 2
You last visited: Today at 08:40

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[D2NT] GVEtalBot

Discussion on [D2NT] GVEtalBot within the Diablo 2 forum part of the Other Online Games category.

Reply
 
Old 06/27/2013, 01:52   #571

 
elite*gold: 315
The Black Market: 219/2/4
Join Date: Jul 2008
Posts: 3,284
Received Thanks: 1,133
Quote:
Originally Posted by ekaf.liam View Post
hmm die benutze ich eigentlich.. hier ist mein code (namen sind in der eigentlichen datei natürlich richtig geschrieben). ist das nicht die version, die du meinst?

Code:
// 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 = "xxx_yy"; 
var leaderName = "yyy";

// =============================================================================
// 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 = ["characterName", 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 = 0;					// 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 = 5000;					// 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 = 2;			// number 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 = "zzz";

// =============================================================================
// 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    = "channel xyz";		// 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
Hast eventuell vergessen, in der Char Config den neuen Leader-Namen einzutragen oder Leader+Leecher haben sich evtl nicht in der f-list.
Gt-Kingz is offline  
Thanks
1 User
Old 07/01/2013, 15:11   #572
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
Quote:
Originally Posted by Gt-Kingz View Post
Hast eventuell vergessen, in der Char Config den neuen Leader-Namen einzutragen oder Leader+Leecher haben sich evtl nicht in der f-list.
sorry, war übers wochenende weg.
nein das ist auch alles passend eingestellt... aber danke für den tipp!

edit: die charconfig dürfte doch eigentlich auch nur für den ingame-teil entscheidend sein oder?
und auf der f-list haben sich die accounts, wie gesagt anders herum joinen funktioniert ja. (wenn auch sehr langsam)
ekaf.liam is offline  
Old 07/05/2013, 06:59   #573
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
Problem besteht leider immer noch.

Außerdem: Kann mir jemand vielleicht erklären, wie ich es hinbekomme, dass der leecher schneller ins game joined? Das braucht - wenn es denn mal klappt - so um die 10-15 Sekunden.

Danke schonmal!
ekaf.liam is offline  
Old 07/05/2013, 09:12   #574

 
elite*gold: 315
The Black Market: 219/2/4
Join Date: Jul 2008
Posts: 3,284
Received Thanks: 1,133
Quote:
Originally Posted by ekaf.liam View Post
Problem besteht leider immer noch.

Außerdem: Kann mir jemand vielleicht erklären, wie ich es hinbekomme, dass der leecher schneller ins game joined? Das braucht - wenn es denn mal klappt - so um die 10-15 Sekunden.

Danke schonmal!
Ich kanns mit nicht anders erklären. Ich selbst habe nämlich einiger Chars mit Unterstrichen, fungieren dennoch sehr gut als Leader + Leecher. Könnte mal per Teamviewer nach dem Rechten schauen wenn du magst.
In der Leechstarter v2.3.ntj müsstest du fastjoin = true setzen, somit joint der Leecher schneller.
Gt-Kingz is offline  
Thanks
1 User
Old 07/05/2013, 11:15   #575
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
Quote:
Originally Posted by Gt-Kingz View Post
Ich kanns mit nicht anders erklären. Ich selbst habe nämlich einiger Chars mit Unterstrichen, fungieren dennoch sehr gut als Leader + Leecher. Könnte mal per Teamviewer nach dem Rechten schauen wenn du magst.
In der Leechstarter v2.3.ntj müsstest du fastjoin = true setzen, somit joint der Leecher schneller.
Hab es jetzt nochmal alles ausprobiert und es bleibt dabei, dem Account mit Unterstrich kann ich nicht joinen - andersherum funktionierts, aber dauert ungefähr 10 Sekunden (obwohl ich fastjoin auf true gestellt habe).
Hättest du Lust, mir einfach mal deine Leechstarter hochzuladen? Dann würde ich es damit mal probieren. Wenn das auch fehlschlägt, dann würde ich dein TeamViewer Angebot wahrnehmen.
ekaf.liam is offline  
Old 07/05/2013, 15:38   #576

 
elite*gold: 315
The Black Market: 219/2/4
Join Date: Jul 2008
Posts: 3,284
Received Thanks: 1,133
Quote:
Originally Posted by ekaf.liam View Post
Hab es jetzt nochmal alles ausprobiert und es bleibt dabei, dem Account mit Unterstrich kann ich nicht joinen - andersherum funktionierts, aber dauert ungefähr 10 Sekunden (obwohl ich fastjoin auf true gestellt habe).
Hättest du Lust, mir einfach mal deine Leechstarter hochzuladen? Dann würde ich es damit mal probieren. Wenn das auch fehlschlägt, dann würde ich dein TeamViewer Angebot wahrnehmen.
Im Anhang
Gt-Kingz is offline  
Thanks
1 User
Old 07/06/2013, 13:45   #577
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
die join-zeit braucht für meinen geschmack immer noch zu lange (klappt nich dass er auf die grüne msg joined), aber immerhin klappt das joinen jetzt! danke sehr

Edit:
Okay jetzt hätte ich noch ein anderes Anliegen
Ich habe einen Leecher im Game, der aber nicht mit in die Party soll (habe dazu einfach public mode beim leecher ausgestellt). Jetzt habe ich aber das Problem, dass er sich beim Spiel verlassen nicht nach dem Leader richtet... gibts da eine Möglichkeit, dass er trotzdem nur mit dem Leader das Spiel verlässt?

Edit2:
Offenbar funktioniert es nicht mal, wenn die Einstellung beim Leecher auf public sind. Beim anderen Leecher (der unter anderem auch bei Baal mitmacht, was der "Problem-Leecher" nicht tut) funktioniert alles einwandfrei...
Weiß jemand Rat?

Edit3:
Vergesst Edit 2. Der Teil zumindest funktioniert doch, sorry.

Edit4:
Oder vielleicht auch doch nicht!? Scheint mal so und mal so zu sein irgendwie. oO
ekaf.liam is offline  
Old 07/07/2013, 20:22   #578
 
TomekkXo's Avatar
 
elite*gold: 20
Join Date: Apr 2011
Posts: 300
Received Thanks: 20
Moin, mein Leader Cleant vor dem Hot tp erstmal den Point, wo er es machen will, wie stelle ich das um, das der trotz allen Monsters nen Tp da rein haut?
TomekkXo is offline  
Old 07/08/2013, 08:51   #579
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
Quote:
Originally Posted by TomekkXo View Post
Moin, mein Leader Cleant vor dem Hot tp erstmal den Point, wo er es machen will, wie stelle ich das um, das der trotz allen Monsters nen Tp da rein haut?
versuche mal, in der D2NT\scripts\NTBot\bots\NTWorldStoneKeep.ntj folgendes zu ändern:
ab zeile 117 steht da folgendes: (hoffe du hast das gleiche skript)
Code:
	NTA_ClearPosition(20, true, 2);
	if(NTConfig_PublicMode){
		if(NTConfig_MakeHotTP){
			NTM_MoveTo(me.areaid, 15091, 5006);
			NTC_PingDelay(1000);
			NTA_ClearPosition(20, true, 2);
			NTM_MoveTo(me.areaid, 15091, 5006);
			if(NTThrone_Announce)
				_announceTMobs();
			NTM_MakeTP();
			Say(Baal_HotTp);
			NTC_Delay(500);
			NTP_DoPrecast(true);
		}
	}
ändere das mal so, dass du die zeilen 117 und 122 auskommentierst, d.h.

Code:
	//NTA_ClearPosition(20, true, 2);
	if(NTConfig_PublicMode){
		if(NTConfig_MakeHotTP){
			NTM_MoveTo(me.areaid, 15091, 5006);
			NTC_PingDelay(1000);
			//NTA_ClearPosition(20, true, 2);
			NTM_MoveTo(me.areaid, 15091, 5006);
			if(NTThrone_Announce)
				_announceTMobs();
			NTM_MakeTP();
			Say(Baal_HotTp);
			NTC_Delay(500);
			NTP_DoPrecast(true);
		}
	}
einfach mal ausprobieren, hoffe das löst dein problem!
ekaf.liam is offline  
Old 07/08/2013, 09:08   #580
 
DonPalme's Avatar
 
elite*gold: 0
Join Date: Mar 2009
Posts: 437
Received Thanks: 62
Quote:
Originally Posted by ekaf.liam View Post
versuche mal, in der D2NT\scripts\NTBot\bots\NTWorldStoneKeep.ntj folgendes zu ändern:
ab zeile 117 steht da folgendes: (hoffe du hast das gleiche skript)
Code:
	NTA_ClearPosition(20, true, 2);
	if(NTConfig_PublicMode){
		if(NTConfig_MakeHotTP){
			NTM_MoveTo(me.areaid, 15091, 5006);
			NTC_PingDelay(1000);
			NTA_ClearPosition(20, true, 2);
			NTM_MoveTo(me.areaid, 15091, 5006);
			if(NTThrone_Announce)
				_announceTMobs();
			NTM_MakeTP();
			Say(Baal_HotTp);
			NTC_Delay(500);
			NTP_DoPrecast(true);
		}
	}
ändere das mal so, dass du die zeilen 117 und 122 auskommentierst, d.h.

Code:
	//NTA_ClearPosition(20, true, 2);
	if(NTConfig_PublicMode){
		if(NTConfig_MakeHotTP){
			NTM_MoveTo(me.areaid, 15091, 5006);
			NTC_PingDelay(1000);
			//NTA_ClearPosition(20, true, 2);
			NTM_MoveTo(me.areaid, 15091, 5006);
			if(NTThrone_Announce)
				_announceTMobs();
			NTM_MakeTP();
			Say(Baal_HotTp);
			NTC_Delay(500);
			NTP_DoPrecast(true);
		}
	}
einfach mal ausprobieren, hoffe das löst dein problem!
nicht schlau, da er dann in den mobs steht und erstmal ewig wartet und precastet. in dem moment wo er auf bo swicht hat er kein max block mehr. würde es eher so machen:

Code:
	//NTA_ClearPosition(20, true, 2);
	if(NTConfig_PublicMode){
		if(NTConfig_MakeHotTP){
			NTM_MoveTo(me.areaid, 15091, 5006);
			NTC_PingDelay(1000);
			NTM_MoveTo(me.areaid, 15091, 5006);
			if(NTThrone_Announce)
				_announceTMobs();
			NTM_MakeTP();
			Say(Baal_HotTp);
			NTC_Delay(500);
			NTA_ClearPosition(20, true, 2);
			NTP_DoPrecast(true);
		}
	}
DonPalme is offline  
Old 07/08/2013, 11:06   #581
 
elite*gold: 0
Join Date: Oct 2010
Posts: 59
Received Thanks: 8
Quote:
Originally Posted by DonPalme View Post
nicht schlau, da er dann in den mobs steht und erstmal ewig wartet und precastet. in dem moment wo er auf bo swicht hat er kein max block mehr. würde es eher so machen:
ja das stimmt wohl, hatte ich nicht bedacht, macht vermutlich mehr sinn so!
ekaf.liam is offline  
Old 07/08/2013, 20:43   #582
 
TomekkXo's Avatar
 
elite*gold: 20
Join Date: Apr 2011
Posts: 300
Received Thanks: 20
Scheisse, jetzt hab ich die Safe msg daunter raus genommen, jetzt cleant er nichtmehr, und macht kein Safe tp mehr, kann mir das nochmal wer posten?
TomekkXo is offline  
Old 07/16/2013, 15:57   #583
 
elite*gold: 0
Join Date: Apr 2010
Posts: 51
Received Thanks: 0
hm wie stell ich ein das er fast cs macht ?
also nur seals auf boss töten und zum nächsten seal

//--------------------------\\
// Diablo Settings: \\
//--------------------------\\

NTConfig_CSSealsOnly = true;
NTConfig_CSFrom = "S"; // (E)ntrance | (S)tar
NTConfig_CSTpNotSafe = "TP up. Might be hot!";
NTConfig_CSTpSafe = "TP safe.";
NTConfig_CSKillDiablo = "Diablo time!";
NTConfig_CSScriptEnd = "It's Baal time Mubns!";
NTConfig_CSIdiotMsg = "Please don't hit the seals!";
NTConfig_WaitAndBO = true; // Wait and cast BO? (If you don't have a tha ability to BO, set false.)
NTConfig_BOSayMsg = 'Casting BO in'; // What you'll say while waiting (time set below in seconds) to cast BO (Don't include seconds)?
NTConfig_BOWait = 2; // Time in seconds to wait before using BO.
NTConfig_DNextGameSay = "Next game will be "; // Message before saying next game. (To disable, make the quotes empty "").
Diablo_FreeSpaceMessage = "Towning Quickly..."; // NTConfig_FreeSpaceBeforeBoss (Setting below) message before going to town to clear inventory.
NTConfig_TownBeforeDiablo = false; // Town before killing Diablo if you have less than the inventory space configured in Inventory settings?
H!tman is offline  
Old 07/17/2013, 11:41   #584

 
elite*gold: 315
The Black Market: 219/2/4
Join Date: Jul 2008
Posts: 3,284
Received Thanks: 1,133
Quote:
Originally Posted by TomekkXo View Post
Scheisse, jetzt hab ich die Safe msg daunter raus genommen, jetzt cleant er nichtmehr, und macht kein Safe tp mehr, kann mir das nochmal wer posten?
Kannst dir den Bot einfach neu herunterladen und es von dort aus kopieren.


Quote:
Originally Posted by H!tman View Post
hm wie stell ich ein das er fast cs macht ?
also nur seals auf boss töten und zum nächsten seal

//--------------------------\\
// Diablo Settings: \\
//--------------------------\\

NTConfig_CSSealsOnly = true;
NTConfig_CSFrom = "S"; // (E)ntrance | (S)tar
NTConfig_CSTpNotSafe = "TP up. Might be hot!";
NTConfig_CSTpSafe = "TP safe.";
NTConfig_CSKillDiablo = "Diablo time!";
NTConfig_CSScriptEnd = "It's Baal time Mubns!";
NTConfig_CSIdiotMsg = "Please don't hit the seals!";
NTConfig_WaitAndBO = true; // Wait and cast BO? (If you don't have a tha ability to BO, set false.)
NTConfig_BOSayMsg = 'Casting BO in'; // What you'll say while waiting (time set below in seconds) to cast BO (Don't include seconds)?
NTConfig_BOWait = 2; // Time in seconds to wait before using BO.
NTConfig_DNextGameSay = "Next game will be "; // Message before saying next game. (To disable, make the quotes empty "").
Diablo_FreeSpaceMessage = "Towning Quickly..."; // NTConfig_FreeSpaceBeforeBoss (Setting below) message before going to town to clear inventory.
NTConfig_TownBeforeDiablo = false; // Town before killing Diablo if you have less than the inventory space configured in Inventory settings?
NTConfig_CSSealsOnly = true;


Also sollte so funktionieren, wie du es eingestellt hast.
Gt-Kingz is offline  
Old 07/18/2013, 16:20   #585
 
elite*gold: 0
Join Date: Apr 2010
Posts: 51
Received Thanks: 0
Quote:
Originally Posted by Gt-Kingz View Post
Kannst dir den Bot einfach neu herunterladen und es von dort aus kopieren.




NTConfig_CSSealsOnly = true;


Also sollte so funktionieren, wie du es eingestellt hast.
macht er leider nicht er cleant cs :/
H!tman is offline  
Reply

Tags
bot, d2nt, etal, etalbot, gvetalbot


Similar Threads Similar Threads
help D2NT
12/27/2010 - Diablo 2 - 5 Replies
brauch mal bischen hilfe bei D2NT und zwar hat er ja die einstellung das er flüche nicht mehr heilen soll ok macht er soweit auser bei verstärktem schaden rennt der jedesmal in die stadt zu heilen, was sehr sehr zeitintensiev bei diaruns ist finde ich. wäre nice wen da jemand eine lösung kennt danke
d2nt leech bot einstellen... d2nt config error..
07/09/2010 - Diablo 2 Programming - 2 Replies
hey mein bot zeigt mir die ganze zeit ein error und habe die einstellungen in der anleitung genauso... was tun? habe leader acc/ char name eingetragen. beide flistet. die eine datei aus baalleech rausgeholt und umbenannt und die // weg genommen habe beim manager auch auf d2nt leech eingestelln
D2NT 3.1 BOT
06/04/2010 - Diablo 2 - 4 Replies
Hey! leider hört mein D2NT CO Baal leech bot immer nach einer Weile auf und steht nur noch im Chat. Ist dieser Fehler bekannt? Was kann man dagegen tun? Hoffe jemand kann mir helfen, danke! quapx
D2NT - Modded D2NT
11/08/2009 - Diablo 2 - 9 Replies
Hey, wollte nach ner langen Pause mal wieder den Bot starten. Hatte damals den normalen D2NT, hat mir auch gut gefallen. Frage mich grad nur welchen ich mir jetzt laden soll- den D2NT oder den modded D2NT? Wo ist der Unterschied?
D2NT 1.7.2 und NTBot 3.6 , Modded D2NT 1.7.2 und NTBot 3.6 welcher ist besser?
05/23/2009 - Diablo 2 - 11 Replies
Modded D2NT 1.7.2 und NTBot 3.6 D2NT 1.7.2 und NTBot 3.6 kann mir jemand sagen welcher von denen besser ist? oder wo die unterschiede sind?



All times are GMT +1. The time now is 08:42.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.