Ich habe mal eine überarbeitete NTBotLeech, die deutlich besser funktionieren sollte als die normale. Zum einen wird der Bot damit nichtmehr "/f l" spammen, sondern die Friendlist lediglich einmal abfragen wenn er in den Chat kommt. Sollte zu dem Zeitpunkt noch kein Spiel offen sein, wartet er bis der Leader ein Spiel erstellt und joined anhand der grünen Friendmessage. Damit sollte man um einiges schneller joinen als bisher und auch das nervige Friendlist gespamme hat ein Ende. Wichtig ist nur, dass LeaderAccountName und LeaderName richtig eingetragen sind, Groß-/Kleinschreibung spielt übrigens keine Rolle. Über Feedback würde ich mich freuen.
Code:
//###################################################################
//###########################Einstellungen###########################
//###################################################################
var LeaderAccountName = "LeaderAccountName";
var LeaderName = "LeaderName";
var GamePassword = "GamePassword";
var JoinGameAgain = false; // wenn der Bot nach chicken oder disconnect ins selbe Spiel nochmal gehen soll, auf true stellen
var UseCDKeyChangeTrick = false; // Wenn der LeechBot mehrere CD Keys nutzen soll, dann auf true stellen.
var JoinRandomChannel = false;
var JoinChannelInChat = "OP MyBaal";
var FirstJoinMessage = ""; // Soll der Leechbot etwas sagen, wenn er in den Chat kommt, dann hier eintragen
var ChatMessageAfterGame = ""; // Soll der Leechbot etwas sagen, wenn er aus dem Spiel kommt, dann hier eintragen
//###################################################################
//##############################Delays###############################
//###################################################################
var GameMinLength = 180000;
// realm delays (minutes)
var UnableToConnectRetry = 2;
var RealmDownRetry = 60;
var DisconnectedRetry = 2;
var CdKeyInUseRetry = 2;
// 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 = 500;
var TextDelay = 500;
var ClickDelayRandom = 500;
var TextDelayRandom = 500;
var GameDoesNotExistDelayMin = 600000;
var GameDoesNotExistDelayMax = 900000;
var GameDoesNotExistTimeout = 30000;
var WaitBeforeEnterChatMin = 1000;
var WaitBeforeEnterChatMax = 2000;
var WaitInChatBeforeActionsMin = 2000;
var WaitInChatBeforeActionsMax = 3000;
//###################################################################
//###################################################################
//###############DO NOT CHANGE 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 = true;
Include("libs/controlInfo.ntl");
var ControlData = new controlInfo();
var SameGame = "";
var OldGame = "";
var Game = "";
var Debug = false;
var JoinChatAfterGame = true;
function NTMain()
{
Delay(1000);
var _ingame = false;
ControlData.ClickDelay = ClickDelay;
ControlData.TextDelay = TextDelay;
ControlData.ClickDelayRandom = ClickDelayRandom;
ControlData.TextDelayRandom = TextDelayRandom;
while(1)
{
if(me.ingame)
{
OldGame = me.gamename;
if(!InGameAt)
InGameAt = GetTickCount();
if(!_ingame)
{
RunGC(); // run garbage collector between each game
if(Load("NTBot/NTBotGame.ntj"))
{
_ingame = 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)
{
_ingame = false;
SayChatMsgAfterGame = true;
sendEventToOOG(D2NT_MGR_READY, "", 0);
}
locationAction(ControlData.getLocation());
Delay(500);
}
}
}
function locationAction(location)
{
var _randomChannel;
switch(location.id)
{
case 3: // Lobby Chat
sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);
if(!ChatActionsDone)
{
ChatActionsDone = true;
Delay(Random(WaitInChatBeforeActionsMin, WaitInChatBeforeActionsMax));
if(JoinRandomChannel || JoinChannelInChat != "")
{
SetStatusText("ÿc8Joining channel...");
Say("/join " + (JoinRandomChannel ? getRandomString(Random(3,10)) : JoinChannelInChat));
Delay(2000);
}
if(FirstJoinMessage)
{
Say(FirstJoinMessage);
Delay(1000);
}
}
if (SayChatMsgAfterGame == true)
{
if(ChatMessageAfterGame && OldGame != "")
Say(ChatMessageAfterGame);
SetStatusText("ÿc8Checking friendlist...");
Say("/f l");
SayChatMsgAfterGame = false;
Delay(1500);
}
Game = "";
if(chat = ControlData.get(ControlData.controls.lobby.chat.textBox.channelText))
{
var found_leader = false;
lines = chat.GetText();
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++;
}
// checking if the msg is a friendly whisper
if (msg.toLowerCase().lastIndexOf(LeaderName.toLowerCase() + " (*" + LeaderAccountName.toLowerCase() + ")") > -1)
{
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, "$3");
if (Game != "")
{
found_leader = true;
break;
}
}
// checking if the msg is from the friend list
if (msg.toLowerCase().lastIndexOf(": " + LeaderAccountName.toLowerCase() + ",") > -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))
SetStatusText("ÿc8Leader is currently offline.");
else if (msg.match(regInChat))
SetStatusText("ÿc8Waiting for leader to create a game.");
else if (msg.match(regGameName))
Game = msg.replace(regGameName, "$2");
break;
}
}
if (found_leader == false)
{
DebugInOOG("I couldn\'t find the leader in my friend list!");
SetStatusText("ÿc8Leader not found.");
}
if (Game != "")
{
DebugInOOG('Leader is in the game "' + Game + '"');
//ControlData.click(ControlData.controls.lobby.button.join);
//Delay(100);
if(!JoinGameAgain)
{
if (Game != SameGame)
{
SetStatusText("ÿc8Joining Game: " + Game);
if (UseCDKeyChangeTrick)
{
sendEventToOOG(D2NT_MGR_CREATE_GAME, location.name, 0);
Delay(1000);
}
ControlData.click(ControlData.controls.lobby.button.join);
Delay (200);
}
else
SetStatusText("ÿc8Waiting for next game...");
}
else
{
SetStatusText("ÿc8Joining Game: " + Game);
if (UseCDKeyChangeTrick)
{
sendEventToOOG(D2NT_MGR_CREATE_GAME, location.name, 0);
Delay(1000);
}
ControlData.click(ControlData.controls.lobby.button.join);
Delay (200);
}
}
}
else
{
DebugInOOG("I can\'t read the chat!");
}
if(Game != "")
SameGame = Game;
break;
case 1: // Lobby
if(location.id == 1 && JoinChatAfterGame)
{
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)
{
ControlData.setText( ControlData.controls.lobby.join.editBox.gameName, Game);
Delay (100);
ControlData.setText( ControlData.controls.lobby.join.editBox.password, GamePassword);
Delay (100);
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_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_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
InGameAt = Random(GameDoesNotExistDelayMin, GameDoesNotExistDelayMax);
LastGameStatus = 0;
setNextGameMake();
locationTimeout(GameDoesNotExistTimeout, location);
break;
default:
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;
}
Der Bot funkt perfekt doch wenn da steht das der Leader in *** Spiel beigetreten ist, geht mein bot zu schnell rein, er soll paar Sekunden länger warten weil der Leader das Spiel nicht so schnell öffnet lässt er manchmal paar runden aus also wo kann man die Sekunden einstellen das er in das game Joinen soll nach dem der Leader ins Spiel ein geklickt hat?
Und wie kann ich noch einstellen das er nicht ins Baal Kammer gehen soll (ich sterbe da oft und verliere exp)
Ich verweise mal still und heimlich auf diesen .
Wenn dein Beitrag nur sinngemäß "Danke!" enthält, spar ihn dir und nutze stattdessen den dafür vorgesehenen Button.
hab da auch mal ne Frage und sorry schon mal falls es in den Weiten dieses Threads schon mal beantwortet wurde
ein sehr lustiges Add von dem Bot iss ja das man im Manager sieht wieviel XP man gesammelt hat und Gold usw
Worauf ich immer am meisten achte ist wieviel runs es ca. noch brauch bis zum nächsten LVL bzw wieviel % ich beim LvL Progress hab ... nun jetzt sind meine beiden Paladine lvl98 und im Manager steht nur noch Blödsinn ... angeblich iss mein lvl Progress -737% und ich brauch noch 45000 runs bis lvl 99 ... kann ich irgendwie nich ganz glauben
Vielleicht hatten ja schon andere ähnliches und es gibt schon ne bekannte Lösung ... Vielen dank schon mal im Vorraus
Dass es ab Level 98 rumspinnt ist leider ein bekannter Bug. Ich hatte mir das irgendwann schonmal angeschaut und wenn ich mich recht erinnere lag das an einem fehlerhaften Rückgabewert der XP ab lvl98.
wieviel runs sind es denn ungefähr bei 3-6 Spielern Dia und Baal ? schwer zu sagen oder ? von 97 auf 98 waren es zwischen 1500 und 1700 ... also rechne ich jetzt ma mit 3000-3500 ?!?
ich bekomm als co leecher nachdem baal tot ist die msg NTBaalLeechFight.ntj : NTC_FindUnit() failed (the worldstone chamber)
weis jemand was da falsch läuft/eingestellt ist bzw geändert werden muss?
iss bei mir auch ... der leecher bzw cofighter findet baal nich weil er eben schon tod iss ... ich ignorier es einfach ... hat auch absolut keine auswirkungen
[D2NT] How to do Public 07/04/2011 - Diablo 2 - 51 Replies Also da ich gefragt wurde ob ich das nicht machen könnte, habe ich mir gedacht da ich grade nichts zu tuen habe, wieso den eigentlich nicht.
Falls jemand Maphack im Fullwindow spielen will:
http://img824.imageshack.us/img824/1725/66387846. png
Hacken Raus nehmen.
CREADITS TO:
Sternlooper
TheBluebird
Muddy_Waters
D2Nt Public Pickit 10/18/2010 - Diablo 2 - 4 Replies Der Bot ist super aber er pickt einfach sachen viel zu langsame zb small charms. Da sind normale Spieler schneller. Kann man das einstellen das er sachen sofort beim droppen pickt??
Classic botten mit D2nt 07/09/2010 - Diablo 2 Programming - 2 Replies Huhu :) ich möchte classic anfangen und wollte mal fragen ob es tolle d2nt classic scripts gibt, bzw. was ich ändern muss oder ob es auch non enigma scripts gibt für paladin oder so^^
Gibt aufjeden ein THX :)
Und eine Pickit für Classic wäre auch nice^^
Oder gibs andere Classic bots ?
Public Baal mit D2NT 04/13/2009 - Diablo 2 - 3 Replies könnt ihr mir vll sagen was ich machen muss um mit den bot public baals runs zu machen wäre echt cool in dern config auf true stellen ist mir klar aber wie stell ich game name und sowas alles ein und brauch ich dafür nicht wieder eine config datei wäre echt cool wenn ihr mir helfen könntet ;)