Bewegen, statt Teleport

06/13/2010 15:50 Treuben#1
Hi!

Ich gehe jetzt mal grundsätzlich davon aus, dass für jede Bewegung im Spiel "Teleport" erforderlich ist (außer in der Stadt bzw statischen Karten).

Die aktuelle Ebene wird ja in ein 2d-Array gepackt. Also man kann quasi mit dem x,y-Skript einen Pfad erstellen, den der Bot ablaufen soll (bsp.: Baal, nach der letzten Wave ins Portal gehen und dann dort sich irgendwo hinstellen und warten) -> NT_WalkTo(x,y)

Gibt es für die ganzen Befehle und functions ne Seite zum nachlesen? So ähnlich wie:

[Only registered and activated users can see links. Click Here To Register...] (Link aus EON - D2BS Api)

Das Programmieren von Skripts sollte ja dann letztlich relativ leicht sein?
06/14/2010 02:10 Diablofarmer#2
nich das ich wüsste, auf koreanisch evtl ....
aber es stehn eigentlich alle funktionen im common-Folder

Atomforschung & Quantenphysik sind auch "relativ" leicht ...
können aber auch viele schlaflose Nächte bereiten
06/14/2010 09:35 Treuben#3
Also im Grunde autodidaktisch lernen?
Alte Skripte ansehen -> verstehen -> nachmachen?

Gibt's da jemanden der gerne PMs beantwortet über Fragen zwecks Methoden? :>
06/14/2010 16:32 sternenlooper#4
[QUOTE=Treuben;5621814]Also im Grunde autodidaktisch lernen?
Alte Skripte ansehen -> verstehen -> nachmachen?
QUOTE]

this + ein tipp!
schaue mal in deine ntmove datei rein! da stehen alle bewegungs befehle drinn wie sie funktionieren ;)
06/14/2010 16:58 Treuben#5
Jo ich hab den Ordner schon gefunden ;) NTMove is ja da vllt noch leichter.

Was mich noch interessieren würde:

Das mit den dynamischen Karten zB wenn er zu Meppl telt. Wie stellt der Bot fest wo die Treppen sind? Hat der einfach alle möglichen verschiedenen Karten gespeichert und weiß durch vergleichen beider wo er hin muss?
Es gibt ja diese "function NTM_MoveToStair"... Kann ich das dann quasi überall benutzen wo ich grad stehe und er sucht sich die nächste Treppe?

Also letztlich läufts eigentlich darauf hinaus:
In der Uni "Grundlagen der Informatik I" haben wir Java programmiert und in "Systemprogrammierung in C" C. Mein Problem war meist immer, dass ich alle Funktionen die eigentlich schon da sind nochmal selber geschrieben, anstatt vorhandene zu benutzen. Dementsprechend schnell bin ich immer die Wand hochgelaufen ;P.

Ach da fällt mir noch ein:
Wie testet ihr euere Skripte? Direkt im Bnet oder SinglePlayer Mode?
06/15/2010 03:01 hdin84#6
Quote:
Originally Posted by Treuben View Post
Jo ich hab den Ordner schon gefunden ;) NTMove is ja da vllt noch leichter.

Was mich noch interessieren würde:

Das mit den dynamischen Karten zB wenn er zu Meppl telt. Wie stellt der Bot fest wo die Treppen sind? Hat der einfach alle möglichen verschiedenen Karten gespeichert und weiß durch vergleichen beider wo er hin muss?
Es gibt ja diese "function NTM_MoveToStair"... Kann ich das dann quasi überall benutzen wo ich grad stehe und er sucht sich die nächste Treppe?

Also letztlich läufts eigentlich darauf hinaus:
In der Uni "Grundlagen der Informatik I" haben wir Java programmiert und in "Systemprogrammierung in C" C. Mein Problem war meist immer, dass ich alle Funktionen die eigentlich schon da sind nochmal selber geschrieben, anstatt vorhandene zu benutzen. Dementsprechend schnell bin ich immer die Wand hochgelaufen ;P.

Ach da fällt mir noch ein:
Wie testet ihr euere Skripte? Direkt im Bnet oder SinglePlayer Mode?
Der Bot hat nen Maphack drin und weiss so wo ne Treppe is etc - das gleiche wie in Unterkurast mit den Truhen und Ständern.

Ich teste mein Zeug direkt im Bnet - aber halt in private Games ;)
06/15/2010 11:57 Treuben#7
Also ist es unmöglich ein dynamischen Level ohne teleport zu machen? Er würde ja sonst nur an Hindernisse laufen?

Gibt es eigentlich endliche dynamische Karten oder unendliche?
06/15/2010 12:39 Diablofarmer#8
Quote:
Originally Posted by hdin84 View Post
Der Bot hat nen Maphack drin und weiss so wo ne Treppe is etc - das gleiche wie in Unterkurast mit den Truhen und Ständern
so ein quatsch, memory reading ...
06/15/2010 12:42 Treuben#9
Und jetzt für normal sterbliche nicht Informatiker?
06/15/2010 20:34 sataan1337#10
maphacks sind auch nur memory-reading - oder wie funktionieren die sonst?
06/17/2010 02:39 Delba#11
Quote:
Originally Posted by Treuben View Post
Also ist es unmöglich ein dynamischen Level ohne teleport zu machen? Er würde ja sonst nur an Hindernisse laufen?
es ist möglich

damit der bot laufen kann

dort rein

D2NT\scripts\libs\common und in NTMove rein kopieren

Code:
function NTM_MoveTo(areaid, x, y, retry, clearpath)
{
var i, n;
var _teleport;
var _path;
var _retry = 0;

if(x == me.x && y == me.y)
return true;

if(arguments.length < 4)
retry = 3;

if(arguments.length < 5)
clearpath = false;

if(NTC_InTown() || NTConfig_NoTeleport)
_teleport = false;
else
_teleport = true;

if(NTC_GetSkillLevel(54) < 1 && !NTConfig_NoTeleport)
{
ExitGame();
SendCopyData("D2NT Manager", null, 7<<16, "ÿE00000Enigmabug- quit game");
}
_path = GetPath(areaid, me.x, me.y, x, y, _teleport);

if(!_path)
return false;

for(i = 0 ; i < _path.length ; i++)
{
for(n = 0 ; n < 2 ; n++)
{
if(_teleport)
{
if(NTM_TeleportTo(_path[i][0]+Random(-n, n), _path[i][1]+Random(-n, n)))
break;
}
else
{
if(NTC_InTown() || NTConfig_NoTeleport) {
if(NTM_WalkTo(_path[i][0], _path[i][1]))
break;
}

}
}

if(n < 2)
{
if(clearpath)
{
if(!NTA_ClearPosition(20, true, 2))
return false;

NTP_DoPrecast(false);

NTM_MoveTo(me.areaid, _path[i][0], _path[i][1], 1);
}
}
else if(_retry < retry)
{
_path = GetPath(areaid, me.x, me.y, x, y, _teleport);

if(!_path)
return false;

i = -1;
_retry++;
}
else
return false;
}

return true;
}

function NTM_MoveToPresetUnit(areaid, unittype, classid, offsetx, offsety, clearpath)
{
   var i, n;
   var _unit;

   if(arguments.length < 4)
   {
      offsetx = 0;
      offsety = 0;
   }

   if(arguments.length < 6)
      clearpath = false;

   for(i = 0 ; i <= 2 ; i++)
   {
      _unit = GetPresetUnits(areaid, unittype);

      if(_unit)
      {
         for(n = 0 ; n < _unit.length ; n++)
         {
            if(_unit[n].id == classid)
               return NTM_MoveTo(areaid, _unit[n].roomx*5+_unit[n].x+offsetx, _unit[n].roomy*5+_unit[n].y+offsety, 3, clearpath);
         }
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return false;
}

function NTM_MoveToStair(areaid, subareaid, offsetx, offsety, clearpath)
{
   var i, n;
   var _unit;

   if(arguments.length < 3)
   {
      offsetx = 0;
      offsety = 0;
   }

   if(arguments.length < 5)
      clearpath = false;

   for(i = 0 ; i <= 2 ; i++)
   {
      _unit = GetPresetUnits(areaid, NTC_UNIT_TILE);

      if(_unit)
      {
         for(n = 0 ; n < _unit.length ; n++)
         {
            if(_unit[n].subareaid == subareaid)
               return NTM_MoveTo(areaid, _unit[n].roomx*5+_unit[n].x+offsetx, _unit[n].roomy*5+_unit[n].y+offsety, 3, clearpath);
         }
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return false;
}

function NTM_TeleportTo(x, y)
{
   NTC_CastSkill(54, NTC_HAND_RIGHT, x, y);

   for(var i = 0 ; i < 15 ; i++)
   {
      if(Math.abs(me.x-x) < 4 && Math.abs(me.y-y) < 4)
         return true;

      NTC_Delay(NTC_DELAY_FRAME);
   }

   return false;
}

function NTM_WalkTo(x, y)
{
   var i;
   var _prex1, _prey1;
   var _prex2, _prey2;

   if(me.runwalk == 0)
      me.runwalk = 1;

   for(i = 0 ; i < 480 ; i++)
   {
      if((i % 10) == 0)
      {
         if((i % 60) == 0)
         {
            _prex1 = me.x;
            _prey1 = me.y;

            if((i % 120) == 0)
            {
               _prex2 = me.x;
               _prey2 = me.y;
            }
         }

         ClickMap(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, x, y);
      }

      NTC_Delay(NTC_DELAY_FRAME);

      if(Math.abs(me.x-x) < 2 && Math.abs(me.y-y) < 2)
         break;

      if((i % 10) == 9)
      {
         ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
         NTC_Delay(NTC_DELAY_FRAME);

         if((i % 60) == 59)
         {
            if(me.x == _prex1 && me.y == _prey1 && !NTC_InTown())
            {
               NTA_ClearPosition(2);

               NTP_DoPrecast(false);
            }

            if((i % 120) == 119 && me.x == _prex2 && me.y == _prey2)
               return false;
         }
      }
   }

   ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
   NTC_Delay(NTC_DELAY_FRAME);

   return (i < 480);
}

function NTM_TakeUnit(unittype, classid)
{
   var _unit;
   var _prearea;

   _unit = NTC_FindUnit(unittype, classid, 5);

   if(!_unit)
      return false;

   _prearea = me.areaid;

   for(var i = 0 ; i < 20 ; i++)
   {
      if((i % 5) == 0)
      {
         if(i == 10)
            NTM_MoveTo(_prearea, me.x+6, me.y+6);

         if(NTM_GetCloserInt(_unit))
            NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _unit);
      }

      NTC_Delay(200);

      if(me.areaid != _prearea)
         break;
   }

   while(me.areaid == 0)
      NTC_Delay(200);

   if(me.areaid == _prearea)
      return false;

   NTC_PingDelay(NTConfig_AreaDelay);

      return true;
}

function NTM_TakeStair(areaid)
{
   var _unit;
   var _prearea;

   _unit = NTM_GetStairInt(areaid);

   if(!_unit)
      return false;

   _prearea = me.areaid;

   for(var i = 0 ; i < 20 ; i++)
   {
      if((i % 5) == 0)
      {
         if(i == 10)
            NTM_MoveTo(_prearea, me.x+6, me.y+6);

         if(NTM_GetCloserInt(_unit))
            NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _unit);
      }

      NTC_Delay(200);

      if(me.areaid != _prearea)
         break;
   }

   while(me.areaid == 0)
      NTC_Delay(200);

   if(me.areaid == _prearea)
      return false;

   NTC_PingDelay(NTConfig_AreaDelay);

      return true;
}

function NTM_TakeWaypoint(areaid)
{
   var _unit;

   if(me.areaid == areaid)
      return true;

   _unit = NTM_GetWaypointInt();

   if(!_unit)
      return false;

   if(NTC_InTown())
      me.Cancel(1);

   for(var i = 0 ; i < 20 ; i++)
   {
      if((i % 10) == 0)
      {
         if(NTM_GetCloserInt(_unit))
            NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _unit);
      }

      NTC_Delay(200);

      if(GetUIState(0x14))
      {
         if(me.TakeWaypoint(areaid))
         {
            NTC_PingDelay(NTConfig_AreaDelay);
            return true;
         }

         break;
      }
   }

   return false;
}

function NTM_UsePortal(how, dest, ownername, portal)
{
   if(me.areaid == dest)
      return true;

   if(NTC_InTown())
      me.Cancel(1);

   if(NTM_ChangeAreaInt(how, dest, ownername, portal))
   {
      NTC_PingDelay(NTConfig_AreaDelay);
      return true;
   }

   return false;
}

function NTM_MakeTP(dest)
{
   var _usetp = true;
   var _portal;
   var _portalname;

   if(NTC_InTown())
      return true;

   if(arguments.length < 1)
      _usetp = false;

   if(!NTC_CastSkill(220, NTC_HAND_RIGHT))
      return false;

   NTC_PingDelay(500);

   _portalname = GetLocaleString(3226);

   for(var i = 0 ; i <= 2 ; i++)
   {
      _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);

      if(_portal)
      {
         do
         {
            if(_portal.mode == 2 && NTC_CheckOwner(_portal))
            {
               if(_usetp)
                  return NTM_UsePortal("BluePortal", dest, me.name, _portal);

               return true;
            }
         } while(_portal.GetNext());
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return false;
}

// Internal function
function NTM_GetStairInt(areaid)
{
   var _tile;

   for(var i = 0 ; i <= 2 ; i++)
   {
      _tile = NTC_FindUnit(NTC_UNIT_TILE);

      if(_tile)
      {
         do
         {
            if(!areaid || _tile.subareaid == areaid)
               return _tile;
         } while(_tile.GetNext());
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return null;
}

function NTM_GetWaypointInt()
{
   var _waypoint;
   var _classid;

   for(var i = 0 ; i <= 2 ; i++)
   {
      _waypoint = NTC_FindUnit(NTC_UNIT_OBJECT);

      if(_waypoint)
      {
         do
         {
            _classid = _waypoint.classid;

            if(_classid == 119 || _classid == 145 || _classid == 156 || _classid == 157
               || _classid == 237 || _classid == 238 || _classid == 288 || _classid == 323
               || _classid == 324 || _classid == 398 || _classid == 402 || _classid == 429
               || _classid == 494 || _classid == 496 || _classid == 511 || _classid == 539)
               return _waypoint;
         } while(_waypoint.GetNext());
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return null;
}

function NTM_ChangeAreaInt(how, dest, ownername, myportal)
{
   var _portal;
   var _playerportal = false;
   var _prearea;

   if(how == "BluePortal")
   {
      if(!ownername)
         ownername = me.name;

      _playerportal = true;
   }

   if(arguments.length > 3 && myportal)
      _portal = myportal;
   else
   {
      _portal = NTM_FindCorrectPortalInt(_playerportal, ownername);

      if(_portal < 0)
         _portal = NTM_FindPortalAreaInt(dest);

      if(_portal == -1)
         return false;
   }

   if(!_portal)
      return false;

   _prearea = me.areaid;

   for(var i = 0 ; i < 20 ; i++)
   {
      if((i % 5) == 0)
      {
         if(i == 10)
            NTM_MoveTo(_prearea, me.x+6, me.y+6);

         if(NTM_GetCloserInt(_portal))
            NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal);
      }

      NTC_Delay(200);

      if(me.areaid != _prearea)
         break;
   }

   while(me.areaid == 0)
      NTC_Delay(200);

   return (me.areaid == dest);
}

function NTM_FindCorrectPortalInt(blueportal, ownername)
{
   var _portal;
   var _portalname;

   _portalname = GetLocaleString(3226);

   if(blueportal)
   {
      for(var i = 0 ; i <= 2 ; i++)
      {
         _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);

         if(_portal)
         {
            do
            {
               if(_portal.mode == 2 && NTC_CheckOwner(_portal, ownername) && GetDistance(me, _portal) <= 30)
                  return _portal;
            } while(_portal.GetNext());
         }

         if(i < 2)
            NTC_Delay(500);
      }

      return -2;
   }
   else
   {
      for(var i = 0 ; i <= 2 ; i++)
      {
         _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);

         if(_portal)
         {
            do
            {
               if(_portal.mode == 2 && !_portal.GetParent())
                  return _portal;
            } while(_portal.GetNext());
         }

         if(i < 2)
            NTC_Delay(500);
      }
   }

   return -3;
}

function NTM_FindPortalAreaInt(dest)
{
   var _portal;
   var _portalname;

   _portalname = GetLocaleString(3226);

   for(var i = 0 ; i <= 2 ; i++)
   {
      _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);

      if(_portal)
      {
         do
         {
            if(_portal.mode == 2 && _portal.subareaid == dest)
            {
               if(_portal.GetParent())
               {
                  if(NTC_CheckOwner(_portal) || NTC_InMyParty(_portal.GetParent()))
                     return _portal;
               }
               else
                  return _portal;
            }
         } while(_portal.GetNext());
      }

      if(i < 2)
         NTC_Delay(500);
   }

   return -1;
}

function NTM_GetCloserInt(unit)
{
   if(GetDistance(me, unit) > 2)
      return NTM_MoveTo(unit.areaid, unit.x, unit.y);

   return true;
}

// vector class
function vector()
{
   if(arguments.length == 2)
   {
      this.x = arguments[0];
      this.y = arguments[1];
   }
   else if(arguments.length == 1)
   {
      this.x = arguments[0].x;
      this.y = arguments[0].y;
   }
   else
   {
      this.x = 0;
      this.y = 0;
   }
   
   this.rotate = vector_rotate;
   this.normalize = vector_normalize;
   this.length = vector_length;
   this.setlength = vector_setlength;
   this.toString = vector_toString;
   this.set = vector_set;
   this.angle = vector_angle;
}

function vector_rotate(degree)
{
   if(!degree)
      return true;

   l = this.length();
   if(!l)
      return false;

   this.normalize();

   rad = degree * (Math.PI/180);

   nx = this.x * Math.cos(rad) - this.y * Math.sin(rad);
   ny = this.x * Math.sin(rad) + this.y * Math.cos(rad);

   this.x = nx;
   this.y = ny;

   this.normalize();
   if(l != 1)
      this.setlength(l);

   return true;
}

function vector_angle(v)
{
   rad_degree = 180 / Math.PI;

   return Math.acos((this.x*v.x) + (this.y*v.y)) * rad_degree;
}

function vector_length()
{
   return Math.sqrt((this.x*this.x) + (this.y*this.y));
}

function vector_setlength(length)
{
   this.normalize();
   this.x *= length;
   this.y *= length;
}

function vector_normalize()
{
   l = this.length();
   if(!l)
      return false;

   this.x /= l;
   this.y /= l;

   return true;
}

function vector_toString()
{
   str = "(";
   str += Math.round(this.x*1000)/1000;
   str += " , ";
   str += Math.round(this.y*1000)/1000;
   str += ") : ";
   str += Math.round(this.length()*1000)/1000;

   return str;
}

function vector_set(tx, ty)
{
   if(arguments.length == 1)
   {
      this.x = tx.x;
      this.y = tx.y;
   }
   else if(arguments.length == 2)
   {
      this.x = tx;
      this.y = ty;
   }
}

// coord class
function coord()
{
   this.data = null;

   if(arguments.length == 3)
   {
      this.x = arguments[0];
      this.y = arguments[1];
      this.data = arguments[2];
   }
   else if(arguments.length == 2)
   {
      this.x = arguments[0];
      this.y = arguments[1];
   }
   else if(arguments.length == 1)
   {
      this.x = arguments[0].x;
      this.y = arguments[0].y;
   }
   else
   {
      this.x = 0;
      this.y = 0;
   }

   this.dist = coord_dist;
   this.dist2 = coord_dist2;
   this.dir = coord_dir;
   this.move = coord_move;
   this.set = coord_set;
   this.toString = coord_toString;
}

function coord_set(tx, ty, d)
{
   if(arguments.length == 1)
   {
      this.x = tx.x;
      this.y = tx.y;

      if(tx.data)
         this.data = tx.data;
      else
         this.data = null;
   }
   else if(arguments.length == 2)
   {
      this.x = tx;
      this.y = ty;
      this.data = null;
   }
   else if(arguments.length == 3)
   {
      this.x = tx;
      this.y = ty;
      this.data = d;
   }
}

function coord_dist(tx, ty)
{
   if(arguments.length == 1)
   {
      vx = this.x - tx.x;
      vy = this.y - tx.y;

      return Math.round(Math.sqrt((vx*vx) + (vy*vy)));   
   }
   else if(arguments.length == 2)
   {
      vx = this.x - tx;
      vy = this.y - ty;

      return Math.round(Math.sqrt((vx*vx) + (vy*vy)));
   }
}

function coord_dist2(tx, ty)
{
   if(arguments.length == 1)
   {
      vx = this.x - tx.x;
      vy = this.y - tx.y;

      return Math.floor((vx*vx) + (vy*vy));
   }
   else if(arguments.length == 2)
   {
      vx = this.x - tx;
      vy = this.y - ty;

      return Math.floor((vx*vx) + (vy*vy));
   }
}

function coord_dir(tx, ty)
{
   if(arguments.length == 1)
   {
      v = new vector(tx.x-this.x, tx.y-this.y);
      v.normalize();

      return v;
   }
   else if(arguments.length == 2)
   {
      v = new vector(tx-this.x, ty-this.y);
      v.normalize();

      return v;
   }
}

function coord_move(vec, d)
{
   if(d)
   {
      this.x += Math.round(vec.x*d);
      this.y += Math.round(vec.y*d);

      return true;
   }
   else if(vec.length())
   {
      this.x += Math.round(vec.x);
      this.y += Math.round(vec.y);

      return true;
   }

   return false;
}

function coord_toString()
{
   return "( " + this.x + " , " + this.y + " ) " + this.data;
}

das in D2NT\scripts\NTBot\char_configs in NTconfig einfügen


Code:
 var NTConfig_NoTeleport;

das in D2NT\scripts\NTBot\char_configs in deinen char einfügen der laufen soll


Code:
 NTConfig_NoTeleport = true;    // false = teleport : true = noteleport

nur eckt der char immer wieder an,...dass kann man umschreiben [Only registered and activated users can see links. Click Here To Register...]

hoffe das schafft jemand weil selbst habe ich nicht soviel plan

hoffe wie immer auf thanks^^

grüße der Delba^^
06/17/2010 02:48 Delba#12
Quote:
Originally Posted by Diablofarmer View Post
so ein quatsch, memory reading ...
du hast recht. memory maped nennt sich das glaub^^

mann könnte sich das so vorstellen die karten werden in memory maped gespeichert (also zwischen gespeichert)...und mit dem maphack einfach nur gelesen, bzw geladen....

also ein bot geht auch ohne maphack^^

die meisten hacks bassieren auf mmaped

sollte ich mich irren korrigiert mich pls, lerne gern dazu^^

gruß der delba
06/17/2010 13:16 Treuben#13
Quote:
Originally Posted by Delba View Post
nur eckt der char immer wieder an,...dass kann man umschreiben [Only registered and activated users can see links. Click Here To Register...]
Na das heisst quasi er bleibt an der nächstbesten Wand hängen?
06/17/2010 17:48 Delba#14
ja,...so ungefähr,.... muss manh umschreiben

oder man bekommt es so hin wie hier



soll redvex bot sein ka