ich habe vor ein paar Tagen angefangen mich mal mit dem NTBot auseinanderzusetzen und mir anzukucken, wie die Scripts im Bot funktionieren.
Ein erster Test sollte Travi mit dem Goldbarbaren sein, allerdings für Classic, der Gute muss also laufen. Habe das Script daher ein bisschen angepasst, um sicherzugehen, dass der Barbar immer schnell zum Tempel findet.
Allerdings kommt es zu einem Bug:
Im ersten Spiel läuft der Barbar immer hin, killt alles, brüllt die Leichen leer; so wie's sein soll.
Ab dem zweiten Spiel benutzt er den WP, macht Precast und dann wirft der Bot immer den Fehler "MoveTo() failed" und verlässt das Spiel.
Das passiert dann in allen folgenden Spielen.
Habe das Testweise mit dem Originalen NTTravincal Script getestet (scheint bei Muddy's und Etal das selbe Script zu sein, getestet nur mit Muddy) und bekomme dort den gleichen Fehler
Ich habe mir 'ne ganze Weile den Kopf darüber zerbrochen, warum das passiert. Die erste Mutmaßung war, dass es mit der verschiebung der Koordinaten auf der Karte zu tun hat, was ja das Script durch _deltax/y auszugleichen versucht.
Allerdings bin ich mir mittlerweile damit nicht mehr so sicher, weil auch ein einfaches MoveTo(me.areaid,me.x+2,me.y) den Fehler schmeißt. Ich habe mit ein bisschen debugging den Fehler bis zum Aufruf der _path = GetPath() Methode in der NTMove.nt zurückverfolgt, die scheinbar fehlschlägt, weshalb das NTTravincal Script mit der Fehlermeldung verlassen wird.
Mit der WalkTo() Methode kriege ich den Barbaren weiterhin bewegt, so dass ich ihn imernoch bis zum Tempel bringen kann, aber da is dann halt Schluss, weil er die position nicht cleanen möchte und dann das Spiel verlässt. (Er findet keine Monster, die NTA_IsValidMonster(_target) erfüllen, obwohl der Rat direkt vor ihm steht, aber das ist wohl ein anderes Problem)
Hat jemand eine Ahnung, woher dieser Fehler kommen könnte und noch viel wichtiger, wie man ihn beheben könnte? Meine Vermutung, das Ganze könnte mit den verschobenen Koordinaten zusammenhängen kam daher, dass im ersten Spiel der WP immer an der gleichen Koordinaten war (zumindest in meinen Testläufen), und der Bot damit ja auch immer klarkam.
Zum Abschluss noch die NTTravincal Version, die ich benutzt habe:
Code:
function NTMain(){
Include("libs/common/NTCommon.ntl");
NTC_IncludeLibs();
NTC_IncludeConfig("NTBot/char_configs");
var _waypoint;
var _deltax, _deltay;
var _attackpos = [5800, 1554, 5799, 1534, 5799, 1526, 5797, 1514, 5795, 1490, 5787, 1491, 5797, 1514, 5781, 1514];
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
NTA_Initialize();
if(!NTTM_CheckAct()) {
NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
return;
}
NTTMGR_TownManager();
if(!NTTM_TownMove("waypoint")){
NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
return;
}
if(!NTM_TakeWaypoint(83)){
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
return;
}
_waypoint = NTC_FindUnit(NTC_UNIT_OBJECT, GetLocaleString(22526), 5);
if(!_waypoint){
NTC_SendMsgToScript("NTBotGame.ntj", "NTC_FindUnit()");
return;
}
_deltax = _waypoint.x - 5699;
_deltay = _waypoint.y - 1584;
NTP_DoPrecast(true);
if(!NTM_MoveTo(me.areaid, 5780+_deltax, 1555+_deltay)){
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveTo()");
return;
}
if(NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe)){
NTTMGR_VisitTown();
}
for(var i = 0 ; i < _attackpos.length ; i += 2){
NTM_MoveTo(me.areaid, _attackpos[i]+_deltax, _attackpos[i+1]+_deltay);
NTA_ClearPosition(25, true, 2);
}
if(NTConfig_OpenChestsInArea && NTU_DontOpenAreas())
OpenChestsInArea();
NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}






