View difference between Paste ID: QbL43sQb and tzXTJgsL
SHOW: | | - or go back to the newest paste.
1
var gameMinLength		= 30000;	// time in milliseconds, minimum game length, 180 seconds default (1 game/3 minutes)
2
var gamesPerKey			= 0;	// games per key d'oh! used to switch keys in use. MUST BE THE SAME NUMBER YOU PUT IN MANAGER
3
4
var unableToConnectRetry	= 5;		// time in minutes to retry connecting on connection fail (real value is +/- 1 min)
5
var realmDownRetry		= 300;		// time in minutes to retry connecting on a realm down (default is 300 minutes)
6
var disconnectedRetry		= 5;		// time in minutes to retry on a disconnection (usually ip ban related)
7
var cdkeyInUseRetry		= 0;		// time in minutes to retry on a cdkey in use error message (set to 0 to stop)
8
var connectingToBnetTimeout	= 20000;	// time in milliseconds to wait for a login to time out and click cancel and retry
9
var characterScreenTimeout	= 10000;	// time in milliseconds to wait for character screen to appear
10
var pleaseWaitTimeout		= 10000;	// time in milliseconds to wait for a please wait popup
11
var createGameThreshold		= 8000;		// time in milliseconds to wait between making games
12
var createGameThresholdRandom	= 1000;		// time in milliseconds to randomly add +/- to the game create time
13
var createGameTimeout		= 15000;	// time in milliseconds to register a failed to create game
14
var waitInLineTimeout		= 60000;	// time in milliseconds to wait in lines for a create game (60 second default)
15
var characterSelectDelay	= 1000;		// time in milliseconds to wait before selecting a character on the char screen
16
var loginDelay			= 1000;		// time in milliseconds to wait before submitting login information
17
var clickDelay			= 500;		// wait X milliseconds before next action after a click event
18
var textDelay			= 500;		// wait X milliseconds before next action after inserting text into a textbox
19
var clickDelayRandom		= 500;		// random amount of time to add to a click
20
var textDelayRandom		= 500;		// random amount of time to add to a text set
21
var gameDoesNotExistDelayMin	= 600000;	// how long to wait when a Game Does Not Exist occurs - minimum - default 10 minutes
22
var gameDoesNotExistDelayMax	= 900000;	// how long to wait when a Game Does Not Exist occurs - maximum - default 15 minutes
23
var gameDoesNotExistTimeout	= 30000;	// how long to wait for the dialog to disappear (default 30 seconds, don't change this)
24
var joinChatAfterGame		= false;	// join chat after leaving a game
25
var joinRandomChannel		= true;		// if this is true, will join a random channel, otherwise it will use the channel below..
26
var joinChannelInChat		= "";		// leave blank to not join a private channel
27
var waitBeforeEnterChatMin	= 1000;		// min how long to wait before entering chat
28
var waitBeforeEnterChatMax	= 2000;		// max how long to wait before entering chat
29
var waitInChatBeforeActionsMin	= 2000;		// min how long to wait before joining channel
30
var waitInChatBeforeActionsMax	= 3000;		// max how long to wait before joining channel
31
32
// DONT EDIT ANYTHING BELOW THIS
33
34
// D2NT Manager Command
35
const D2NT_MGR_LOADING = 1;
36
const D2NT_MGR_READY = 2;
37
const D2NT_MGR_LOGIN = 3;
38
const D2NT_MGR_CREATE_GAME = 4;
39
const D2NT_MGR_INGAME = 5;
40
const D2NT_MGR_RESTART = 6;
41
const D2NT_MGR_CHICKEN = 7;
42
const D2NT_MGR_PRINT_STATUS = 8;
43
const D2NT_MGR_PRINT_LOG = 9;
44
45
var lastGameMade = GetTickCount();
46
var lastGameStatus = 0;
47
var nextGameMake = 0;
48
var inGameAt = 0;
49
var chatActionsDone = false;
50
var lastGameFailed = false;
51
52
Include("libs/controlInfo.ntl");
53
54
var controlData = new controlInfo();
55
56
function NTMain()
57
{
58
	Delay(1000);
59
60
	var _ingame = false;
61
62
	controlData.clickDelay = clickDelay;
63
	controlData.textDelay = textDelay;
64
	controlData.clickDelayRandom = clickDelayRandom;
65
	controlData.textDelayRandom = textDelayRandom;
66
67
	while(1)
68
	{
69
		if(me.ingame)
70
		{
71
			if(!inGameAt)
72
				inGameAt = GetTickCount();
73
74
			if(!_ingame)
75
			{
76
				RunGC(); // run garbage collector between each game
77
78
				if(Load("NTBot/NTBotGame.ntj"))
79
				{
80
					_ingame = true;
81
82
					if(me.playtype > 0)
83
						sendEventToOOG(D2NT_MGR_INGAME, "In Game[IP:" + me.gameserverip.split(".")[3] + "]", 0);
84
					else
85
						sendEventToOOG(D2NT_MGR_INGAME, "In Game", 0);
86
87
					lastGameStatus = 2; // in game successful
88
				}
89
			}
90
91
			Delay(1000);
92
		}
93
		else
94
		{
95
			if(_ingame)
96
			{
97
				_ingame = false;
98
99
				sendEventToOOG(D2NT_MGR_READY, "", 0);
100
			}
101
102
			locationAction(controlData.getLocation());
103
104
			Delay(500);
105
		}
106
	}
107
}
108
109
function locationAction(location)
110
{
111
	switch(location.id)
112
	{
113
	case 3: // Lobby Chat
114
		if(!chatActionsDone)
115
		{
116
			chatActionsDone = true;
117
			Delay(Random(waitInChatBeforeActionsMin, waitInChatBeforeActionsMax));
118
119
			if(joinRandomChannel || joinChannelInChat != "")
120
			{
121
				Say("/join " + (joinRandomChannel ? getRandomString(Random(3,10)) : joinChannelInChat));
122
				Delay(1000);
123
			}
124
		}
125
	case 1:	// Lobby
126
		if(location.id == 1 && joinChatAfterGame)
127
		{
128
			Delay(Random(waitBeforeEnterChatMin, waitBeforeEnterChatMax));
129
			controlData.click(controlData.controls.lobby.button.enterChat);
130
			break;
131
		}
132
133
		if(GetTickCount() > nextGameMake)
134
		{
135
			var _control;
136
137
			lastGameFailed = false;
138
139
			switch(lastGameStatus)
140
			{
141
			case 0:
142
				_control = controlData.get(controlData.controls.lobby.button.create);
143
				if(_control && _control.pressed)
144
				{
145
					controlData.click(controlData.controls.lobby.button.join);
146
					Delay(500);
147
				}
148
149
				controlData.click(controlData.controls.lobby.button.create);
150
				nextGameMake = GetTickCount() + createGameTimeout; // set our timeout
151
				sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);
152
				break;
153
			case 1: // game failed, rollover to reset timer
154
				inGameAt = GetTickCount(); // reset inGameAt, to wait how long we should have waited..
155
				lastGameFailed = true;
156
			case 2:
157
				outputGameLength();
158
				lastGameStatus = 0;
159
				setNextGameMake();
160
				sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);
161
				break;
162
			}
163
		}
164
		else
165
			timeoutDelay(nextGameMake-GetTickCount(), location);
166
		break;
167
168
	case 2: // Waiting In Line
169
		if(GetTickCount()-lastGameMade > waitInLineTimeout)
170
			controlData.click(controlData.controls.lobby.inLine.button.cancel);
171
		break;
172
173
	case 4: // Create Game
174
		sendEventToOOG(D2NT_MGR_CREATE_GAME, location.name, 0);
175
176
		locationTimeout(5000, location);
177
178
		lastGameMade = GetTickCount();
179
		lastGameStatus = 1; // pending creation
180
		break;
181
182
	case 5: // Join Game
183
		break;
184
185
	case 6: // Ladder
186
		break;
187
188
	case 7: // Channel List
189
		break;
190
191
	case 8: // Main Menu
192
		if(controlData.getCurrentRealmIndex() == me.gatewayid)
193
		{
194
			outputGameLength();
195
			controlData.click(controlData.gameTypes[me.playtype]);
196
		}
197
		else
198
			controlData.click(controlData.controls.mainMenu.button.gateway);
199
		break;
200
201
	case 9: // Login
202
		sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);
203
		Delay(loginDelay);
204
205
		controlData.setText(controlData.controls.login.editBox.accountName, me.account);
206
207
		sendEventToOOG(D2NT_MGR_LOGIN, location.name, 0);
208
209
		locationTimeout(5000, location);
210
		break;
211
212
	case 10: // Login Error (this is a fatal error, so stop)
213
		sendEventToOOG(D2NT_MGR_RESTART, location.name, 10);
214
		Delay(3500);
215
		break;
216
217
	case 11: // Unable To Connect
218
		timeoutDelay(unableToConnectRetry*60*1000, location)
219
		controlData.click(controlData.controls.login.unableToConnect.button.ok);
220
		break;
221
222
	case 12: // Character Select
223
		var _time, _control;
224
225
		sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);
226
227
		for(_time = 0 ; _time < characterScreenTimeout ; _time += 500)
228
		{
229
			_control = controlData.get(controlData.controls.characterSelect.textBox.characterInfo[me.charloc]);
230
			if(_control && _control.GetText() != undefined)
231
				break;
232
233
			Delay(500);
234
		}
235
236
		if(_time < characterScreenTimeout)
237
		{
238
			Delay(characterSelectDelay);
239
240
			controlData.click(controlData.controls.characterSelect.textBox.characters[me.charloc], 0, 0, 1);
241
			controlData.click(controlData.controls.characterSelect.textBox.characterInfo[me.charloc], 0, 0, 1);
242
243
			// reset last game made, so it doesnt make a game immediately
244
			inGameAt = 0;
245
			setNextGameMake();
246
		}
247
		else
248
		{
249
			controlData.click(controlData.controls.characterSelect.button.exit);
250
			timeoutDelay(realmDownRetry*60*1000, location);
251
		}
252
		break;
253
254
	case 13: // Realm Down - Character Select screen
255
		controlData.click(controlData.controls.characterSelect.button.exit);
256
		timeoutDelay(realmDownRetry*60*1000, location);
257
		break;
258
259
	case 14: // Character Select - Disconnected
260
		timeoutDelay(disconnectedRetry*60*1000, location);
261
		controlData.click(controlData.controls.characterSelect.disconnected.button.ok);
262
		break;
263
264
	case 15: // New Character
265
		break;	
266
267
	case 16: // Character Select - Please Wait popup
268
		if(!locationTimeout(pleaseWaitTimeout, location))
269
			controlData.click(controlData.controls.characterSelect.pleaseWait.button.cancel);
270
		break;
271
272
	case 17: // Lobby - Lost Connection - just click okay, since we're toast anyway
273
		controlData.click(controlData.controls.lobby.lostConnection.button.ok);
274
		break;
275
276
	case 18: // D2 Splash
277
		controlData.click(controlData.controls.d2Splash.textBox.copyright);
278
		break;
279
280-
		timeoutDelay(cdkeyInUseRetry*60*1000, location);
280+
281-
		controlData.click(controlData.controls.login.cdkeyInUse.button.ok);
281+
		if (gamesPerKey > 0) {
282
			sendEventToOOG(D2NT_MGR_PRINT_LOG, "ÿc1Key in use. Increasing game count.", 0);
283
			
284
			for (var i = 0 ; i < gamesPerKey ; i++) {
285
				sendEventToOOG(4, (gamesPerKey - i) + " increments left.", 0);
286
				Delay(1500);
287
			}
288
			
289
			sendEventToOOG(D2NT_MGR_PRINT_LOG, "ÿc1Key in use. Switching to next one...", 0);
290
			Delay(500);
291
			sendEventToOOG(D2NT_MGR_RESTART, "", 5);
292
		} else {
293
			timeoutDelay(cdkeyInUseRetry*60*1000, location);
294
			controlData.click(controlData.controls.login.cdkeyInUse.button.ok);
295
		}
296
		
297
		break;
298
299
	case 20: // Single Player - Select Difficulty
300
		controlData.click(controlData.singlePlayerDifficulties[me.diff]);
301
		break;
302
303
	case 21: // Main Menu - Connecting
304
		if(!locationTimeout(connectingToBnetTimeout, location))
305
			controlData.click(controlData.controls.mainMenu.connecting.button.cancel);
306
		break;
307
308
	case 22: // Login - Invalid Cdkey (classic or xpac)
309
		sendEventToOOG(D2NT_MGR_RESTART, location.name, 3600);
310
		Delay(3500);
311
		break;	
312
313
	case 23: // Character Select - Connecting
314
		if(!locationTimeout(characterScreenTimeout, location))
315
			controlData.click(controlData.controls.characterSelect.button.exit);
316
		break;
317
318
	case 24: // Server Down - not much to do but wait..
319
		break;
320
321
	case 25: // Lobby - Please Wait
322
		if(!locationTimeout(pleaseWaitTimeout, location))
323
			controlData.click(controlData.controls.lobby.pleaseWait.button.cancel);
324
		break;
325
326
	case 26: // Lobby - Game Name Exists
327
		sendEventToOOG(D2NT_MGR_PRINT_LOG, "ÿE00000Game already exists", 0);
328
329
		inGameAt = 0;
330
		lastGameStatus = 0;
331
		setNextGameMake();
332
333
		locationTimeout(15000, location);
334
		break;
335
336
	case 27: // Gateway Select
337
		controlData.clickRealmEntry(me.gatewayid);
338
		controlData.click(controlData.controls.gateway.button.ok);
339
		break;
340
341
	case 28: // Lobby - Game Does Not Exist
342
		inGameAt = Random(gameDoesNotExistDelayMin, gameDoesNotExistDelayMax);
343
		lastGameStatus = 0;
344
		setNextGameMake();
345
346
		locationTimeout(gameDoesNotExistTimeout, location);
347
		break;
348
	}
349
}
350
351
function sendEventToOOG(locationId, statusString, pendingTime)
352
{
353
	return SendCopyData("D2NT Manager", null, (locationId<<16)|pendingTime, statusString);
354
}
355
356
function setNextGameMake()
357
{
358
	lastGameMade = GetTickCount();
359
	nextGameMake = lastGameMade + createGameThreshold + Random(0-createGameThresholdRandom, createGameThresholdRandom) + inGameAt;
360
	inGameAt = 0;
361
	chatActionsDone = false;
362
}
363
364
function outputGameLength()
365
{
366
	if(inGameAt)
367
	{
368
		duration = GetTickCount() - inGameAt;
369
370
		inGameAt = (duration < gameMinLength ? gameMinLength - duration : 0);
371
	}
372
}
373
374
function locationTimeout(time, location)
375
{
376
	endtime = GetTickCount() + time;
377
378
	while(controlData.getLocation().id == location.id && endtime > GetTickCount())
379
	{
380
		sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name + " (" + parseInt((endtime-GetTickCount())/1000) + "s)", 0);
381
		Delay(500);
382
	}
383
384
	return (controlData.getLocation().id != location.id);
385
}
386
387
function timeoutDelay(time, location)
388
{
389
	endtime = GetTickCount() + time;
390
391
	while(endtime > GetTickCount())
392
	{
393
		sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name + " (" + parseInt((endtime-GetTickCount())/1000) + "s)", 0);
394
		Delay(1000);
395
	}
396
}
397
398
function getRandomString(_length)
399
{
400
	_retString = "";
401
	_charSet = "0123456789abcdefghijklmnopqrstuvwxyz";
402
403
	while(_length--)
404
	{
405
		_retString += _charSet.charAt(Random(0, _charSet.length-1));
406
		Delay(1);
407
	}
408
409
	return _retString;
410
}
411
412
413
414