SRL Archive - Archive

nivek1989 - SRL Member Application


Kevin

2013-03-07 00:06:41

How Long have You Played Runescape?
7 Year(s)


Are you affilated in anyway with Jagex LTD?
No

Were you Referred to SRL?
No


What is your general programming knowledge?
C/C++, C#, MIPS, Java, SQL, ARM, Javascript (kinda), PascalScript, PowerScript, TCL, and iRules.


Are you a member of any other communities?
None.


Tell us about yourself…
From: nivek1989
My name is Kevin, I graduated university almost a year ago now with a degree in Computer Engineering. I originally found Villavu by researching pixel-based searching algorithms while writing my own java-based library with exactly the goals of making something akin to SIMBA. I enjoy playing games and programming too much. I play a fair amount of League of Legends as well if there was anyone on (preferably the NA server) who wants to join, btw?



Please show us one (or multiple) of your scripts.
program BeginnerThiever;
{$DEFINE SMART8}
{$i SRL/srl.simba}
{$IFDEF SIMBAMAJOR980}
{$I SRL/SRL/MISC/PAINTSMART.SIMBA}
{$ELSE}
{$I SRL/SRL/MISC/SMARTGRAPHICS.SIMBA}
{$ENDIF}
{$i sps/sps.simba}
{$i ObjectDTM/ObjDTMInclude.simba}
{$i SRL/SRL/Skill/Fighting.Simba}
{$i srl/srl/misc/debug.simba}
//WANT TO IMPLEMENT: Freedom skill, Grim reaper talk during death - only happens with accounts who have never died.
//Randomly occurs during script start, only if RS already logged in, not directly my code: Warning! You passed a wrong ys to a finder function: -2. That is below 0, thus out of bounds. Setting the value to 0 for now.
//Default numbers for starting each pickpocket is determined mathematically for best xp/hour.
const
//Basic script runtime settings. Set a Start*At to 100 to never do. Otherwise will do highest setting chosen for your current level
LetDie = True; //A death based return to any thieving point exists, so death does not hurt script. However if you prefer to eat food/logout if low, set false.
HealthToEat = 50; //Low health recommended as pickpocket failures result in a loss of health based on remaining. (More efficient the lower this number is. Be careful not too low, such that a failure can kill you. 50 is my recommendation.)
MaxHealth = 2500; ///What is your health when full?
StartBanditsAt = 35;
StartGuardsAt = 52;
StartWatchmenAt = 65; //Does not implement any death-walking as death should not occur. WatchTower quest is a pre-requisite the script won't verify.
StartKnightsAt = 70;
StartPaladinsAt = 90;

//Debug options
numDebugMessages = 5; //Quantity of SmartDebug messages on screen at a time.
SmartDebug = False;
TextDebug = False;
DebugObjectFinder = False;

//Player Login settings. Pin is unneccesarry because no banking.
PlayerName = '';
PlayerPassword = '';

//Settings for how breaks are handled as well as when to end the script. All numbers are in minutes.
ImplementBreaks = True; //Break at all?
ImplementAfkBreaks = False; //Instead of logging out for the breaks, simulates going AFK.
minutesTillBreakMin = 180; //How long script runs before a break is based off a random value between these two values in minutes.
minutesTillBreakMax = 190;
BreakLengthMin = 10; //How long script breaks for is based off a random value between these two values.
BreakLengthMax = 15;
MiniBreakCountBeforeLargeBreak = 6; //After this many short breaks, 1 long break will occur(= 5; means 6th break will be long).
longBreakLengthMin = 420; //The break length will be determined off a random value between these two values. Set to your BreakLengthMin and max values to not have a separate length of time for this "longer break". Normally in place to simulate sleeping.
longBreakLengthMax = 480;
EverFinish = False; //Set to false if you want this script to run forever.
minutesTillDone = 600; //Ignored if EverFinish = False;
GoalLevel = 100; //Needs to be >= 100 to run forever, else will stop script at level desired.

//DO NOT EDIT ANYTHING BELOW THIS LINE
Version = 1.5;

type
ColoredSection = record
color: integer;
tolerance: integer;
minSize: integer;
hue: extended;
sat: extended;
end;
PickpocketTarget = record
vision: ColoredSection;
xpPerPickpocket: integer;
UpText: TStringArray;
LodestoneToThievingArea: TPointArray;
DeathWalkToThievingArea: TPointArray;
RelatedMapName: String;
MapInUse: boolean;
XMin: integer;
XMax: integer;
YMin: integer;
YMax: integer;
end;

var
TimeBegan, BreakLength, TimeToBreak, GoldEarned, timeDone, StartingLevel, CurrentLevel, LastXpCount, XpToNext, breakCount, FailCount, LogTimer, TimeTillSixHourFix, BreadDTM: integer;
StartingXp, LastXp: LongInt;
StealFrom: String;
DebugMessages: array[0..(numDebugMessages-1)] of String;
FoodLocations: array[0..27] of boolean;
Target: PickpocketTarget;

procedure DeclarePlayers;
begin
NumberOfPlayers(1);
CurrentPlayer := 0;

Players[0].Name := PlayerName;
Players[0].Pass := PlayerPassword;
Players[0].Pin := '';
Players[0].Nick := '';
Players[0].Active:=True;
end;

procedure Updater();//About half of this procedure taken from SuperUser
var
version_remote, update: string;
fh: integer;
remoteNum: extended;
begin
WriteLn('Update check...');
version_remote := GetPage('http://beginner-thiever.googlecode.com/svn/trunk/version.txt');
try
remoteNum:= StrToFloat(version_remote);
except;
try
version_remote := GetPage('http://beginner-thiever.googlecode.com/svn/trunk/version.txt');
remoteNum:= StrToFloat(version_remote);
except
WriteLn('Update check failed!');
Exit;//Update isn't necessarily required
end;
end;
if (remoteNum > VERSION) then
begin
if MessageBox('Kevin''s Beginner Thiever v' + version_remote + ' is available. Do you wish to update?', 'Newer version available', 1) = 1 then
begin
try
begin
fh := Rewritefile(ScriptPath + 'BeginnerThiever' + version_remote + '.simba', true);
update:= GetPage('http://beginner-thiever.googlecode.com/svn/trunk/BeginnerThiever.simba');
if((update = '') or (pos('<!DOCTYPE HTML PUBLIC', update) = 1))then
begin
update:= GetPage('http://beginner-thiever.googlecode.com/svn/trunk/BeginnerThiever.SIMBA');
if((update = '') or (pos('<!DOCTYPE HTML PUBLIC', update) = 1))then
begin
WriteLn('Something failed in updating the script. However, an update is out.');
Exit;
end;
end;
WriteFileString(fh, update);
MessageBox('Successfully updated Kevin''s Beginner Thiever to v' + version_remote + '! Please open the newly saved script to run the newest version.', 'Success', 0);
TerminateScript();
end;
except
begin
MessageBox('An error occurred while trying to update!', 'Error', 0);
end;
finally
begin
CloseFile(fh);
end;
end;
end;
end;
WriteLn('No update needed.');
end;

procedure RunTextDebug(Message: String);
begin
if(TextDebug)then
begin
WriteLn(Message);
end;
end;

procedure RunSmartDebug(Message: String);
var
i: integer;
begin
if(SmartDebug=True)then
begin
i:= numDebugMessages;
while(i >= 2) do
begin
DebugMessages[i-1]:= DebugMessages[i-2];
Dec(i);
end;
DebugMessages[0]:= Message;
SMART_ClearCanvas;
for i:=0 to (numDebugMessages-1) do//Draw the list of debug order newest at top.
begin
SMART_DrawTextEx(False, 12, (120 + (15 * i)), LoginChars, DebugMessages[i], 13158600);
end;
end;
end;

procedure RunObjectDebug(ATPA: T2DPointArray);
begin
if(DebugObjectFinder)then
begin
DebugATPABounds(ATPA);
end;
end;

function LoginSetup: boolean;
begin
if(LoggedIn)then
begin
Result:= True;
end else if(loginPlayer)then
begin
ToggleMoneyPouch(False);
ToggleXPBar(True);
ClickNorth(SRL_ANGLE_HIGH);
ToggleActionBar(False);
SetAllChats('On', 'Off', 'Off', 'Off', 'Off', 'Off', 'Off');
FindNormalRandoms;
Result:= True;
end;
end;

//THE FOLLOWING 2 MOUSE METHODS ARE 100% THE WORK OF FLIGHT
procedure BrakeWindMouse(xs, ys, xe, ye, gravity, wind, minWait, maxWait, targetArea: extended);
var
veloX,veloY,windX,windY,veloMag,dist,randomDist,lastDist,D: extended;
lastX,lastY,MSP,W,TDist,T: integer;
sqrt2,sqrt3,sqrt5,PDist,maxStep: extended;
begin
MSP := MouseSpeed;
sqrt2:= sqrt(2);
sqrt3:= sqrt(3);
sqrt5:= sqrt(5);

TDist := Distance(Round(xs), Round(ys), Round(xe), Round(ye));
if (TDist < 1) then
TDist := 1;
MarkTime(T);
repeat
if (TimeFromMark(T)>5000) then
break;

dist:= hypot(xs - xe, ys - ye);
wind:= minE(wind, dist);
if (dist < 1) then
dist := 1;
PDist := (dist/TDist);
if (PDist < 0.01) then
PDist := 0.01;

{
These constants seem smooth to me, but
feel free to modify these settings however
you wish.
}

if (PDist >= 0.15) then //15% (or higher) dist to destination
begin
D := (Round((Round(dist)*0.3))/5);
if (D < 20) then
D := 20;
end else if (PDist < 0.15) then
begin
if ((PDist <= 0.15) and (PDist >= 0.10)) then //10%-15%
D := RandomRange(8, 13)
else if (PDist < 0.10) then //< 10%
D := RandomRange(4, 7);
end;

if (D <= Round(dist)) then
maxStep := D
else
maxStep := Round(dist);

if dist >= targetArea then
begin
windX:= windX / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
windY:= windY / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
end else
begin
windX:= windX / sqrt2;
windY:= windY / sqrt2;
end;

veloX:= veloX + windX;
veloY:= veloY + windY;
veloX:= veloX + gravity * (xe - xs) / dist;
veloY:= veloY + gravity * (ye - ys) / dist;

if (hypot(veloX, veloY) > maxStep) then
begin
randomDist:= maxStep / 2.0 + random(round(maxStep) div 2);
veloMag:= sqrt(veloX * veloX + veloY * veloY);
veloX:= (veloX / veloMag) * randomDist;
veloY:= (veloY / veloMag) * randomDist;
end;

lastX:= Round(xs);
lastY:= Round(ys);
xs:= xs + veloX;
ys:= ys + veloY;

if (lastX <> Round(xs)) or (lastY <> Round(ys)) then
MoveMouse(Round(xs), Round(ys));

W := (Random((Round(100/MSP)))*6);
if (W < 5) then
W := 5;
W := Round(W*1.2);
wait(W);
lastdist:= dist;
until(hypot(xs - xe, ys - ye) < 1)

if (Round(xe) <> Round(xs)) or (Round(ye) <> Round(ys)) then
MMouse(Round(xe), Round(ye), 0, 0);

MouseSpeed := MSP;
end;

Procedure BrakeMMouse(eX, eY, ranX, ranY: Integer);
var
randSpeed: extended;
X,Y,MS: integer;
begin
MS := MouseSpeed;
randSpeed := (random(MouseSpeed) / 2.0 + MouseSpeed) / 10.0;
GetMousePos(X, Y);
BrakeWindMouse(X, Y, RandomRange(eX-ranX, eX+ranX), RandomRange(eY-ranY,eY+ranY), 8, 5, 10.0 / randSpeed, 15.0 / randSpeed, 10.0 * randSpeed);
MouseSpeed := MS;
end;

//BACK TO MY CODE
//Guaranteed to return a point in the object unlike cases of MiddleTPA, and it's calculated far quicker.
procedure MedianTPAEx(TPA: TPointArray; var fX, fY: integer);
var
tpaLen: integer;
begin
tpaLen:= GetArraylength(TPA);
if((tpaLen mod 2) = 0)then
begin
tpaLen:= tpaLen/2;//Not truly length, but saves a variable to store midway point here
fx:= TPA[tpaLen].x;
fy:= TPA[tpaLen].y;
end else
begin
tpaLen:= (tpaLen/2)+1;//Not truly length, but saves a variable to store midway point here
fx:= TPA[tpaLen].x;
fy:= TPA[tpaLen].y;
end;
end;

//Similar to gaussRand, but controlled weighting and faster calculations. (also follows more of a conic curve as opposed to binomial)
//-1 is the error return. sorry if that's a number you planned on using.
function WeightedRandom(min, max, weight, weightedNumber: integer): integer;
var
total, currentWeight, differencePer: extended;
i, arrayOffset, rand: integer;
Range: TExtendedArray;
begin
if((min > max) or (weightedNumber > max) or (weightedNumber < min))then
begin
result:= -1;
end else if (min = max)then
begin
result:= min;
end else
begin
SetLength(Range, (max - min+1));
total:= 0;
differencePer:= (weight - 1);//Forces it to an extended number for calculation at the next line
if((max - weightedNumber) > (weightedNumber - min)) then
begin
differencePer:= differencePer / (max - weightedNumber);
currentWeight:= weight - ((weightedNumber - min) * differencePer);
end else
begin
differencePer:= differencePer / (weightedNumber - min);
currentWeight:= 1;
end;
for i:= min to max do
begin
arrayOffset:= i - min;
Range[arrayOffset]:= currentWeight;//((arrayOffset) * currentWeight);
if(i=weightedNumber)then
begin
differencePer:= -1 * differencePer;
end;
total:= total + currentWeight;//Range[arrayOffset];
currentWeight:= currentWeight + differencePer;
end;
i:= round(total);
rand:= randomrange(0, i+1);
total:= 0;
i:= 0;
while((total < rand) and (i <(max-min)))do
begin
total:= total + Range[i];
Inc(i);
end;
if(i=0)then
begin
result:= min;
end else
result:= i-1+min;
end;
end;

procedure FreeEverything;
begin
SMART_ClearCanvas;
SMART_FreeDebug;
FreeDTM(BreadDTM)
end;

procedure Antiban;
begin
case random(100) of
1:PickUpMouse;
2:ExamineInv;
3:HoverSkill('random', False);
4:HoverSkill('thieving', False);
5:begin
BrakeMMouse(-50, -50, 0, 0);
RunSmartDebug('Slight afk off screen');
Wait(randomrange(5000,15000));
end;
6..99:LevelUp;//Doesn't do anything if you didn't level up.
end;
end;

procedure MiniBreak;
var
timeStarted: integer;
begin
RunSmartDebug('MiniBreak');
Inc(BreakCount);
if(BreakLength > 0)then
begin
if(not ImplementAfkBreaks)then
begin
logout;
end else
begin
BrakeMMouse(-50, -50, 0, 0);
end;
MarkTime(timeStarted);
repeat
SMART_DrawTextEx(True, 12, 250, LoginChars, ('Time Remaining: ' + MsToTime((TimeFromMark(timeStarted) - BreakLength), Time_Bare) + ' and break count is ' + IntToStr(BreakCount)), 13158600);
wait(1000);
until(TimeFromMark(timeStarted) > BreakLength);
end;
TimeToBreak:= GetSystemTime + (RandomRange(minutesTillBreakMin, minutesTillBreakMax) * 60000);
if((BreakCount mod MiniBreakCountBeforeLargeBreak) = 0)then
begin
BreakLength:= (RandomRange(longBreakLengthMin, longBreakLengthMax) * 60000);
end else
begin
BreakLength:= (RandomRange(BreakLengthMin, BreakLengthMax) * 60000);
end;
RunTextDebug('Time Script Started: ' + MsToTime(timeBegan, Time_Bare));
RunTextDebug('Time Method Started: ' + MsToTime(timeStarted, Time_Bare));
RunTextDebug('Time Current: ' + MsToTime(GetSystemTime, Time_Bare));
RunTextDebug('Time Till Break: ' + MsToTime(TimeToBreak, Time_Bare));
SMART_ClearCanvas;
LoginSetup;
end;

function GetLevel(Skill: Variant; var ExpLeft: integer): integer;
begin
ExpLeft:= XpTillNextLevel(Skill);
Result:= GetSkillInfo(Skill, True);
end;

procedure DetermineFoodLocations;
var
i: integer;
begin
for i:=1 to 28 do
begin
FoodLocations[i-1]:= False;
if(ExistsItem(i))then
begin
InvMouse(i, mouse_move);
if (IsUpText('Eat')) then
begin;
FoodLocations[i-1] := True;
end;
end;
end;
end;

procedure FailOutOfCode(message: String);
begin
If(not (LoggedIn)) then
begin
LogInSetup;
end else
begin
RunSmartDebug(message);
Disguise('Stopped');
WriteLn(message);
Logout;
TerminateScript;
end;
end;

procedure VerifySettings;
begin
if(minutesTillBreakMin > minutesTillBreakMax)then
begin
FailOutOfCode('The minimum time until the break cannot be longer than the maximum time until the break.');
end;
if(BreakLengthMin > BreakLengthMax)then
begin
FailOutOfCode('The minimum break length cannot be longer than the maximum break length.');
end;
if(StartBanditsAt < 25)then
begin
FailOutOfCode('You can''t pickpocket bandits when below level 25. Change the variable to 25 or greater.');
end;
if(StartGuardsAt < 40)then
begin
FailOutOfCode('You can''t pickpocket guards when below level 40. Change the variable to 40 or greater.');
end;
if(StartKnightsAt < 55)then
begin
FailOutOfCode('You can''t pickpocket knights when below level 55. Change the variable to 55 or greater.');
end;
if(StartWatchmenAt < 65)then
begin
FailOutOfCode('You can''t pickpocket watchmen when below level 65. Change the variable to 65 or greater.');
end;
if(StartPaladinsAt < 70)then
begin
FailOutOfCode('You can''t pickpocket paladins when below level 70. Change the variable to 70 or greater.');
end;
end;

procedure SetupTargetInformation(ThievingTarget: String);
var
lastMap: String;
begin
StealFrom:= ThievingTarget;
lastMap:= Target.RelatedMapName;
case ThievingTarget of
'Merchant': begin
Target.upText:= ['Pompous ', ' Merchant', 'omp', 'erch'];
Target.xpPerPickpocket:= 8;
Target.vision.hue:= 0.22;
Target.vision.sat:= 1.38;
Target.vision.color:= 13659714;
Target.vision.tolerance:= 23;
Target.vision.minSize:= 50;
Target.MapInUse:= False;
end;
'Bandit': begin
Target.upText:= ['Al ', ' Kharid ', ' Warrior', 'rid war'];
Target.xpPerPickpocket:= 26;
Target.vision.hue:= 0.18;
Target.vision.sat:= 0.50;
Target.vision.color:= 3889504;
Target.vision.tolerance:= 10;
Target.vision.minSize:= 50;
Target.LodestoneToThievingArea:= [Point(119, 79), Point(111, 80), Point(109, 89), Point(109, 98), Point(109, 107), Point(113, 114), Point(116, 120), Point(121, 127), Point(131, 130)];
Target.DeathWalkToThievingArea:= [Point(121, 127), Point(131, 130)];
Target.RelatedMapName:= 'AKLodestone';
Target.MapInUse:= True;
Target.XMin:= 130;
Target.XMax:= 144;
Target.YMin:= 108;
Target.YMax:= 149;
end;
'Guard': begin
Target.upText:= ['Guard', 'ard']; //Ardougne Guard
Target.xpPerPickpocket:= 47;//46.5
Target.vision.hue:= 0.04;
Target.vision.sat:= 0.15;
Target.vision.color:= 6629407;
Target.vision.tolerance:= 9;
Target.vision.minSize:= 15;
Target.LodestoneToThievingArea:= [Point(82, 90), Point(86, 97), Point(90, 103), Point(95, 109), Point(96, 113), Point(98, 118), Point(102, 122), Point(105, 128), Point(110, 136), Point(117, 141), Point(123, 144), Point(130, 150), Point(134, 155), Point(136, 160), Point(140, 169), Point(143, 176), Point(147, 184), Point(151, 192), Point(158, 204), Point(162, 208), Point(169, 214), Point(175, 218), Point(179, 226), Point(183, 230), Point(188, 236), Point(194, 243), Point(195, 249)];
Target.DeathWalkToThievingArea:= [Point(316, 251), Point(309, 251), Point(300, 251), Point(294, 251), Point(286, 250), Point(277, 250), Point(270, 252), Point(264, 255), Point(257, 255), Point(250, 253), Point(242, 253), Point(230, 253), Point(222, 253), Point(210, 253), Point(200, 250)];
Target.RelatedMapName:= 'ArdougneCity';
Target.MapInUse:= True;
Target.XMin:= 158;
Target.XMax:= 225;
Target.YMin:= 200;
Target.YMax:= 288;
{
Target.hue:= 0.16; //Falador guard if implemented as a switch option.
Target.sat:= 0.08;
Target.color:= 7040117;
Target.tolerance:= 13;
Target.minSize:= 50;
}
end;
'Knight': begin
Target.upText:= ['Knight ', ' Ardougne', 'night of ', 'dougn'];
Target.xpPerPickpocket:= 84;//84.3
Target.vision.hue:= 0.18;
Target.vision.sat:= 1.05;
Target.vision.color:= 13183581;
Target.vision.tolerance:= 13;
Target.vision.minSize:= 15;
Target.LodestoneToThievingArea:= [Point(82, 90), Point(86, 97), Point(90, 103), Point(95, 109), Point(96, 113), Point(98, 118), Point(102, 122), Point(105, 128), Point(110, 136), Point(117, 141), Point(123, 144), Point(130, 150), Point(134, 155), Point(136, 160), Point(140, 169), Point(143, 176), Point(147, 184), Point(151, 192), Point(158, 204), Point(162, 208), Point(169, 214), Point(175, 218), Point(179, 226), Point(183, 230), Point(188, 236), Point(194, 243), Point(195, 249)];
Target.DeathWalkToThievingArea:= [Point(316, 251), Point(309, 251), Point(300, 251), Point(294, 251), Point(286, 250), Point(277, 250), Point(270, 252), Point(264, 255), Point(257, 255), Point(250, 253), Point(242, 253), Point(230, 253), Point(222, 253), Point(210, 253), Point(200, 250)];
Target.RelatedMapName:= 'ArdougneCity';
Target.MapInUse:= True;
Target.XMin:= 158;
Target.XMax:= 225;
Target.YMin:= 200;
Target.YMax:= 288;
{ colors[0]:= 11346254; //purple
colors[1]:= 1845342; //red
colors[2]:= 7369078; //gray
tols[0]:= 16; //works for multi-colored, needs to be improved in speed though
tols[1]:= 8;
tols[2]:= 10;
counts[0]:= 10;
counts[1]:= 5;
counts[2]:= 15;
hues[0]:= 0.01;
hues[1]:= 0.03;
hues[2]:= 0.17;
sats[0]:= 0.72;
sats[1]:= 0.13;
sats[2]:= 0.06; }
end;
'Paladin': begin
Target.upText:= ['Paladin', 'aladin', 'din'];
Target.xpPerPickpocket:= 151;//151.75
Target.vision.hue:= 0.10;
Target.vision.sat:= 1.50;
Target.vision.color:= 14000590;
Target.vision.tolerance:= 24;
Target.vision.minSize:= 30;
Target.LodestoneToThievingArea:= [Point(82, 90), Point(86, 97), Point(90, 103), Point(95, 109), Point(96, 113), Point(98, 118), Point(102, 122), Point(105, 128), Point(110, 136), Point(117, 141), Point(123, 144), Point(130, 150), Point(134, 155), Point(136, 160), Point(140, 169), Point(143, 176), Point(147, 184), Point(151, 192), Point(158, 204), Point(162, 208), Point(169, 214), Point(175, 218), Point(179, 226), Point(183, 230), Point(188, 236), Point(194, 243), Point(195, 249)];
Target.DeathWalkToThievingArea:= [Point(316, 251), Point(309, 251), Point(300, 251), Point(294, 251), Point(286, 250), Point(277, 250), Point(270, 252), Point(264, 255), Point(257, 255), Point(250, 253), Point(242, 253), Point(230, 253), Point(222, 253), Point(210, 253), Point(200, 250)];
Target.RelatedMapName:= 'ArdougneCity';
Target.MapInUse:= True;
Target.XMin:= 158;
Target.XMax:= 225;
Target.YMin:= 200;
Target.YMax:= 288;
end;
'Watchmen': begin
Target.upText:= ['Watchm', 'atch', 'hman'];
Target.xpPerPickpocket:= 137;//.5
Target.LodestoneToThievingArea:= [Point(152, 229), Point(151, 237), Point(152, 243), Point(153, 254), Point(154, 263), Point(159, 272), Point(163, 278), Point(164, 287), Point(167, 294), Point(171, 303), Point(178, 309), Point(184, 312), Point(192, 315), Point(201, 317), Point(212, 318), Point(220, 318), Point(227, 319), Point(234, 321), Point(245, 322), Point(251, 322), Point(260, 323), Point(270, 323), Point(281, 325), Point(292, 325), Point(301, 325), Point(310, 325), Point(318, 325), Point(328, 325), Point(335, 325), Point(343, 325), Point(355, 325), Point(364, 324), Point(373, 324), Point(381, 326), Point(388, 326), Point(398, 324), Point(409, 324), Point(420, 320), Point(431, 318), Point(441, 319), Point(450, 321), Point(462, 321), Point(474, 322), Point(484, 320), Point(494, 320), Point(503, 319), Point(514, 317), Point(522, 313), Point(530, 305), Point(533, 294), Point(533, 281), Point(532, 269), Point(532, 256), Point(529, 244), Point(530, 233), Point(530, 219), Point(530, 208), Point(526, 195), Point(519, 185), Point(512, 177), Point(503, 169), Point(495, 160), Point(486, 151), Point(474, 145), Point(464, 144), Point(450, 143), Point(438, 142), Point(428, 142), Point(416, 143), Point(405, 143), Point(394, 143), Point(384, 143), Point(372, 143), Point(361, 143), Point(351, 144), Point(339, 144), Point(325, 145), Point(316, 145), Point(305, 145), Point(291, 145), Point(279, 142), Point(268, 142), Point(257, 142), Point(246, 143), Point(233, 142)];
Target.RelatedMapName:= 'Yanille';
Target.MapInUse:= True;
Target.vision.hue:= 0.02;
Target.vision.sat:= 0.13;
Target.vision.color:= 7614244;
Target.vision.tolerance:= 10;
Target.vision.minSize:= 10;
end;
else begin
FailOutOfCode(StealFrom + ' isn''t an option!');
end;
end;
if (lastMap<>Target.RelatedMapName)then
begin
sps_setup(runescape_other, [Target.RelatedMapName]);
end;
end;

procedure SetupVariables;
var
i: integer;
begin
TimeToBreak:= GetSystemTime + (RandomRange(minutesTillBreakMin, minutesTillBreakMax) * 60000);
TimeTillSixHourFix:= RandomRange(330, 358) * 60000;
MarkTime(LogTimer);
timeDone:= GetSystemTime + (minutesTillDone * 60000);
breakCount:= 0;
GoldEarned:= 0;
LastXpCount:= 0;
FailCount:= 0;
Reincarnate:= True;
SPS_Tolerance:= 450;
BreakLength:= (RandomRange(BreakLengthMin, BreakLengthMax) * 60000);
BreadDTM := DTMFromString('mlwAAAHicY2dgYDjDyMBwDYjvAvFlID4OxIeB+DQQGzExMKgBsSYQmwCxFRDrQsVSA/gYskP5gSYwYWBWIIkLM+LBUAAAJmAIzA==');
if(SmartDebug=True)then
begin
for i:=0 to (numDebugMessages-1) do
begin
DebugMessages[i]:= '';
end;
end;
if(not LetDie)then
begin
DetermineFoodLocations;
end;
TimeBegan:= GetSystemTime;
StartingXP:= GetXPBarTotal;
StartingLevel:= GetLevel(SKILL_THIEVING, XpToNext);
CurrentLevel:= StartingLevel;
if(StartingLevel >= StartPaladinsAt)then
begin
SetupTargetInformation('Paladin');
end else if(StartingLevel >= StartWatchmenAt)then
begin
SetupTargetInformation('Watchmen');
end else If(StartingLevel >= StartKnightsAt)then
begin
SetupTargetInformation('Knight');
end else if(StartingLevel >= StartGuardsAt)then
begin
SetupTargetInformation('Guard');
end else if(StartingLevel >= StartBanditsAt)then
begin
SetupTargetInformation('Bandit');
end else
begin
SetupTargetInformation('Merchant');
end;
end;

procedure DropBread;
var
x, y: integer;
begin
if(FindDTM(BreadDTM, x, y, MIX1, MIY1, MIX2, MIY2))then
begin
MMouse(x, y, 3, 3);
ClickMouse2(mouse_right);
WaitOption('rop', 1000);
x:=0;
y:=Invcount;
repeat
Inc(x);
wait(50);
until((x>100) or (InvCount <> y));
end;
end;

procedure EatFood;
var
i, x, y: integer;
ate: boolean;
begin
ate:= False;
for i:=1 to 28 do
begin
if(FoodLocations[i-1])then
begin
InvMouse(i, mouse_left);
FoodLocations[i-1] := False;
ate:= True;
Break;
end;
end;
if(FindDTM(BreadDTM, x, y, MIX1, MIY1, MIX2, MIY2))then
begin
MMouse(x, y, 3, 3);
ClickMouse2(mouse_left);
ate:= True;
end;
if(not ate and not LetDie)then
begin
FailOutOfCode('Ran out of food and low on health!');
end;
end;

procedure WaitUntilThere;
var
x: integer;
begin
x:=0;
repeat
Wait(randomrange(10,20));
Inc(x);
until((not IsMoving) or (x > 1000));
if(x>=1000)then
begin
FailOutOfCode('We never stopped moving.');
Exit;
end;
end;

procedure SearchSymbol(var count, x, y: integer; symbol: string);
begin
if(FindSymbol(x, y, symbol))then
begin
Inc(count);
end;
end;

procedure GoToDestination(mousex, mousey, ranx, rany: integer);
begin
RunSmartDebug('GoToDestination');
BrakeMMouse(mousex, mousey, ranx, rany);
ClickMouse2(mouse_left);
wait(1000+random(50));
WaitUntilThere;
end;

function Respawn: boolean;
var
x, y: integer;
begin
if(CountColor(0, MMX1, MMY1, MMX2, MMY2) > 15000)then
begin
BrakeMMouse(255, 308, 65, 6);
ClickMouse2(mouse_Left);
x:=0;
repeat
Inc(x);
wait(randomrange(10,20));
until((CountColor(0, MMX1, MMY1, MMX2, MMY2) < 5000) or (x > 300));
if(x>=300)then
begin
FailOutOfCode('Failed to respawn!');
end;
end else
Result:= True;
end;

function FindTarget(var x, y: integer; target: ColoredSection; upText: TStringArray): boolean;
var
tempCTS, i, atpaLen: integer;
ATPA : T2DPointArray;
TPA: TPointArray;
begin
tempCTS := GetColorToleranceSpeed; //set CTS
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(target.hue, target.sat);
FindColorsSpiralTolerance(MSCX, MSCY, TPA, target.color, MSX1, MSY1, MSX2, MSY2, target.tolerance); // finds all occurances of color with tolerance, spanning out from the main screen center.
SetColorSpeed2Modifiers(0.2, 0.2);
ColorToleranceSpeed(tempCTS);
ATPA := TPAToATPAEx(TPA, 25, 40); // LOOK HERE > TPAA now contains at least one 25x25 box formed from the TPointArray (TPA).
SortATPAFromMidPoint(ATPA, Point(MSCX, MSCY));
RunObjectDebug(ATPA);
atpaLen:= High(ATPA);
for i := 0 to atpaLen do //Loops through until it finds it
begin
If (GetArraylength(ATPA[i]) > target.minSize) Then //Similar to 'length'
Begin
MedianTPAEx(ATPA[i], x, y); //Finds the middle via averaging
BrakeMMouse(x, y, 3, 3);
If WaitUpTextMulti(upText, 400) Then
Begin
Result := True;
GetMousePos(x, y);
Break;
End;
End;
end;
end;

function CanDeathWalk(path: TPointArray): boolean;
begin
if(FindDead)then
begin
result:= sps_walkpath(path);
Exit;
end;
result:= false;
end;

function CanBlindWalk(x1, y1, x2, y2: integer): boolean;
var
x, y: integer;
begin
x:= WeightedRandom(x1, x2, 10, (x1+x2)/2);
y:= WeightedRandom(y1, y2, 10, (y1+y2)/2);
result:= SPS_BlindWalk(Point(x, y));
end;

procedure TeleportToTaverley(Teleport: boolean);
var
x, y, SymbolCount: integer;
begin
RunSmartDebug('TeleportToTaverley');
SymbolCount:= 0;
SearchSymbol(SymbolCount, x, y, 'water');
SearchSymbol(SymbolCount, x, y, 'portal');
SearchSymbol(SymbolCount, x, y, 'bar');
SearchSymbol(SymbolCount, x, y, 'lodestone');
SearchSymbol(SymbolCount, x, y, 'quest');
if(Teleport or (SymbolCount<= 2))then
begin
LodestoneTeleport('Taverley');
wait(randomrange(15500,16500));
end else
begin
GoToDestination(x, y, 4, 4);
end;
end;

function AKSymbolWalking: boolean;
var
SymbolCount, x, y1, y2: integer;
begin
SymbolCount:= 0;
SearchSymbol(SymbolCount, x, y1, 'lodestone');
SearchSymbol(SymbolCount, x, y2, 'water');
if((SymbolCount = 2) and (y1 < y2))then
begin
GoToDestination(x-10, y2, 4, 4);
Result:= True;
end
end;

procedure TeleportToAlKharid(Teleport: boolean);
var
x, y, SymbolCount: integer;
begin
RunSmartDebug('TeleportToAlKharid');
if ((not teleport) and (not sps_walkpath(target.LodestoneToThievingArea))) then
begin
if (not AKSymbolWalking) then
begin
Teleport:= True;
end;
end;
WaitUntilThere;
if(Teleport)then
begin
LodestoneTeleport('Al Kharid');
wait(randomrange(15500,16500));
end;
end;

procedure TeleportToArdougne(Teleport: boolean);
begin
RunSmartDebug('TeleportToArdougne');
if(Teleport or (not CanDeathWalk(target.DeathWalkToThievingArea))) then
begin
if (teleport or (not CanBlindWalk(target.XMin, target.YMin, target.xMax, target.ymax)))then
begin
LodestoneTeleport('Ardougne');
wait(randomrange(15500,16500));
if not sps_walkpath(target.LodestoneToThievingArea) then
begin
FailOutOfCode('Could not return to Ardougne thieving area');
end;
end;
end;
WaitUntilThere;
end;

procedure TeleportToYanille(Teleport: boolean);
var
Ladder: ColoredSection;
x, y: integer;
upText: TStringArray;
begin
RunSmartDebug('TeleportToYanille');
if(Teleport)then
begin
LodestoneTeleport('Yanille');
wait(randomrange(15500,16500));
if sps_walkpath(target.LodestoneToThievingArea) then
begin
WaitUntilThere;
upText:= ['Ladder', 'adder', 'add'];
Ladder.hue:= 0.03;
Ladder.sat:= 0.38;
Ladder.color:= 5532279;
Ladder.tolerance:= 21;
Ladder.minSize:= 20;
if(FindTarget(x, y, Ladder, upText))then
begin
ClickMouse2(mouse_left);
end;
end;
end;
WaitUntilThere;
end;

procedure ResetThievingPosition(Teleport: boolean);
begin
FindNormalRandoms;
case StealFrom of
'Merchant': begin
TeleportToTaverley(Teleport);
end;
'Bandit': begin
TeleportToAlKharid(Teleport);
end;
'Guard': begin
TeleportToArdougne(Teleport);
end;
'Knight': begin
TeleportToArdougne(Teleport);
end;
'Paladin': begin
TeleportToArdougne(Teleport);
end;
'Watchmen': begin
TeleportToYanille(Teleport);
end;
else begin
FailOutOfCode('You''re looking for something that doesn''t exist: ' + stealFrom);
end;
end;
end;

function ThievingWait: integer;
var
x: integer;
lastChat, chat: String;
begin
Result:= 0;
if (InFight)then
begin
Result:= 1;
end else if(GetMMLevels('hp', chat)=0)then
begin
Result:= 2;
x:=0;
repeat
Inc(x);
wait(randomrange(10,20));
until((GetMMLevels('hp', chat)>0) or (x > 400));
if(x>=400)then
begin
FailOutOfCode('Somehow died but did not respawn');
end;
end else begin
lastChat:= GetChatBoxText(8, clMessage);
if (pos(' coins have been added', lastChat) <> 0)then
begin
Result:= 3;
end else if (pos('t reach that', lastChat) > 0)then
begin
Result:= 4;
end;
end;
end;

function CalculateGoldStolen: integer;
var
money, chat: string;
x, Gold, i: integer;
begin
money:= '';
chat:= '';
for x:=8 downto 4 do//Iterating through all 4 handles not only first thieving attempt if no prior messages in chat all game, but also handles up to a quadruple steal.
begin
chat:= GetChatBoxText(x, clMessage);
if(pos(' coins have been added', chat) <> 0)then
begin
chat:= Replace(chat, ' coins have been added to your money pouch', '');
for i:=1 to (Length(chat) -1) do
begin
if(chat[i]=' ')then
begin
i:=Length(chat);
end else
begin
money:= money + chat[i];
end;
end;
RunTextDebug('New gold this steal: ' + money + '.');
try
Gold:= Gold + StrToInt(money);
except
FailOutOfCode('Money was actually: ' + money);//(IE: somehow not an integer)
end;
money:= '';
chat:= '';
end else
begin
break;
end;
end;
Result:= Gold;
end;

procedure AttemptSteal;
var
x, i, attempt: integer;
chat: String;
begin
ClickMouse2(mouse_right);
if(WaitOptionMulti(['pocket','ocke','ick'],1000))then
begin
wait(650);
x:= 0;
repeat
Inc(x)
wait(randomrange(10,20));
until(not ismoving or (x > 1000));
if(x >= 1000)then
begin
FailOutOfCode('Our isMoving detection failed somehow and claimed we were running for far longer than should be possible.');
end;
x:=0;
repeat
wait(randomrange(10,20));
Inc(x);
attempt:= ThievingWait;
until((attempt > 0) or (x > 200));
case attempt of
1:begin
if (GetMMLevels('hp', chat) < HealthToEat) then
begin
EatFood;
end;
x:=0;
repeat
if(x=0)then
begin
Antiban;
x:=1;
end;
wait(randomRange(10,20));
until(not InFight);
end;
2:begin
if(not Respawn)then
begin
FailOutOfCode('Respawning failed.');
end;
end;
3:begin
GoldEarned:= GoldEarned + CalculateGoldStolen;
end;
4:begin
ResetThievingPosition(false);
end;
end;
end;
end;

function FindMultiColors(colors, tols: TIntegerArray; hues, sats: TExtendedArray): TPointArray;
var
tempCTS, i: integer;
TPA, tempTPA: TPointArray;
begin
tempCTS:= GetColorToleranceSpeed;
ColorToleranceSpeed(2);
For i:= 0 to High(colors) do
begin
SetColorSpeed2Modifiers(hues[i], sats[i]);
if(FindColorsSpiralTolerance(MSCX, MSCY, tempTPA, colors[i], MSX1, MSY1, MSX2, MSY2, tols[i]))then
begin
TPA:= TPA+tempTPA;
tempTPA:= [];
end
end;
ColorToleranceSpeed(tempCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
Result:= TPA;
end;

function LimitMultiColoredATPA(startingATPA: Array of TPointArray; counts, colors, tols: TIntegerArray; hues, sats: TExtendedArray): Array of TPointArray;
var
finalATPA: Array of TPointArray;
temptTPA: TPointArray;
totalCount, tempCTS, i, j, k, colorsDone, colorCount: integer;
curCounts: TIntegerArray;
begin
setlength(curCounts, high(counts)+1);
tempCTS:= GetColorToleranceSpeed;
ColorToleranceSpeed(2);
colorCount:= high(colors);//This is called all the time otherwise.
for i:=0 to high(counts) do
begin
totalCount:= totalCount + counts[i];
end;
for i:=0 to high(startingATPA) do
begin
colorsDone:= 0;//Reset this value per TPA
if (totalCount < high(startingATPA[i]))then
begin
for j:=0 to high(startingATPA[i]) do
begin
for k:=0 to colorCount do
begin
SetColorSpeed2Modifiers(hues[k], sats[k]);
if((curCounts[k] < counts[k]) and (SimilarColors(colors[k], GetColor(startingATPA[i][j].x, startingATPA[i][j].y), tols[k]))) then
begin
Inc(curCounts[k]);
if(curCounts[k] = counts[k]) then
begin
Inc(colorsDone);
if(colorsDone >= (colorCount-1))then//Current TPA passes requirements.
begin
k:= colorCount;
j:= high(FinalATPA);//temp value
if(j < 0)then
j:= 0;
setLength(FinalATPA, (j+1));
FinalATPA[j]:= startingATPA[i];
j:= high(startingATPA[i]);
end;
end;
end;
end;
end;
end;
end;
ColorToleranceSpeed(tempCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
Result:= FinalATPA;
end;

function FindMultiColoredObject(var x, y: integer; colors, tols, counts: TIntegerArray; hues, sats: TExtendedArray; upText: TStringArray): boolean;
var
TPA: TPointArray;
ATPA, tempATPA: Array of TPointArray;
Center: TPoint;
i: integer;
begin
TPA:= FindMultiColors(colors, tols, hues, sats);
debugTPA(TPA, '');
tempATPA := TPAToATPAEx(TPA, 25, 40);
ATPA:= LimitMultiColoredATPA(tempATPA, counts, colors, tols, hues, sats);
RunObjectDebug(ATPA);
SortATPAFromMidPoint(ATPA, Point(MSCX, MSCY));
for i := 0 to high(ATPA) do //Loops through until it finds it
begin
MedianTPAEx(ATPA[i], x, y); //Finds the middle via averaging
BrakeMMouse(x, y, 3, 3);
if WaitUpTextMulti(upText, 400) Then
begin
Result:= True;
GetMousePos(x, y);
Break;
end;
end;
end;

procedure Steal;
var
x, y, i, startingTime: integer;
chat: String;
FoundTarget: boolean;
begin
RunSmartDebug('Steal: ' + StealFrom);
FoundTarget:= False;
MarkTime(startingTime);
repeat
findNormalRandoms;
if(FindTarget(x, y, Target.vision, Target.upText))then
begin
FoundTarget:= True;
AttemptSteal;
end;
if(InvFull)then
begin
for i:=0 to 5 do
begin
if(GetMMLevels('hp', chat) > (MaxHealth / 2))then
begin
DropBread;
end else
begin
EatFood;
wait(randomrange(1100,1300));
end;
end;
end;
until(TimeFromMark(startingTime) > 5000);//make sure at least 5 seconds of failure occurred.
Respawn;
if(not FoundTarget) then
begin
RunTextDebug('Did not find ' + StealFrom);
ResetThievingPosition(false);
end;
end;

procedure TryBreakOrFinish;
begin
if(ImplementBreaks and (TimeToBreak < GetSystemTime))then
begin
MiniBreak;
end;
if((EverFinish) and (TimeDone < GetSystemTime))then
begin
FailOutOfCode('Successfully completed your run!');
end;
if(GoalLevel <= CurrentLevel) then
begin
FailOutOfCode('Successfully reached your goal level!');
end;

if (TimeFromMark(LogTimer)>TimeTillSixHourFix) then//For some reason if (not loggedIn)then loginplayer; does not work for me
begin
SixHourFix;
ClickNorth(0);
MarkTime(LogTimer);
TimeTillSixHourFix:= RandomRange(330, 358) * 60000;
end;
end;

procedure ProgressReport(ThiefExp: LongInt; ThiefExpHr, GoldHr: integer);
begin
ClearDebug;
WriteLn('*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
WriteLn('*Kevin''s Beginner Thiever.');
WriteLn('*Time elapsed: ' + TimeRunning);
WriteLn('*We have gained ' + IntToStr(ThiefExp) + ' Thieving Experience! (' + IntToStr(ThiefExpHr) + ' per hour)');
WriteLn('*We have gained ' + IntToStr(CurrentLevel - StartingLevel) + ' levels. (start: ' + IntToStr(StartingLevel) + ', current: ' + IntToStr(CurrentLevel) + ') with ' + IntToStr(XpToNext) + 'xp to next!');
WriteLn('*We have successfully stolen ' + IntToStr(GoldEarned) + 'gp! (' + IntToStr(GoldHr) + 'gph)');
WriteLn('*Our next break will start in ' + MsToTime((TimeToBreak - GetSystemTime), Time_Bare));
if(EverFinish)then
begin
WriteLn('*Script will finish in ' + MsToTime((TimeDone - GetSystemTime), Time_Bare));
end;
WriteLn('*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
end;

procedure UpdateProgress;
var
ThiefExp: LongInt;
ThiefExpHr, TimeRan, GoldHour: integer;
begin
ThiefExp:= GetXpBarTotal - StartingXp;
if(ThiefExp < 0)then
ThiefExp:= LastXp;
LastXp:= ThiefExp;
XpToNext:= XpToNext - (ThiefExp - LastXpCount);
LastXpCount:= ThiefExp;
if(XpToNext <= 0)then
begin
CurrentLevel:= GetLevel(SKILL_THIEVING, XpToNext);
case CurrentLevel of
StartBanditsAt: begin
SetupTargetInformation('Bandit');
ResetThievingPosition(True);
end;
StartGuardsAt: begin
SetupTargetInformation('Guard');
ResetThievingPosition(True);
end;
StartKnightsAt: begin
SetupTargetInformation('Knight');
ResetThievingPosition(True);
end;
StartPaladinsAt: begin
SetupTargetInformation('Paladin');
ResetThievingPosition(True);
end;
StartWatchmenAt: begin
SetupTargetInformation('Watchmen');
ResetThievingPosition(True);
end;
end;
end;
TimeRan:= ((1 + GetSystemTime - TimeBegan) / 1000); //Seconds
ThiefExpHr:= Round((ThiefExp * 3600) / TimeRan);
GoldHour:= Round((GoldEarned * 3600) / TimeRan);
ProgressReport(ThiefExp, ThiefExpHr, GoldHour);
end;

begin
// Updater;
{$IFDEF SIMBAMAJOR980}
SMART_SERVER := 72;
SMART_MEMBERS := TRUE;
SMART_SIGNED := TRUE;
SMART_SUPERDETAIL := FALSE;
{$ELSE}
SRL_SixHourFix := TRUE;
SMART_FixSpeed := TRUE;
{$ENDIF}
SetUpSRL;
VerifySettings;
ActivateClient;
DeclarePlayers;
LoginSetup;
AddOnTerminate('FreeEverything');
SetupVariables;
ResetThievingPosition(True);

repeat
Steal;
UpdateProgress;
TryBreakOrFinish;
until(not LoginSetup);
FailOutOfCode('Logging back in failed. Sorry.');
end.

Justin

2013-03-07 00:18:10

Yes from me, Script is good, activity is good, seen you around on Skype Chat a lot.

Best of luck!

Justin

Gucci

2013-03-07 00:27:30

Yes from me.

DannyRS

2013-03-07 00:36:22

Voted yes, Best of luck!

If you want some feedback, watch out for begin end's where you only have one line following the if, same for case statements too, makes code look neater, but it's minor, everyone does it from time to time ;)

xtrapsp

2013-03-07 08:48:00

You came and played league with me and kane on a spare acc of ours and have been great at helping people… Obvious yes is obvious

Sin

2013-03-07 10:03:03

NO


But really, MIPS <3
Loved making subroutines for Psp games back in the day :)

Ian

2013-03-07 11:51:29

Definitely a yes, I like that you made your own functions when the existing ones weren't good enough. Also active on Skype and helpful on the forums :D

CynicRus

2013-03-07 12:15:17

Yes.

Benny

2013-03-07 17:30:20

Yes.

You've been awesome on Skype. Even though I reckon you hover toooooo much now ;) it's good to have you around and able to ask questions.

Good luck!

Hobbit

2013-03-07 20:04:01

Yes :)

Kevin

2013-03-07 20:40:36

Woo for all the yes's! Many thanks to everyone so far!

The Mayor

2013-03-07 20:50:05

Kevin seems like a nice, mature person. Always willing to share ideas on skype.

Script looks good, just those minor things mentioned already. Yes from me.


PS: thanks for the 7 levels :)

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*Kevin's Beginner Thiever.
*Time elapsed: 12 Minutes and 43 Seconds
*We have gained 864 Thieving Experience! (4456 per hour)
*We have gained 7 levels. (start: 1, current: 8) with 105xp to next!
*We have successfully stolen 303gp! (1562gph)
*Our next break will start in 02:50:21
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ashaman88

2013-03-07 21:47:01

From: The Mayor
Kevin seems like a nice, mature person. Always willing to share ideas on skype.

Script looks good, just those minor things mentioned already. Yes from me.


PS: thanks for the 7 levels :)

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*Kevin's Beginner Thiever.
*Time elapsed: 12 Minutes and 43 Seconds
*We have gained 864 Thieving Experience! (4456 per hour)
*We have gained 7 levels. (start: 1, current: 8) with 105xp to next!
*We have successfully stolen 303gp! (1562gph)
*Our next break will start in 02:50:21
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Read them members intro threads :)



Yes from me.

The Mayor

2013-03-07 21:57:07

From: Ashaman88
Read them members intro threads :)


Whoops, just read that I shouldn't vote for a couple of weeks :o.

Hobbit

2013-03-07 22:47:57

Obvious where this is going. Welcome :)