Keeping distance sure take some advanced programming, I have some milstones left to rea h before I get even close to that but I will certanily try to get there!
Keeping distance sure take some advanced programming, I have some milstones left to rea h before I get even close to that but I will certanily try to get there!
I think Neobot used the code from OTserv, the code that keeps distance from players.. check that out?
EDIT:
Check here, https://github.com/opentibia/otserv/blob/master/monster.cpp (maybe on line 1140?) :P
Looks interesting, Ill have a look at it! Thanks!
Xavbot dot com fourmz plxxx
yeah, I agreed with charlesc. If your going serious, a dedicated forum is the way to go
Gimmie a shout if you need help setting it up
Even if that was the case, theres alot work to do to even get close to a decent enough tool that would have use for a dedicated forum.. But time will tell
Currently creating a more sophisticated attacker, when I get this to work propely Ill add looting functions aswell.
Cant Wait!!Originally Posted by Xavious
So far whats been added is the heal friend function I mentioned earlier, an anti paralyze function(automatically uses method chosen as High heal priority when regular auto heal is enabled) and a decent working targeting. The targeting works somewhat like Elfbots targeting with fewers functions and ability to save and load targeting settings. Basic looter is also added but need more testing before release. Until I make a decent walker I will probably only upload it as a beta under the unverified board and ask Jo3 to verify when the walker is done.
Then the next goal will be to make scripts and expand hotkeys posibilities. If anyone has suggestions or questions please reply here or send a private message
Apart from the hotkeys you got in Classic bot as always a nice additon would be interacting with depots, tradeing/talking with NPC's
And again, an example of how to keep distance from target (In python, author is wisling@tibiaauto.net | Thread here)
[code=python]
import time
def getPathToEx (selfPos, targetPos, minDist, maxDist):
ab = time.clock()
if selfPos['z'] != targetPos['z']:
return False;
currentDist = max(abs(selfPos['x'] - targetPos['x']),abs(selfPos['y'] - targetPos['y']));
if(currentDist == maxDist):
return False;
if (selfPos['x'] - targetPos['x']) <= 0: dxMin = maxDist;
else: dxMin = 0;
if (selfPos['x'] - targetPos['x']) >= 0: dxMax = maxDist;
else: dxMax = 0;
if (selfPos['y'] - targetPos['y']) <= 0: dyMin = maxDist;
else: dyMin = 0;
if (selfPos['y'] - targetPos['y']) >= 0: dyMax = maxDist;
else: dyMax = 0;
tile = 0;
minWalkPos = {};
tmpPos = {};
minWalkDist = 100;
maxTaxi = -1;
tmpDist = -1;
tmpWalkDist = -1;
tmpMaxTaxi = -1;
tryDist = maxDist;
point = [];
while tryDist >= minDist:
for y in range(targetPos['y'] - dyMin, targetPos['y'] + dyMax + 1):
for x in range(targetPos['x'] - dxMin, targetPos['x'] + dxMax + 1):
tmpDist = max(abs(targetPos['x'] - x),abs(targetPos['y'] - y));
if tmpDist == tryDist:
point += [[x,y]];
while len(point) > 0:
p = point.pop(random.randint(0,len(point)-1));
x = p[0];
y = p[1];
tmpWalkDist = abs(selfPos['x'] - x) + abs(selfPos['y'] - y);
tmpPos = {};
tmpPos['x'] = x;
tmpPos['y'] = y;
tmpPos['z'] = selfPos['z'];
tmpMaxTaxi = abs(targetPos['x'] - x) + abs(targetPos['y'] - y)
#print tmpPos,(tmpWalkDist < minWalkDist and tmpMaxTaxi+1 >= maxTaxi ),(tmpMaxTaxi >= tmpWalkDist and tmpMaxTaxi > maxTaxi),minWalkPos.get('x',0)-tmpPos.get('x',0),tmpPos.get('y',0)-minWalkPos.get('y',0);
#print tmpWalkDist,minWalkDist,tmpMaxTaxi,maxTaxi;
if (tmpWalkDist < minWalkDist and tmpMaxTaxi+1 >= maxTaxi ) or (tmpMaxTaxi >= tmpWalkDist and tmpMaxTaxi > maxTaxi) or minWalkDist == 100:
if tmpPos != selfPos:
if tamap.isPointAvailable(x, y, selfPos['z']) and tamap.getPointUpDown(x, y, selfPos['z']) == 0:
minWalkDist = tmpWalkDist;
minWalkPos = tmpPos;
maxTaxi = tmpMaxTaxi;
if minWalkDist != 100:
return minWalkPos;
tryDist -= 1;
return False;
def facing(direction):
return [-abs(direction%4-1)+1,-abs(direction%4-2)+1];
class ModuleKeepDistance:
RUN = True;
walkTo = False;
zCoordinate = tareader.readSelfCharacter()['z'];
tareader.setMemIntValue(0x7E4ED4, tareader.readSelfCharacter()['z']);
def getName(self):
tasender.sendTAMessage("Start KeepDistance to Toggle with \'%ta dist\'");
return "Keep Distance 9.4";
def getVersion(self):
return "1.0";
def getFunDef(self,nr):
if (nr==0): return (0,800,self.findPath);
if (nr==1): return (0,300,self.walkToPoint);
if (nr==2): return (1,0,self.walkToPoint2);
if (nr==3): return (2,0,self.toggle);
if (nr==4): return (0,800,self.bypassZFloor);
return ();
def getConfigParam(self,nr):
if (nr==0): return ('minDistance','Def:2, Distance to stay over.');
if (nr==1): return ('maxDistance','Def:3, Max Distance to try for.');
if (nr==2): return ('hardCreatures','Eg:demon,fury,ghoul,skeleton (List of hard creatures to keep minDist+1 distance from)');
if (nr==3): return ('followCreatures', 'Eg:Fire Devil ("Monsters that you want to follow that are either really easy, or distance fighters)');
return;
def bypassZFloor(self, params):
if tareader.readSelfCharacter()['z']!=self.zCoordinate:
self.zCoordinate = tareader.readSelfCharacter()['z'];
tareader.setMemIntValue(0x800FBC, tareader.readSelfCharacter()['z']) # 9.4
return;
def findPath (self, params):
if self.RUN:
me = tareader.readSelfCharacter();
targID = tareader.getAttackedCreature();
if targID != 0:
targ = tareader.getCharacterByTibiaId (targID);
try: minDist = int(params['minDistance']);
except: minDist = 3;
try: maxDist = int(params['maxDistance']);
except: maxDist = 100;
hList = params['hardCreatures'].lower().split(',');
isHard = int(hList.count(targ['name'].lower()) != 0);
minDist += isHard;
face = facing(targ['lookDirection']);
monToMe = [(me['x']-targ['x']),(me['y']-targ['y'])];
isRunning = int((face[0]*monToMe[0] + face[1]*monToMe[1]) < 0);#will bring to 1 less than maxDist if monster is running
#print "first:", isRunning;
followCreature = params['followCreatures'].lower().split(',');
isRunning = int(followCreature.count(targ['name'].lower()) != 0);
#//print "sec:", isRunning;
if isRunning:
maxDist = 1;
minDist = 1;
isToofar = max(abs(me['x'] - targ['x']),abs(me['y'] - targ['y'])) > maxDist;
isNotBestDiag = abs(me['x'] - targ['x'])+abs(me['y'] - targ['y']) < minDist*2;
isClose = max(abs(me['x'] - targ['x']),abs(me['y'] - targ['y'])) <= minDist;
if isToofar or (isNotBestDiag and isClose):
#print {'x':me['x'],'y':me['y'],'z':me['z']},{'x':targ['x'],'y':targ['y'],'z':targ['z']}
self.walkTo = getPathToEx({'x':me['x'],'y':me['y'],'z':me['z']},{'x':targ['x'],'y':targ['y'],'z':targ['z']},minDist,minDist)
#print self.walkTo['x'] - me['x'],self.walkTo['y'] - me['y'];
self.walkToPoint(params);
return;
def walkToPoint (self, params):
if tareader.getAttackedCreature() == 0:
self.walkTo = False;
return;
targ = tareader.getCharacterByTibiaId (tareader.getAttackedCreature());
if targ['hpPercLeft'] == 0:
self.walkTo = False;
return;
if self.walkTo != False:
tareader.writeGotoCoords (self.walkTo['x'],self.walkTo['y'],self.walkTo['z']);
return;
def walkToPoint2 (self, params,(type,channel,nick,message)):
me = tareader.readSelfCharacter();
if nick == me['name'] and self.walkTo != False:
tareader.writeGotoCoords (self.walkTo['x'],self.walkTo['y'],self.walkTo['z']);
return;
def toggle (self, params, message):
if message == "%ta dist":
self.RUN = not self.RUN;
tasender.sendTAMessage("Keep Distance is = "+str(self.RUN));
return;
tibiaauto.registerPlugin(ModuleKeepDistance);
#print getPathToEx({'x':0,'y':2,'z':0},{'x':0,'y':0,'z':0 },6,6+1)
[/code]
Since I dont want to use packets, as sending bad or incorrect packets probably have a good chance to your account deleted I have to figure out where every item on your gamewindow is located which can be very hard(at least for me as Im fairly new to the subject) it will be hard to implement interacting with npc for buying or selling items. I however hope that I can learn more on how its used to eventually add such functions. But for now it will not be added.
As I update map reading I will try to implement functions to keep distance from targets aswell. Its not very difficult to make your character run away from creatures but finding the best, and even possible path to run in is quite hard as I need to read tile information to see which are and are not blocking. Thanks to Tibia API and other open source projects I believe I can get some basic distance keeper in a while