Re-ran it, with disabling public and game to all, it works good. Only one question : which food dtm is specified here? Because my player won't eat lobsters.
Nonetheless, thank you for the script!
Re-ran it, with disabling public and game to all, it works good. Only one question : which food dtm is specified here? Because my player won't eat lobsters.
Nonetheless, thank you for the script!
The script has been working fine, it just wouldn't eat (I haven't tried changing the chat settings yet).
To make it eat your own food, you need to create a custom DTM and insert it where it tells you to. To create your own DTM, follow the link Er1k gave on the previous page.
Awsome script, got everything to work perfectly.
It's eating rocktails atm because im a skiller and i can only survive if i set it to heal at 130 hp and use rocktails :P,
Im using this:
Simba Code:HEAL_AT = 130;
FOOD_DTM = 'mrAAAAHic42BgYKhhYmBoBeIGIC4F4mogbgPiXCAuAmJWRgaGL0B1XED6L5D+CcRMjBDMDcQTampBImCsJccKpg0UFMD0ybXrGAgBRgIYBgBfvwt2';
Everything is fine for me, ofcourse i cant afk for 6 hours but it's cool. I occasionally die when i run out of rocktails(costly :L) or when skele's in the dungeon be tripping on me. I found it will eat only after finishing a procedure, i.e exit the dungeon.
If anyone is having any problems, here i what i did:
Make sure your brightness is all the way up
Make sure you have the latest Simba downloads/extensions.
Make sure your chat is private off and game on ALL
To custom create your food type, find the DTM string following the guide that Er1k posted on page 3.
Thanks Er1k, awsome script.
Last edited by ne lg; 06-01-2012 at 07:04 PM.
Okay, now i have noticed two problems.
The first one, is minor, negligible imo. I think it frequently (one in three) times will do the lava steps twice, i have no idea why, it will just do them, run back round and do them again and go on fine. This isn't a big problem
The second one is for the log, After completing the log it doesnt register that it's completed correctly and will run around the side next to the tree to try and do it, This is a problem because it wont be able to re attempt the obstacle and just sits there/dies.
The second problem probably needs attending to, i guess the problem is detecting wether or not the obstacle was succesfull, It thinks is was not when it was succesfull resulting in it trying to click back to the start of the obstacle.
This doesn't happen every time, mabye once every half hour.
I have a question, why do everytime i die/relog i need to take another picture and get another string for the DTM for my food?
It doesnt recognise the food unless i get a new DTM every time i relog/die.
Its kinda frustrating :P
Im using rocktails btw.
idk bout rocktails but monkfish & lobsters is in this thread, maybe use those untill you find your rocktails.
My script gets stuck when I fail on the lavastone, that's his only flaw.
(and all my chats are on off, game on all)
Nvm, i didn't add any tolerence to the food DTM, ma bad.
I might try and tackle a deathwalk,
I literally know nothing to do with scripting but since it would all run on the main runescape surface i could use SPS without having to make my own custom map.
I'll give it a go perhaps.
Simba Code:program FromDeathToCourse;
{$DEFINE SMART}
{.include SRL/SRL.simba}
{.include custom/DDTM.simba}
{.include SPS/SPS.simba}
{$i ObjectDTM\ObjDTMInclude.simba}
const
SmartWorld = 7;
Members = False;
SignedClient = True;
HighDetail = False;
NumbOfPlayers = 1;
StartPlayer= 1;
procedure DeclarePlayers;
var i:integer;
begin
NumberOfPlayers(NumbOfPlayers);
CurrentPlayer := StartPlayer;
for i := 0 to NumbOfPlayers-1 do
Players[i].BoxRewards := ['mote', 'ostume', 'XP', 'Gem', 'ithril', 'oal', 'une', 'oins'];
with Players[0] do
begin
Name := ''; //Player username.
Pass := ''; //Player password.
Nick := ''; //Player nickname - 3-4 letters of Player username.
Active := True;
end;
end;
procedure FromDeathToEdgeBank;
var
x,y:integer;
begin;
Writeln('Unfortunetly you have died!');
ClickNorth(SRL_ANGLE_HIGH);
if ObjDTM_Find('52:48:4:1:7:120:86:1:7:136:90:1:7:58:29:1:7:86:60', x, y, True) then
begin;
Writeln('We found the bank, lets get some more food')
ObjDTM_Walk('52:48:4:1:7:120:86:1:7:136:90:1:7:58:29:1:7:86:60', 2, 100, 5, True);
end;
end;
Function Banking: Boolean;
Var
TPAA: T2DPointArray;
TPA: TPointArray;
CTS, I, Retry: Integer;
X,Y:Integer;
Begin
Wait(2000);
Writeln('Banking')
CTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
FindColorsSpiralTolerance(MSCX, MSCY, TPA, 4347794, MSX1, MSY1, MSX2, MSY2, 20);
ColorToleranceSpeed(CTS);
TPAA := TPAToATPAEx(TPA, 3, 1);
SortATPASize(TPAA, True);
For I := 0 To High(TPAA) Do
If GetArraylength(TPAA[i]) > 5 Then
Begin
repeat
inc(Retry);
MiddleTPAEx(TPAA[i], X, Y);
MMouse(X, Y, 3, 3);
if (IsUpTextMultiCustom(['anker', 'Bank B'])) then
Begin
Result := True;
GetMousePos(X, Y);
mouse(x,y,3,3,false);
wait(100 + random(200));
ChooseOption('Bank Banker');
wait(5000 + random(1000));
Break;
End;
until (Retry = 2);
Break;
end;
Mouse(x,y,3,3,false);
ChooseOption('Bank Banker');
Wait(2000);
Withdraw(0,0,28);
CloseBank;
end;
procedure HomeTeleportToArdy;
var
x,y,Sex,Sey:integer;
begin;
Writeln('We are going to Lodestone port to Ardrougune!')
GameTab(28);
if FindColorSpiralTolerance(x,y,8333644,564,222,586,240,20) then
begin;
Mouse(x,y,3,3,true);
end else
begin;
Writeln('Could not find the blue homeport button, logging off');
Logout;
TerminateScript;
end;
Wait(1000+Random(100));
if FindColorSpiralTolerance(Sex,Sey,2566303,163,203,182,229,20) then
begin;
Mouse(Sex,Sey,3,3,True);
Wait(15000+Random(100));
end else
begin;
Writeln('Could not find the red Ardy symbol , logging off');
Logout;
TerminateScript;
end;
GameTab(25);
end;
procedure RunFromLodeStoneToLever;
begin
ClickNorth(SRL_ANGLE_HIGH);
Writeln('Walking to the lever, like a boss')
ObjDTM_Walk('22:106:3:1:7:93:91:1:7:90:45:1:7:51:82:4:17:102:31:102:27:108:12:108',0,100,80,True);
Wait(500);
ObjDTM_Walk('27:118:3:1:7:99:71:1:7:107:54:1:7:24:49:4:20:111:33:110:28:131:19:124', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('71:147:3:1:7:66:41:1:7:58:102:1:7:65:131:4:80:138:65:145:74:154:80:146', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('14:108:3:1:7:71:136:1:7:51:103:1:7:74:82', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('23:70:3:1:7:117:86:1:7:116:69:1:7:78:59:4:12:66:40:68:36:80:11:75', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('40:98:3:0:7:83:33:0:7:75:103:0:7:36:56:4:36:94:47:92:44:103:36:103', 0, 100, 80, True);
Writeln('Arrived at Lever')
end;
procedure PullLeverAndRunToWeb;
var
x,y:integer;
begin;
MakeCompass('W');
SetAngle(1);
Writeln('Pulling Lever');
Wait(1000+Random(100));
if FindObjCustom(x,y,['Lever'],[4092043],20)then
begin;
Writeln('Horray, found lever, pulling it!');
Mouse(x,y,3,3,true);
Wait(6000+Random(100));
end;
Writeln('Running to web')
ClickNorth(SRL_ANGLE_HIGH);
Wait(1000);
ObjDTM_Walk('89:24:3:2:7:70:47:2:7:33:63:2:7:73:130:4:73:17:106:19:97:41:79:26',0,100,80,True);
Wait(500);
ObjDTM_walk('90:22:3:2:7:129:106:2:7:60:102:2:7:52:50:4:84:20:97:20:96:36:85:29',0,100,60,True);
end;
function CutWeb(WaitFor: Integer): Boolean;
var
Uptext: String;
t, x, y: Integer;
begin
Wait(2000);
Result := False;
MarkTime(t);
Writeln('Searching for web...');
repeat
if FindObj(x,y,'Web',9802901,10) then
begin
repeat
Mouse(x,y,3,3,true);
if WaitUptext('alk', 1000) then
begin
Writeln('Web slashed!');
Result := True;
Break;
end;
Wait(Random(1000));
until (TimeFromMark(t) > (WaitFor / 2));
end;
until Result or (TimeFromMark(t) > WaitFor);
if not Result then
Writeln('Web not found!');
end;
procedure RunFromWebToCourse;
begin;
Writeln('Walking to the course gate')
Wait(2000);
ObjDTM_Walk('16:97:3:2:7:109:101:2:7:121:70:2:7:64:37:4:7:89:26:86:29:101:9:106',0,100,80,True);
Wait(500);
ObjDTM_Walk('42:135:3:2:7:108:88:2:7:78:72:2:7:75:110:4:33:124:60:125:57:146:33:136', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('66:143:3:2:7:111:53:2:7:117:100:2:7:97:127:4:55:131:80:132:79:150:57:145', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('31:127:3:2:7:111:62:2:7:137:73:2:7:131:35:4:19:120:52:118:47:133:30:132', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('11:82:2:5:7:56:106:5:7:52:115:4:4:77:22:74:22:86:8:92', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('8:77:4:5:7:75:147:5:7:62:147:5:7:128:102:5:7:20:124:4:2:72:19:73:18:85:7:84', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('21:106:4:2:7:128:120:2:7:89:123:2:7:82:139:2:7:28:95:4:13:98:31:94:37:107:20:112', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('24:59:3:5:7:124:99:5:7:35:97:5:7:13:45:4:11:50:34:45:39:68:15:67', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('20:79:4:5:7:108:18:5:7:58:33:5:7:86:119:5:7:15:114:4:7:72:39:72:36:88:12:91', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('23:90:3:5:7:79:123:5:7:131:64:5:7:73:19:4:16:87:30:82:36:93:20:95', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('12:76:3:5:7:129:116:5:7:120:112:2:7:129:24:4:5:68:23:68:25:83:6:84', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('56:53:4:2:7:86:72:2:7:66:85:2:7:46:90:2:7:29:83:5:45:50:62:51:59:65:52:60:46:56', 0, 100, 80, True);
Writeln('Arrived at Gate')
end;
procedure PressGate;
var
x,y:integer;
begin;
if FindObjCustom(x,y,['Gate'],[2763564],20) then
begin;
Mouse(x,y,3,3,true);
Wait(15000+Random(100))
end;
end;
begin
Smart_Server := SmartWorld;
Smart_Members := Members;
Smart_Signed := SignedClient;
Smart_SuperDetail := HighDetail;
setupSRL();
ObjDTM_Setup
DeclarePlayers;
FromDeathToEdgeBank;
Banking;
HomeTeleportToArdy;
RunFromLodeStoneToLever;
PullLeverAndRunToWeb;
CutWeb(10000);
RunFromWebToCourse;
PressGate;
end.
Heres the deathwalker, if you can use it at all it would be cool.
It takes food from first first spot in your bank and then runs back to the course.
I guess some of the colours have changed because the lava and the rope stopped working for me, I changed them around and fiddled with the tolerances a little bit, they seem to work for me now, I also added my dealthwalker(im not sure it works yet). It worked for me once, but that was just once.
All i did was add my procedures to the LogoutOnDeath procedure, changed it from loging out to going back to the course, if anyone is wanting the updated colours/deathwalk here is what im using atm, tell me if it works for you, or where your having trouble and ill try update the walker, i know the walking Obj_DTMS are very sketchy so i dont expect it to work for everyone :P
Simba Code:program WAR;
{$DEFINE SMART}
{.include SRL/SRL.simba}
{.include custom/DDTM.simba}
{$i ObjectDTM\ObjDTMInclude.simba}
//{$DEFINE DEBUG} //uncomment if you need debug info
//{$DEFINE DEBUG_DRAW} //uncomment if you need debug info
type EObj = record
color, tol, w, h, minc, maxtry: integer;
hmod, smod: extended;
uptexts, options: TStringArray;
left: boolean;
end;
var courseObjs: array of EObj;
ddtms: array [0..1] of integer;
food: integer; //food dtm
foodslots: TIntegerArray; //food locations
startXP: integer;
wasInDung: boolean;
const
//SMART Setup
SmartWorld = 7;
Members = False;
SignedClient = True;
HighDetail = False;
//Player Setup
HEAL_AT = 130;
FOOD_DTM = 'mwQAAAHic42RgYDjPxMBwE4qvAvFlID4LxEeA+BiU7c3IwGALxO5A7AvEwUAcAcT+UDEnIO4qr2Cw0GAHmsjEsHXOPDCNjrmAJCHMSASGAwAuEw5P'; //put food dtm string here
//DDTM Setup
PIT_BLACK = 66566;
LOG_BROWN = 2049116;
DOOR_RED = 1009;
OUTLINE_WHITE = 16049649;
procedure FromDeathToEdgeBank;
var
x,y:integer;
begin;
Writeln('Unfortunetly you have died!');
ClickNorth(SRL_ANGLE_HIGH);
if ObjDTM_Find('52:48:4:1:7:120:86:1:7:136:90:1:7:58:29:1:7:86:60', x, y, True) then
begin;
Writeln('We found the bank, lets get some more food')
ObjDTM_Walk('52:48:4:1:7:120:86:1:7:136:90:1:7:58:29:1:7:86:60', 2, 100, 5, True);
end;
end;
Function Banking: Boolean;
Var
TPAA: T2DPointArray;
TPA: TPointArray;
CTS, I, Retry: Integer;
X,Y:Integer;
Begin
Wait(2000);
Writeln('Banking')
CTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
FindColorsSpiralTolerance(MSCX, MSCY, TPA, 4347794, MSX1, MSY1, MSX2, MSY2, 20); // Enter the Color and Tolerance Here at the Right place.
ColorToleranceSpeed(CTS);
TPAA := TPAToATPAEx(TPA, 3, 1);
SortATPASize(TPAA, True);
For I := 0 To High(TPAA) Do
If GetArraylength(TPAA[i]) > 5 Then
Begin
repeat
inc(Retry);
MiddleTPAEx(TPAA[i], X, Y);
MMouse(X, Y, 3, 3);
if (IsUpTextMultiCustom(['anker', 'Bank B'])) then
Begin
Result := True;
GetMousePos(X, Y);
mouse(x,y,3,3,false);
wait(100 + random(200));
ChooseOption('Bank Banker');
wait(5000 + random(1000));
Break;
End;
until (Retry = 2);
Break;
end;
Mouse(x,y,3,3,false);
ChooseOption('Bank Banker');
Wait(2000);
Withdraw(0,0,28);
CloseBank;
end;
procedure HomeTeleportToArdy;
var
x,y,Sex,Sey:integer;
begin;
Writeln('We are going to Lodestone port to Ardrougune!')
GameTab(28);
if FindColorSpiralTolerance(x,y,8333644,564,222,586,240,20) then
begin;
Mouse(x,y,3,3,true);
end else
begin;
Writeln('Could not find the blue homeport button, logging off');
Logout;
TerminateScript;
end;
Wait(1000+Random(100));
if FindColorSpiralTolerance(Sex,Sey,2566303,163,203,182,229,20) then
begin;
Mouse(Sex,Sey,3,3,True);
Wait(15000+Random(100));
end else
begin;
Writeln('Could not find the red Ardy symbol , logging off');
Logout;
TerminateScript;
end;
GameTab(25);
end;
procedure RunFromLodeStoneToLever;
begin
ClickNorth(SRL_ANGLE_HIGH);
Writeln('Walking to the lever, like a boss')
ObjDTM_Walk('22:106:3:1:7:93:91:1:7:90:45:1:7:51:82:4:17:102:31:102:27:108:12:108',0,100,80,True);
Wait(500);
ObjDTM_Walk('27:118:3:1:7:99:71:1:7:107:54:1:7:24:49:4:20:111:33:110:28:131:19:124', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('71:147:3:1:7:66:41:1:7:58:102:1:7:65:131:4:80:138:65:145:74:154:80:146', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('14:108:3:1:7:71:136:1:7:51:103:1:7:74:82', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('23:70:3:1:7:117:86:1:7:116:69:1:7:78:59:4:12:66:40:68:36:80:11:75', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('40:98:3:0:7:83:33:0:7:75:103:0:7:36:56:4:36:94:47:92:44:103:36:103', 0, 100, 80, True);
Writeln('Arrived at Lever')
end;
procedure PullLeverAndRunToWeb;
var
x,y:integer;
begin;
MakeCompass('W');
SetAngle(1);
Writeln('Pulling Lever');
Wait(1000+Random(100));
if FindObjCustom(x,y,['Lever'],[4092043],20)then
begin;
Writeln('Horray, found lever, pulling it!');
Mouse(x,y,3,3,true);
Wait(6000+Random(100));
end;
Writeln('Running to web')
ClickNorth(SRL_ANGLE_HIGH);
Wait(1000);
ObjDTM_Walk('89:24:3:2:7:70:47:2:7:33:63:2:7:73:130:4:73:17:106:19:97:41:79:26',0,100,80,True);
Wait(500);
ObjDTM_walk('90:22:3:2:7:129:106:2:7:60:102:2:7:52:50:4:84:20:97:20:96:36:85:29',0,100,60,True);
end;
function CutWeb(WaitFor: Integer): Boolean;
var
Uptext: String;
t, x, y: Integer;
begin
Wait(2000);
Result := False;
MarkTime(t);
Writeln('Searching for web...');
repeat
if FindObj(x,y,'Web',9802901,10) then
begin
repeat
Mouse(x,y,3,3,true);
if WaitUptext('alk', 1000) then
begin
Writeln('Web slashed!');
Result := True;
Break;
end;
Wait(Random(1000));
until (TimeFromMark(t) > (WaitFor / 2));
end;
until Result or (TimeFromMark(t) > WaitFor);
if not Result then
Writeln('Web not found!');
end;
procedure RunFromWebToCourse;
begin;
Writeln('Walking to the course gate')
Wait(2000);
ObjDTM_Walk('16:97:3:2:7:109:101:2:7:121:70:2:7:64:37:4:7:89:26:86:29:101:9:106',0,100,80,True);
Wait(500);
ObjDTM_Walk('42:135:3:2:7:108:88:2:7:78:72:2:7:75:110:4:33:124:60:125:57:146:33:136', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('66:143:3:2:7:111:53:2:7:117:100:2:7:97:127:4:55:131:80:132:79:150:57:145', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('31:127:3:2:7:111:62:2:7:137:73:2:7:131:35:4:19:120:52:118:47:133:30:132', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('11:82:2:5:7:56:106:5:7:52:115:4:4:77:22:74:22:86:8:92', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('8:77:4:5:7:75:147:5:7:62:147:5:7:128:102:5:7:20:124:4:2:72:19:73:18:85:7:84', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('21:106:4:2:7:128:120:2:7:89:123:2:7:82:139:2:7:28:95:4:13:98:31:94:37:107:20:112', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('24:59:3:5:7:124:99:5:7:35:97:5:7:13:45:4:11:50:34:45:39:68:15:67', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('20:79:4:5:7:108:18:5:7:58:33:5:7:86:119:5:7:15:114:4:7:72:39:72:36:88:12:91', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('23:90:3:5:7:79:123:5:7:131:64:5:7:73:19:4:16:87:30:82:36:93:20:95', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('12:76:3:5:7:129:116:5:7:120:112:2:7:129:24:4:5:68:23:68:25:83:6:84', 0, 100, 80, True);
Wait(500);
ObjDTM_Walk('56:53:4:2:7:86:72:2:7:66:85:2:7:46:90:2:7:29:83:5:45:50:62:51:59:65:52:60:46:56', 0, 100, 80, True);
Writeln('Arrived at Gate')
end;
procedure PressGate;
var
x,y:integer;
begin;
if FindObjCustom(x,y,['Gate'],[2763564],20) then
begin;
Mouse(x,y,3,3,true);
Wait(15000+Random(100))
end;
end;
procedure DeclareObjects;
begin
setLength(courseObjs, 6);
//Pipe
with courseObjs[0] do
begin
color:= 6447197;
tol:= 18;
hmod:= 0.25;
smod:= 0.05;
w:= 20; h:= 20; minc:= 100; maxtry:= 3;
uptexts:=['rou'];
options:=['rou'];
left:=true;
end;
//Swing
with courseObjs[1] do
begin
color:= 1060661;
tol:= 10;
hmod:= 0.14;
smod:= 0.87;
w:= 10; h:= 10; minc:= 30; maxtry:= 5;
uptexts:=['wing', 'ing'];
options:=['wing', 'ing'];
left:=false;
end;
//Lava
with courseObjs[2] do
begin
color:= 2240363;
tol:= 4;
hmod:= 0.05;
smod:= 0.40;
w:= 30; h:= 30; minc:= 40; maxtry:= 2;
uptexts:=['ross'];
options:=['ross'];
left:=false;
end;
//Log
with courseObjs[3] do
begin
color:= 5002072;
tol:= 6;
hmod:= 0.34;
smod:= 0.10;
w:= 20; h:= 20; minc:= 40; maxtry:= 2;
uptexts:=['acro'];
options:=['acro'];
left:=true;
end;
//Cliff
with courseObjs[4] do
begin
color:= 5197651;
tol:= 2;
hmod:= 0.0;
smod:= 0.27;
w:= 30; h:= 30; minc:= 100; maxtry:= 3;
uptexts:=['iff'];
options:=['iff'];
left:=false;
end;
//Ladder
with courseObjs[5] do
begin
color:= 3555138;
tol:= 7;
hmod:= 0.20;
smod:= 0.55;
w:=10; h:=10; minc:=40; maxtry:=3;
uptexts:=['imb'];
options:=['imb'];
left:=true;
end;
{
with courseObjs[4] do
begin
color:=;
tol:=;
hmod:=;
smod:=;
w:=; h:=; minc:=; maxtry:=;
uptexts:=;
options:=;
end;
}
end;
procedure ProgressReport(var startXP: integer);
var gain: integer;
begin
gain := GetXPBarTotal- startXP;
writeln('Time running: ' + TimeRunning);
writeln('Exp Gained: ' + IntToStr(gain));
writeln('Est XP/H: ' + IntToStr(round(3600000 * 1.0 / GetTimeRunning * gain)));
end;
procedure FreeDDTM;
var i: integer;
begin
for i:=0 to high(ddtms) do
FreeDTM(ddtms[i]);
end;
procedure DeclareDDTM;
var DTMSubPoints: array of TDTMPointDef;
DTMMainPoint: TDTMPointDef;
begin
//Log DDTM
setLength(DTMSubPoints, 4);
DTMMainPoint:= DTMPoint(9, 0, 1, 0, 16777215, 255);
DTMSubPoints[0] := DTMPoint(9, 6, 1, 0, PIT_BLACK, 25);
DTMSubPoints[1] := DTMPoint(19, 3, 1, 0, PIT_BLACK, 25);
DTMSubPoints[2] := DTMPoint(0, 3, 1, 0, PIT_BLACK, 25);
DTMSubPoints[3] := DTMPoint(0, 12, 1, 0, LOG_BROWN, 25);
ddtms[0] := AssembleDDTM(DTMMainPoint, DTMSubPoints);
//Gate DDTM
setLength(DTMSubPoints, 3);
DTMMainPoint:= DTMPoint(4, 0, 1, 0, 16777215, 255);
// DTMSubPoints[0] := DTMPoint(4, 0, 1, 0, 1009, 25); //red
DTMSubPoints[0] := DTMPoint(10, 0, 1, 0, 15268071, 25); //white
DTMSubPoints[1] := DTMPoint(7, 0, 1, 0, 1009, 25); //red
DTMSubPoints[2] := DTMPoint(0, 0, 1, 0, 1009, 25); //''
ddtms[1] := AssembleDDTM(DTMMainPoint, DTMSubPoints);
//Hook FreeDTM
AddOnTerminate('FreeDDTM');
end;
procedure DeclarePlayers;
var i:integer;
begin
NumberOfPlayers(1);
CurrentPlayer := 0;
for i := 0 to 0 do
Players[i].BoxRewards := ['mote', 'ostume', 'XP', 'Gem', 'ithril', 'oal', 'une', 'oins'];
with Players[0] do
begin
Name := 'swt@hotmail.co.uk'; //Player username.
Pass := 'balonibaloni1'; //Player password.
Nick := 'Euz'; //Player nickname - 3-4 letters of Player username.
Active := True;
end;
end;
procedure DoLogin;
var t: integer;
begin
MarkTime(t);
while (not LoggedIn) do
begin
if LogInPlayer then
break;
wait(10000+random(500));
if (TimeFromMark(t) > 180000) then
begin
writeln('Failed to login after 180s... Terminating');
TerminateScript;
end;
end;
end;
procedure GetLocationOffset(location: string; var dx, dy: integer);
begin
//Change the global offsets here!
case location of
'pipe' : begin
dx:=27;
dy:=50;
end;
'swing' : begin
dx:=31;
dy:=-19;
end;
'lava' : begin
dx:=18;
dy:=-48;
end;
'log' : begin
dx:=15;
dy:=13;
end;
'cliff' : begin
dx:=-16;
dy:=38;
end;
end;
end;
function CalibratePosition(location: string): boolean;
var d, x, y, dx, dy: integer;
e: extended;
begin
if not LoggedIn then Exit;
result := false;
FindNormalRandoms;
d:=ddtms[0];
//eat
if FindDTMRotated(d, x, y, MMX1, MMY1, MMX2, MMY2, -Pi/6, Pi/6, 0.05, e) then
begin
GetLocationOffset(location, dx, dy);
writeln('dxdy: ' + inttostr(dx) + ' ' + inttostr(dy));
mouse(x+dx, y+dy, 4, 4, mouse_left);
// mouse(x, y, 4, 4, mouse_move);
end;
end;
function CalibratePositionB(location: string; var p: TPoint): boolean;
var d, x, y, dx, dy: integer;
e: extended;
begin
if not LoggedIn then Exit;
result := false;
FindNormalRandoms;
d:=ddtms[0];
//eat
result:= FindDTMRotated(d, x, y, MMX1, MMY1, MMX2, MMY2, -Pi/6, Pi/6, 0.05, e);
p:= Point(x,y);
end;
function objFind(color, tol: integer; hmod, smod: extended; w,h, minc, maxtry: integer;
left: boolean; uptexts, options: TStringArray): boolean;
var tcts, i, x, y, c: integer;
tpa: TPointArray;
atpa: T2DPointArray;
begin
Result:=False;
tcts:= getToleranceSpeed;
setColorToleranceSpeed(2);
setColorSpeed2Modifiers(hmod, smod);
if FindColorsSpiralTolerance(MSCX, MSCY, tpa, color, MSX1, MSY1, MSX2, MSY2, tol) then
begin
atpa:= TPAtoATPAEx(tpa, 20, 20);
{$IFDEF DEBUG_DRAW}
debugATPABounds(atpa);
{$ENDIF}
for i:=0 to high(atpa) do
begin
writeln('atpa['+IntToStr(i)+']: '+IntToStr(length(atpa[i])));
if (minc > 0) and (length(atpa[i]) < minc) then continue;
if (c > maxtry) then continue;
Inc(c);
MiddleTPAEx(atpa[i], x, y);
Mouse(x, y, 3, 3, mouse_move);
if WaitUptextMulti(uptexts, 1000) then
begin
if left then
begin
ClickMouse2(mouse_left);
Result:= DidRedClick;
end
else
begin
ClickMouse2(mouse_right);
Result:= WaitOptionMulti(options, 1000);
end;
if Result then
begin
writeln('objfind success!');
break;
end;
end;
end;
end;
setColorToleranceSpeed(tcts);
end;
function objFindW(obj: EObj): boolean;
begin
result:= objFind(obj.color, obj.tol, obj.hmod, obj.smod,
obj.w, obj.h, obj.minc, obj.maxtry, obj.left, obj.uptexts, obj.options);
end;
function InDungeon: boolean;
var tpa: TPointArray;
begin
if not LoggedIn then Exit;
SetColorToleranceSpeed(1);
FindMMColorsSpiralTolerance(tpa, 2574684, 25);
writeln(length(tpa));
result := length(tpa) > 1200;
if result then writeln('in dungeon');
end;
function InSurface: boolean;
var tpa: TPointArray;
begin
FindMMColorsSpiralTolerance(tpa, 5222643, 25);
result:= length(tpa) >= 200;
end;
function DetermineAction(var action: string): boolean;
var d, x, y, dx, dy: integer;
e: extended;
p: TPoint;
begin
if not LoggedIn then Exit;
FindNormalRandoms;
//Dungeon
if InDungeon then
begin
action:= 'dungeon';
result:= true;
Exit;
end;
//Detect where we are on the surface!
d:=ddtms[0];
result:= FindDTMRotated(d, x, y, MMX1, MMY1, MMX2, MMY2, -Pi/6, Pi/6, 0.05, e);
if result then
begin
//Calculate our position offsets
dx:= MMCX - x;
dy:= MMCY - y;
//Determine action based on these offsets
//pipe
if dy > 38 then
begin
action:= 'pipe';
Exit;
end;
//swing
if (dx > 27) and (dy < 0) and (dy > -40) then
begin
action:= 'swing';
Exit;
end;
//lava
if (dx > -5) and (dy < -35) then
begin
action:= 'lava';
Exit;
end;
//log
if (dx < 20) and (dy > -35) and (dy < 25) then
begin
action:= 'log';
Exit;
end;
//cliff
if (dy > 0) and (dy < 38) and (dx < 0) then
begin
action:= 'cliff';
Exit;
end;
end;
end;
procedure AddArray(var a: TIntegerArray; v: integer);
var i: integer;
begin
for i:=0 to high(a) do
if a[i] = v then
exit;
setLength(a, length(a) + 1);
a[high(a)] := v;
end;
procedure SetupInventory;
var i, x, y: integer;
tb: TBox;
begin
setLength(foodslots, 0);
for i:=1 to 28 do
if ExistsItem(i) then
begin
tb:= InvBox(i);
if FindDTM(food, x, y, tb.X1, tb.Y1, tb.X2, tb.Y2) then
AddArray(foodslots, i);
end;
end;
procedure LobbyOnDeath;
begin
Reincarnate:= true;
if FindDead then
begin
DeclarePlayers;
FromDeathToEdgeBank;
Banking;
HomeTeleportToArdy;
RunFromLodeStoneToLever;
PullLeverAndRunToWeb;
CutWeb(10000);
RunFromWebToCourse;
PressGate;
end;
end;
procedure EatFood;
var hp: integer;
temp: string;
begin
if not LoggedIn then Exit;
FindNormalRandoms;
hp:= getMMLevels('hp', temp);
if hp <= HEAL_AT then
begin
writeln('HP low');
if length(foodslots) = 0 then
begin
writeln('No food');
Exit;
end;
MouseItem(foodslots[0], mouse_left);
wait(500+random(250));
SetupInventory;
end;
end;
function EscapeDungeon: boolean;
var tpa: TPointArray;
r, a, x, y: integer;
begin
if not LoggedIn then Exit;
result := false;
FindNormalRandoms;
LobbyOnDeath;
//Eat
if InDungeon then
begin
writeln('Player in dungeon. Trying to escape...');
wasInDung:= true;
// FindMMColorsSpiralTolerance(tpa, 123, 456); //ladder
// if length(tpa) < 100 then
if true then
begin
r:= randomRange(65, 72);
a:= randomRange(60, 75);
Mouse(MMCX + round(r*cos(a*pi/180.0)), MMCY -round(r*sin(a*pi/180.0)), 4, 4, mouse_left);
wait(2000+random(500));
while IsMoving do
wait(100+random(50));
end;
{ FindMMColorsSpiralTolerance(tpa, 123, 456); //find Ladder again
if length(tpa) > 100 then
begin
MiddleTPAEx(tpa, x, y);
Mouse(x, y, 4, 4, mouse_left);
wait(1000+random(500));
while IsMoving do
wait(100+random(50));
end;
}
result:=ObjFindW(courseObjs[5]);
if result then
if WaitFunc(@InSurface, 500, 5000) then
begin
result:=true;
wait(1000+random(250));
end
else
result:=false;
end;
end;
function CheckObstacle(success, fail: string): boolean;
var t: integer;
begin
result:= false; //silent update 2
if FindBlackChatMessage(success) or FindBlackChatMessage(fail) then
wait(5000);
MarkTime(t);
repeat
if FindBlackChatMessage(success) then
begin
result:= true;
break;
end;
if FindBlackChatMessage(fail) then
begin
result:= false;
break;
end;
wait(500+random(150));
until TimeFromMark(t) > 10000;
if timefrommark(t) <= 10000 then
if result then
writeln('success message detected!')
else writeln('failure message detected!')
end;
function DoObstacleEx(location: string): boolean;
var obj, initXP, lastXP, t: integer;
v: TVariantArray;
begin
if not LoggedIn then Exit;
result := false;
FindNormalRandoms;
initXP := getXPBarTotal;
writeln('init xp is ' + inttostr(initxp));
case location of
'pipe' : obj:= 0;
'swing' : obj:= 1;
'lava' : obj:= 2;
'log' : obj:= 3;
'cliff' : obj:= 4;
end;
writeln(obj);
result := ObjFindW(courseObjs[obj]);
if result then
begin
case location of
'lava' : begin
result:= CheckObstacle('safe', 'fall');
if not result then
begin
wait(1000+random(250));//stall the animation
Exit;
end;
end;
'log' : begin
result:= CheckObstacle('skil', 'fall');
if not result then
if WaitFunc(@InDungeon, 500, 5000) then
Exit
else result:= true; //false positive!
end;
'swing': begin
MarkTime(t);
repeat
if ClickContinue(true, true) then //someone is using
begin
result:=false;
Exit;
end;
if FindBlackChatMessage('wing') then //success
begin
writeln('success');
result:=true;
break;
end;
if InDungeon then //Fell into pit
begin
writeln('failure');
result:=false;
WaitFunc(@InDungeon, 500, 2000); //improve walking
Exit;
end;
wait(500+random(150));
until TimeFromMark(t) > 10000;
end;
end;
end;
if result then
begin
MarkTime(t);
repeat
lastXP:= GetXPBarTotal;
wait(100+random(100));
until (TimeFromMark(t) > 10000) or (lastXP > initXP);
if (TimeFromMark(t) <= 15000) then
writeln('XP gain detected!');
case location of
'swing': wait(2000+random(500));
'log' : wait(1000+random(500));
end;
end;
end;
function DoObstacle(location: string): boolean;
var obj, dx, dy: integer;
p: TPoint;
v: TVariantArray;
begin
if not LoggedIn then Exit;
result := false;
FindNormalRandoms;
EatFood;
LobbyOnDeath;
//Immediate Exit if we're in dungeon
if ((location = 'log') or (location = 'swing')) and InDungeon then
begin
result:= false;
exit;
end;
//Now just try to do it
if (location <> 'pipe') then //this we don't need to relocate
result:= DoObstacleEx(location);
// if ((location = 'swing') or (location = 'log')) and not wasInDung then
// result:= DoObstacleEx(location);
if result then
begin
writeln('DoObstacle: ' + booltostr(result));
Exit;
end;
//Calibrate position because previous find is not successful
if CalibratePositionB(location, p) then
begin
GetLocationOffset(location, dx, dy);
writeln('distance is '+ inttostr(Distance(MMCX, MMCY, p.x+dx, p.y+dy)));
if Distance(MMCX, MMCY, p.x+dx, p.y+dy) > 15 then
begin
CalibratePosition(location);
wait(2000+random(250));
while IsMoving do
wait(50+random(50));
end;
end;
result:= DoObstacleEx(location);
writeln('DoObstacle: ' + booltostr(result));
end;
procedure DoCourse;
var action: string;
begin
action:= 'pipe';
SetupInventory;
ClickNorth(SRL_ANGLE_HIGH);
while LoggedIn do
begin
FindNormalRandoms;
LobbyOnDeath;
writeln('current action is ' + action);
case action of
'pipe' : begin
if DoObstacle(action) then action := 'swing';
LobbyOnDeath;
end;
'swing': begin
// if true then
// begin
if DoObstacle(action) then //found success
begin
action:='lava';
wasInDung:= false;
end
else EscapeDungeon;
LobbyOnDeath;
// end;
end;
'lava' : begin
if DoObstacle(action) then
action:= 'log'
else
writeln('return to lava');//return to starting lava
end;
'log' : begin
if DoObstacle(action) then
begin
action:='cliff';
wasInDung:= false;
end
else EscapeDungeon;
LobbyOnDeath;
end;
'cliff': begin
if DoObstacle(action) then action:='pipe';
ProgressReport(startXP);
end;
'dung': begin //failsafe if lost
if EscapeDungeon then
action:='lava';
end;
end;
EatFood;
LobbyOnDeath;
wait(500+random(250));
end;
end;
procedure FreeDTMz;
begin
FreeDTM(food);
end;
var d,x, y: integer;
e: extended;
begin
Smart_Server := SmartWorld;
Smart_Members := Members;
Smart_Signed := SignedClient;
Smart_SuperDetail := HighDetail;
setupSRL();
DeclarePlayers;
DoLogin;
DeclareDDTM;
food:=DTMFromString(FOOD_DTM);
AddOnTerminate('FreeDTMz');
Reincarnate := true;
DeclareObjects;
d:= ddtms[0];
writeln(booltostr(FindDTMRotated(d, x, y, MMX1, MMY1, MMX2, MMY2, -Pi/6, Pi/6, 0.05, e) ));
ToggleXPBar(true);
startXP:= GetXPBarTotal;
DoCourse;
end.
I also added in some random LobbyOnDeath procedures here and there because i recall more than once the script didnt recognise i was dead and found myself running around edgeville when i came back to my computer.
Anyhoo, if anyone is still active on this thread at all :L give it a shot and tell me how it goes.
Y
ou'll need the ODTM extension!!!
however, i might try it out using SPS, it seemed more reliable, when i tried making this with SPS i got it to work pretty well, so if the Obj DTM's are that bad ill change back over.
Last edited by ne lg; 06-06-2012 at 10:53 PM.
Really nice script
For those who want lobsters:
Code:FOOD_DTM = 'mggAAAHicY2NgYKhiYWDoAuI2IG4F4mYgbgFiFSYGBjEglgJiWSYIXxuI14ZJAHUxMZxJlQHTMMwPJLFhRhwYAgB+5QbR';
Great script, works like a charm! Thanks for posting!
As I'm new to SRL, I found it helpful to add a message in the inventory setup to let me know right away that it found food. (Just so that I knew my DTM string was acceptable, I struggled to get it right the first couple of times.)
Had the same problem with repeating the lava obstacle. I tried setting chats to off and game to all as suggested elsewhere in this thread, but didn't seem to help. Not really a problem though, only repeats it the once and it doesn't stop me getting the complete lap xp.
Thanks again for a great script!
McLengthy
Last edited by mclengthy; 07-02-2012 at 08:10 PM.
Um guys can anyone make a Dtm on Cakes plz![]()
It is very easy to make man just gotta learn how to do it!
try this guide by YoHoJo
Mostly Inactive, School
Er1k thnks so much for this script used it from 52-70 agility and only baby sitted it for a while achieved 70 agility like 5 days ago but for got to post it !!!
Nice script, but i got some problem on lava's obstacle detect. If i fail on lava part, the player would appear on north of the poll, and that make color detect broken. Can you give me some idea about how do i fix it?
Maybe you are thinking that why i not trying to fix it myself. Well, i did fix it by replace the lava obstacle part detection from color to DTM. I just want to ask some question about how is the "re-position" work in this script. Most of the time, when it can't detect the obstacle to click, it will try to reposition the player. However, when after failing lava obstacle , this script will not try to re-position itself when it can't find the obstacle to click.
There are currently 1 users browsing this thread. (0 members and 1 guests)