Simba Code:
(*
R_RangeGuilder
ver 1.0.4
Created by RISK
*)
program R_RangeGuilder;
{$i SRL/SRL/MISC/SMART.simba}
{$i SRL/SRL.simba}
{$i SRL/SRL/MISC/PAINTSMART.simba}
{$i SRL/SRL/MISC/DEBUG.simba}
{$i SPS/SPS.simba}
var
breakRounds, totalBreaks, competitionsDone, startingTickets,
expLastReport, comInc, compsLastReport, compsDone, startTickets,
curTickets, gained, expGained, expThisReport, comExp, comComps,
compsThisReport: Integer;
const
WORLD = 40; // What world do you wish to auto on? 0 = random
STATS_USER = ''; // What is your SRL stats username? Leave blank if you have none
STATS_PASS = ''; // What is your SRL stats password? Leave blank if you have none
ENABLE_BREAKS = True; // Do you want to enable taking breaks?
(* Ignore these settings if you aren't taking breaks *)
BREAK_IN = 35; // Break in how many minutes?
BREAK_FOR = 10; // Break for how many minutes?
RAND_IN = 5; // How many minutes in randomness on BREAK_IN?
RAND_FOR = 5; // How many minutes in randomness on BREAK_FOR?
(* *)
AUTO_RETALIATE = True; // True = On, False = Off
ENABLE_MOUSE_PAINT = True; // Do you want to have a paint trail behind the mouse?
ENABLE_DEBUG_MODE = False; // Do you want to enable debugging?
// This will disable debug clearing when making a progress report
(* Do not edit this segment *)
MIN_CLICK_WAIT = 0;
MAX_CLICK_WAIT = 1;
MIN_TARGET_WAIT = 2;
MAX_TARGET_WAIT = 3;
HOW_MANY_COMPS = 4;
CHECK_FOR_ARROWS = 0;
SCRIPT_VERSION = '1.0.4';
(* *)
procedure DeclarePlayers();
begin
HowManyPlayers := 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
with Players[0] do
begin
Name := ''; // What is your character's username?
Pass := ''; // What is your character's password?
LampSkill := SKILL_RANGE;
BoxRewards := ['xp', 'exp', 'emote', 'clothes', 'charms'];
Integers[HOW_MANY_COMPS] := 500; // How many competitions do you wish to do?
Booleans[CHECK_FOR_ARROWS] := False; // Disable this if you want to use your
// own arrows. Remember they must be bronze!
(* These settings are best to leave default, but you can edit them if you desire *)
// If you are experiencing a lot of misclicks, you can raise 'MIN_TARGET_WAIT'
// and 'MAX_TARGET_WAIT' to be customized to your lag and computer
// The same goes for MIN_CLICK_WAIT and MAX_CLICK_WAIT.
Integers[MIN_CLICK_WAIT] := 85;
Integers[MAX_CLICK_WAIT] := 125;
Integers[MIN_TARGET_WAIT] := 800;
Integers[MAX_TARGET_WAIT] := 1200;
(* Each of these settings I have adjusted to work well, in what I think, will be
good for everyone's purposes. But everyone has different computers and desire,
so if you truly wish to make the script faster in clicking and wait times or slower,
then you can modify the settings. Here is a short little 'Tutorial' on each
setting:
Remember, each of these options are in milliseconds. So 1000 is one second
and so on.
MIN_CLICK_WAIT = Minimum amount of time to wait before it clicks the target
again.
MAX_CLICK_WAIT = Maximum amount of time to wait before it clicks the target
again.
MIN_TARGET_WAIT = The minimum amount of time that the target screen is up before
it attempts to close it. This is to make sure it closes the target screen if it's
open for too long.
MAX_TARGET_WAIT = The maximum amount of time that the target screen is up before
it attempts to close it. This is to make sure it closes the target screen if it's
open for too long.
(* *)
Active := True;
end;
end;
(*
You do not need to and should not edit beyond this point.
*)
procedure Write(T: string);
begin
WriteLn(TheTime + ': ' + T);
end;
(*
BenLand's function, modified by Flight(?) to have a paint trail, re-modified
by RISK to disable the paint option completely if the user is not using SMART
*)
procedure WindMouse2(xs, ys, xe, ye, gravity, wind, minWait, maxWait, maxStep, targetArea: extended);
var
veloX, veloY, windX, windY, veloMag, dist, randomDist, lastDist, step: extended;
lastX, lastY: integer;
sqrt2, sqrt3, sqrt5: extended;
begin
sqrt2:= sqrt(2);
sqrt3:= sqrt(3);
sqrt5:= sqrt(5);
while hypot(xs - xe, ys - ye) > 1 do
begin
dist:= hypot(xs - xe, ys - ye);
wind:= minE(wind, 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;
if (maxStep < 3) then
begin
maxStep:= random(3) + 3.0;
end else
begin
maxStep:= maxStep / sqrt5;
end;
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));
step:= hypot(xs - lastX, ys - lastY);
wait(round((maxWait - minWait) * (step / maxStep) + minWait));
lastdist:= dist;
{$IFDEF SMART}
if (ENABLE_MOUSE_PAINT) then
SMART_DrawDotsEx(False, [Point(lastX, lastY)], clWhite);
{$ENDIF}
end;
if (Round(xe) <> Round(xs)) or (Round(ye) <> Round(ys)) then
MoveMouse(Round(xe), Round(ye));
end;
(*
Credits to Flight
*)
procedure HumanMMouse(eX, eY, ranX, ranY: Integer);
var
randSpeed: extended;
X,Y,X2,Y2,A,Dist,MP: integer;
begin
SMART_ClearCanvas;
A := MouseSpeed;
GetMousePos(X, Y);
Dist := Distance(X, Y, eX, eY);
MP := Round(Dist/150);
if MP < 0 then
MP := 1;
randSpeed := (random(MouseSpeed) / 2.0 + MouseSpeed) / 10.0;
X2 := RandomRange(eX-(A*MP), eX+(A*MP));
Y2 := RandomRange(eY-(A*MP), eY+(A*MP));
WindMouse2(X, Y, X2, Y2, 11, 8, 10.0 / randSpeed, 12.0 / randSpeed, 10.0 * randSpeed, 10.0 * randSpeed);
GetMousePos(X, Y);
MMouse(eX, eY, ranX, ranY);
MouseSpeed := A;
end;
procedure SetCTS(Hue, Saturation: Extended);
begin
SetColorToleranceSpeed(2);
SetColorSpeed2Modifiers(Hue, Saturation);
end;
procedure RevertCTS();
begin
SetColorSpeed2Modifiers(0.2, 0.2);
SetColorToleranceSpeed(1);
end;
procedure ExitPlayer(Message: string);
begin
Write(Message);
Players[CurrentPlayer].Active := False;
Logout;
end;
procedure RClickMM;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
// Mouses to the minimap and right clicks
MouseBox(MMX1, MMY1, MMX2, MMY2, MOUSE_RIGHT);
Wait(RandomRange(300, 400));
MouseBox(MSX1, MSY1, MSX2, MSY2, MOUSE_MOVE);
end;
procedure RClickChat;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (FindNPCChatText('.', Nothing)) then
Exit;
// Moves the mouse to the chat and right clicks
MouseBox(MCX1, MCY1, MCX2, MCY2, MOUSE_RIGHT);
Wait(RandomRange(200, 300)); // A random wait
MouseBox(MSX1, MSY1, MSX2, MSY2, MOUSE_MOVE);
end;
procedure RandomSpacebar;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (FindNPCChatText('.', Nothing)) then
Exit;
// Presses the spacebar
KeyDown(1);
Wait(RandomRange(75, 100));
KeyUp(1);
// Waits before backspacing
Wait(RandomRange(750, 1150));
// Backspaces to remove the space we have just typed
KeyDown(1);
Wait(RandomRange(300, 400));
KeyUp(1);
end;
(*
Credits to Kyle Undefined
*)
function RandomRangeEx(rFrom, rTo : Variant) : Variant;
var
r : Variant;
begin
r := RandomRange(Floor(rFrom), Ceil(rTo));
r := r + RandomE;
repeat
begin
if r <= rFrom then
r := r + RandomE
else if r >= rTo then
r := r - RandomE;
end;
until ((r >= rFrom) and (r <= rTo))
r := (Trunc(r * 100) / 100.00)
Result := r;
end;
// 33.0 ~ 46.7
procedure FixCompass();
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
MakeCompass(RandomRangeEx(33.0, 46.7));
end;
procedure AntiBan();
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
case (Random(375)) of
0 : RandomRClick;
1 :
begin
BoredHuman;
SetAngle(SRL_ANGLE_LOW);
end;
2 : ExamineInv;
3 :
begin
HoverSkill('Ranged', False);
Wait(RandomRange(4000, 7000)); // Random wait to 'View' the skill information
end;
4 : RClickChat;
5 : RClickMM;
6 .. 13 : RandomSpaceBar;
14 .. 39 : Wait(RandomRange(1000, 8000));
39 .. 70 : MouseSpeed := (RandomRange(10, 14));
end;
end;
function GetATPA(Col, Tol, W, H: Integer; Hue, Sat: Extended): T2DPointArray;
var
X, Y: Integer;
TPA: TPointArray;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
SetCTS(Hue, Sat);
FindColorsSpiralTolerance(X, Y, TPA, Col, MSX1, MSY1, MSX2, MSY2, Tol);
RevertCTS;
Result := (SplitTPAEx(TPA, W, H));
end;
// Updated 2/26/2012 - Added a maximum pixel limit along side the already in
// place minimum pixel limit to help with mousing over the judge instead of the
// guards
function R_MouseTPA(Text: string; Col, Tol, W, H: Integer; Hue, Sat: Extended): Boolean;
var
R, I, T, maxT, TT, maxTT: Integer;
P: TPoint;
ATPA: T2DPointArray;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
I := 0;
T := 0;
TT := 0;
maxT := (RandomRange(15000, 25000));
maxTT := (RandomRange(6500, 7500));
Result := False;
repeat
MarkTime(T);
repeat
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TimeFromMark(T) >= maxT) then
begin
Result := False;
Exit;
end;
ATPA := (GetATPA(Col, Tol, W, H, Hue, Sat));
if (Length(ATPA) > 0) then
Break;
Write('Object was not detected. Waiting.');
AntiBan;
Wait(RandomRange(500, 1500));
until(False);
MarkTime(TT);
// What to do if the length of ATPA is greater than 0
SortATPAFromFirstPoint(ATPA, Point(MSCX, MSCY));
if (ENABLE_DEBUG_MODE) then
DebugATPABounds(ATPA);
for I := 0 to High(ATPA) do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if ((Length(ATPA[I]) < 15) and (Length(ATPA[I]) > 40)) then
Continue;
P := (MiddleTPA(ATPA[I]));
HumanMMouse(P.X, P.Y, 5, 5);
Result := (WaitUpText(Text, RandomRange(750, 1500)));
if (Result) then
Break;
if (TimeFromMark(TT) >= maxTT) then
begin
Write('Max time passed. Let''s wait and try to find the object again.');
AntiBan;
Wait(RandomRange(500, 1500));
Break;
end;
Wait(RandomRange(450, 750));
end;
Inc(R);
until((Result) or (R >= (RandomRange(4, 6))) or (not(LoggedIn)));
end;
// Non CTS 2 version of R_MouseTPA
function R_MouseObj(Text: string; Col, Tol, W, H: Integer): Boolean;
var
X, Y, I, T, maxT: Integer;
P: TPoint;
TPA: TPointArray;
ATPA: T2DPointArray;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
I := 0;
T := 0;
maxT := (RandomRange(15000, 25000));
MarkTime(T);
repeat
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TimeFromMark(T) >= maxT) then
begin
Write('We were unable to find the object.');
Result := False;
Exit;
end;
FindColorsSpiralTolerance(X, Y, TPA, Col, MSX1, MSY1, MSX2, MSY2, Tol);
if (Length(TPA) > 0) then
Break;
Write('The object is not on the screen. Waiting.');
AntiBan;
Wait(RandomRange(500, 1500));
until(False);
// What to do if the length of TPA is greater than 0
ATPA := (TPAToATPAEx(TPA, W, H));
SortATPAFromFirstPoint(ATPA, Point(MSCX, MSCY));
if (ENABLE_DEBUG_MODE) then
DebugATPABounds(ATPA);
for I := 0 to High(ATPA) do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
P := (MiddleTPA(ATPA[I]));
HumanMMouse(P.X, P.Y, 5, 5);
Result := (WaitUpText(Text, RandomRange(850, 1500)));
if (Result) then
Break;
AntiBan;
Wait(RandomRange(250, 500));
end;
if (not(Result)) then
Write('We were unable to mouse the object.');
end;
// Point(2525, 2945), Point(2520, 2979)
// Updated 2/26/2012 thanks to Nebula's tip.
procedure SPS_FixPosition;
var
Path: TPointArray;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
Path := [Point(2525, 2945), Point(2520, 2979)];
if (SPS_WalkPath(Path)) then
begin
FixCompass;
SetAngle(SRL_ANGLE_LOW);
end else
ExitPlayer('SPS repositioning failed. Logging out.');
end;
// Created as the main method of fixing our position instead of SPS
procedure DTM_FixPosition;
var
X, Y, DTM, T, maxT: Integer;
E: Extended;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
T := 0;
maxT := (RandomRange(3000, 5000));
DTM := DTMFromString('mggAAAHicY2NgYLAAYi8gFgdiHgYIAPHVgVgAiLWgYiJALAXE1TU6DAnV2gypiaoM2SGODB1VgQx5fYYM/EA5bJgJiBmxYAgAAG0ICHo=');
MarkTime(T);
repeat
if (not(LoggedIn)) then
Exit;
FindNormalRandoms;
if (TimeFromMark(T) >= maxT) then
begin
Write('DTM repositioning failed. Let''s try SPS.');
FreeDTM(DTM);
SPS_FixPosition;
end;
Wait(RandomRange(75, 200));
until(FindDTMRotated(DTM, X, Y, MMX1, MMY1, MMX2, MMY2, - Pi / 4, Pi / 4, Pi / 60, E));
FreeDTM(DTM);
HumanMMouse(X, Y, 5, 5);
ClickMouse2(MOUSE_LEFT);
FFlag(5);
FixCompass;
end;
// Fixes the chats so that we can detect if we have a new competition or not
procedure FixChats;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
SetAllChats('All', 'Off', 'Off', 'Off', 'Off', 'Off', '');
end;
procedure HandleNoArrows;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (not(FindNPCChatText('standard', Nothing))) then
Exit;
ExitPlayer('We have run out of arrows to use.');
Exit;
end;
function TargetScreen(): Boolean;
begin
Result := (CountColorTolerance(4500223, MSX1, MSY1, MSX2, MSY2, 10) > 100);
end;
procedure CloseTargetScreen();
var
X, Y, DTM, I, T, maxT: Integer;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (not(TargetScreen)) then
Exit;
T := 0;
maxT := (RandomRange(150000, 250000));
DTM := DTMFromString('mbQAAAHicY2VgYHjKyMDwFojvQ+l7QKwJFDeEYmUoVpQRZeDk5IRj' +
'A01FBi6gODpmxILBAAA7xwas');
MarkTime(T);
while (TargetScreen) do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TimeFromMark(T) >= maxT) then
begin
FreeDTM(DTM);
ExitPlayer('We were unable to close the target screen.');
Exit;
end;
if (FindDTM(DTM, X, Y, MSX1, MSY1, MSX2, MSY2)) then
begin
HumanMMouse(X, Y, 3, 3);
if (not(WaitUpText('Close', RandomRange(500, 800)))) then
begin
FreeDTM(DTM);
Exit;
end;
ClickMouse2(MOUSE_LEFT);
for I := 0 to 5 do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (not(TargetScreen)) then
begin
FreeDTM(DTM);
Exit;
end;
Wait(RandomRange(500, 600));
end;
end;
end;
FreeDTM(DTM);
end;
procedure FireAtTargets();
var
minW, maxW, minC, maxC, I, maxI, T, TT, maxT, TTT, maxTTT, TTTT, maxTTTT: Integer;
startP, curP: TPoint;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
minW := (Players[CURRENTPLAYER].Integers[MIN_TARGET_WAIT]);
maxW := (Players[CURRENTPLAYER].Integers[MAX_TARGET_WAIT]);
minC := (Players[CURRENTPLAYER].Integers[MIN_CLICK_WAIT]);
maxC := (Players[CURRENTPLAYER].Integers[MAX_CLICK_WAIT]);
I := 0;
T := 0;
maxT := (RandomRange(150000, 250000));
TT := 0;
TTT := 0;
TTTT := 0;
maxTTTT := (RandomRange(4000, 6000));
maxTTT := (RandomRange(10000, 20000));
MarkTime(T);
MarkTime(TTTT);
repeat
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
HandleNoArrows;
if (TargetScreen) then
CloseTargetScreen;
if (TimeFromMark(T) >= maxT) then
begin
ExitPlayer('We were unable to fire at the targets.');
Exit;
end;
if (R_MouseObj('Fire-a', 5041405, 10, 10, 10)) then
Break;
if (TimeFromMark(TTTT) >= maxTTTT) then
begin
Write('We were unable to find any targets. We might be out of the area.');
DTM_FixPosition;
TTTT := 0;
maxTTTT := (RandomRange(4000, 6000));
MarkTime(TTTT);
AntiBan;
Wait(RandomRange(550, 850));
end;
Write('Unable to mouse over a target. Let''s wait.');
//if (not(CheckCompass))) then
// FixCompass;
AntiBan;
Wait(RandomRange(500, 1500));
until(False);
GetMousePos(startP.X, startP.Y);
MarkTime(TT);
repeat
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
GetMousePos(curP.X, curP.Y);
HandleNoArrows;
if (TimeFromMark(TT) >= maxT) then
begin
ExitPlayer('We were unable to fire at the targets.');
Exit;
end;
case (Random(30)) of
1 :
begin
GetMousePos(curP.X, curP.Y);
curP.X := (curP.X + Random(2));
curP.Y := (curP.Y + Random(2));
HumanMMouse(curP.X, curP.Y, 0, 0);
end;
2 :
begin
GetMousePos(curP.X, curP.Y);
curP.X := (curP.X - Random(2));
curP.Y := (curP.Y - Random(2));
HumanMMouse(curP.X, curP.Y, 0, 0);
end;
3 :
begin
GetMousePos(curP.X, curP.Y);
curP.X := (curP.X - Random(2));
curP.Y := (curP.Y + Random(2));
HumanMMouse(curP.X, curP.Y, 0, 0);
end;
4 :
begin
GetMousePos(curP.X, curP.Y);
curP.X := (curP.X + Random(2));
curP.Y := (curP.Y - Random(2));
HumanMMouse(curP.X, curP.Y, 0, 0);
end;
end;
// Checking to see if we have clicked to a different position
if (FindNPCChatText('meant', Nothing)) then
begin
Write('We have moved out of the shooting range. Repositioning.');
DTM_FixPosition;
end;
// Misclick handling
if (not(IsUpText('Fire-a')) and (not(TargetScreen))) then
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
HandleNoArrows;
Wait(RandomRange(500, 1500));
if (not(IsUpText('Fire-a')) and (not(TargetScreen))) then
if (not(R_MouseObj('Fire-a', 5041405, 10, 10, 10))) then
begin
DTM_FixPosition;
if (not(R_MouseObj('Fire-a', 5041405, 10, 10, 10))) then
begin
ExitPlayer('We have misclicked and we were unable to fix our position.');
Exit;
end;
end else
begin
GetMousePos(startP.X, startP.Y);
GetMousePos(curP.X, curP.Y);
end;
end;
// Target screen handling
if (TargetScreen) then
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
HandleNoArrows;
// We have this here to make sure the while .. do loop works properly
I := 0;
maxI := (RandomRange(minW, maxW));
MarkTime(TTT);
while (not(I >= maxI)) do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
// Randomizes the waiting time per 'loop-thru' of the fail-safe
maxI := (RandomRange(minW, maxW));
if (TimeFromMark(TTT) >= maxTTT) then
begin
ExitPlayer('Error in detecting the target screen.');
Exit;
end;
if (not(TargetScreen)) then
Break;
Wait(100);
IncEx(I, 100);
end;
if ((I >= maxI) and ((TargetScreen))) then
begin
Write('The target screen has been up for ' + ToStr(maxI) + ' second(s). Closing it.');
CloseTargetScreen;
HumanMMouse(startP.X, startP.Y, 5, 5);
end;
end;
// Over the maximum amount of distance from center of target handling
if (Distance(curP.X, curP.Y, startP.X, startP.Y) >= 10) then
begin
Write('Mouse is too far from the center of the target. Fixing it.');
HumanMMouse(startP.X, startP.Y, 5, 5);
end;
// Clicking handling
ClickMouse2(MOUSE_LEFT);
Wait(RandomRange(minC, maxC));
until(FindNPCChatText('Sorry', Nothing) or (not(LoggedIn)));
end;
function ArrowsEquipped: Boolean;
var
X, Y, DTM: Integer;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
DTM := DTMFromString('mbQAAAHicY2VgYJjIxMAwG4j7gbgTiGcC8Sug+AsgfgLEb4H4HRAbKCgwuKpzAllMYDpOmJeBH8hDx4xYMBgAAO7dCag=');
GameTab(26);
Result := (FindDTM(DTM, X, Y, MIX1, MIY1, MIX2, MIY2));
FreeDTM(DTM);
end;
procedure EquipArrows();
var
DTM, I, T, maxT: Integer;
P: TPoint;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
I := 0;
T := 0;
maxT := (RandomRange(15000, 25000));
DTM := DTMFromString('mbQAAAHicY2VgYJjIxMAwG4j7gbgTiGcC8Sug+AsgfgLEb4H4HRAbKCgwuKpzAllMYDpOmJeBH8hDx4xYMBgAAO7dCag=');
MarkTime(T);
repeat
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TimeFromMark(T) >= maxT) then
begin
FreeDTM(DTM);
ExitPlayer('There are no arrows in our inventory and none are equipped. - Perhaps a DTM failure.');
Exit;
end;
if (FindDTM(DTM, P.X, P.Y, MIX1, MIY1, MIX2, MIY2)) then
begin
HumanMMouse(P.X, P.Y, 3, 3);
if (WaitUpText('ze ar', RandomRange(750, 1500))) then
begin
ClickMouse2(MOUSE_LEFT);
for I := 1 to 5 do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (not(FindDTM(DTM, P.X, P.Y, MIX1, MIY1, MIX2, MIY2))) then
begin
Write('We have equipped the arrows.');
FreeDTM(DTM);
Exit;
end;
Wait(RandomRange(100, 400));
end;
end;
end;
Write('There are no arrows in our inventory.');
AntiBan;
Wait(RandomRange(750, 1500));
if (ArrowsEquipped) then
begin
Write('We already have arrows equipped.');
Break;
end;
until(False);
FreeDTM(DTM);
end;
// Remade 2/24/2012 to make it less 'One shot'
// Modified 2/26/2012 - Removed some of the getting a new competition checks
// due to my new obtained knowledge that you don't need to click the green
// button or do anything after that to start a new competition. I'm sorry for
// including it in the first place, I was unaware of this.
procedure GetCompetition();
var
T, TT, TTT, maxT, maxTT, maxTTT, X, Y, iTR, cTR: Integer;
B, BB: Boolean;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
maxT := (RandomRange(60000, 65000));
maxTT := (RandomRange(4000, 5000));
T := 0;
TT := 0;
TTT := 0;
iTR := 0;
cTR := 0;
B := False;
BB := False;
MarkTime(T);
MarkTime(TT);
repeat
repeat // Attempts to mouse and interact with the judge
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TargetScreen) then
CloseTargetScreen;
// Exits the character if we are unable to get a new competition
if (TimeFromMark(T) >= maxT) then
begin
ExitPlayer('We were unable to get a new competition.');
Exit;
end;
// Fixes the position of our character if we are unable to see the judge
if (TimeFromMark(TT) >= maxTT) then
begin
Write('We might be unable to see the judge. Let''s fix our location.');
DTM_FixPosition;
TT := 0;
maxTT := (RandomRange(4000, 5000));
AntiBan;
Wait(RandomRange(500, 850));
end;
if (R_MouseTPA('Judge', 6906979, 9, 15, 15, 0.31, 0.08)) then
begin
ClickMouse2(MOUSE_RIGHT);
maxTTT := (RandomRange(1500, 2000));
MarkTime(TTT);
// Waits for the option that the judge always has upon right click to show
while (not(OptionsExist(['k-to Comp'], False))) do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
if (TimeFromMark(TTT) >= maxTTT) then
Break;
Write('Judge options not detected. Waiting.');
Wait(100);
end;
if ((TimeFromMark(TTT) >= maxTTT) and (not(OptionsExist(['k-to Comp'], False)))) then
begin
Write('We might have moused over the wrong object. Trying again.');
Continue;
end;
if (not(WaitOption('ete Comp', RandomRange(850, 1250)))) then
begin
Write('We have a competition already.');
Exit;
end;
Break; // Breaks out of the first repeat .. until to complete the procedure
end;
Write('Waiting for the object to be on the screen.');
AntiBan;
Wait(RandomRange(500, 1500));
until(False);
// Handles waiting for the pay confirmation dialogue to appear
for iTR := 1 to 5 do
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
B := (FindText(X, Y, '1', StatChars, MCX1, MCY1, MCX2, MCY2));
if (B) then
Break;
Write('Waiting for the pay confirmation dialogue to show.');
Wait(RandomRange(750, 1250));
end;
// Continues if we have timed out after waiting for the pay confirmation dialogue
if ((iTR >= 5) and (not(B))) then
Continue;
// Handles clicking 'Yes' for the pay confirmation dialogue
// We use MMouse here instead of HumanMMouse as HumanMMouse does not look
// like a human would when choosing a dialoge option.
MMouse(X, Y, 25, 7);
ClickMouse2(MOUSE_LEFT);
if (B) then
begin
Write('We have started a new competition!');
Exit;
end;
until(False);
end;
procedure StartGame();
var
Checking: Boolean;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
Checking := (Players[CURRENTPLAYER].Booleans[CHECK_FOR_ARROWS]);
GetCompetition;
if (Checking) then
EquipArrows;
end;
function TicketAmount: Integer;
var
DTM: Integer;
begin
if (not(LoggedIn)) then
Exit;
if (FindNormalRandoms) then
SetAngle(SRL_ANGLE_LOW);
DTM := DTMFromString('mbQAAAHicY2VgYMhlYmAoBeJ8IE4E4mQglmZkYJABYnUgVgZicSDOa4sEqmZCwfxAEh0zYsFgAABgUwRn');
GameTab(25);
Result := (ItemAmount('inv', 'dtm', DTM, []));
FreeDTM(DTM);
end;
// Five minute report
procedure ProgressReport;
var
XPH, CPH: Integer;
timeRan: string;
begin
if (not(ENABLE_DEBUG_MODE)) then
ClearDebug;
compsDone := (competitionsDone);
timeRan := (MSToTime(GetTimeRunning, Time_Bare));
startTickets := (startingTickets);
curTickets := (TicketAmount);
gained := (curTickets - startTickets);
expGained := (Gained * 5);
// Borrowed from Nebula's Range Guilder
CPH := (Round((competitionsDone) * 3600) / ((GetTimeRunning) / 1000));
XPH := (Round(gained * 5 * 3600) / ((GetTimeRunning) / 1000));
WriteLn('__________________________');
WriteLn('');
WriteLn(' RISK''s Range Guilder');
WriteLn(' Script version: ' + SCRIPT_VERSION);
WriteLn(' Time ran: ' + timeRan);
WriteLn(' Competitions done: ' + ToStr(compsDone));
WriteLn(' Competitions/h: ' + ToStr(CPH));
WriteLn(' Tickets gained: ' + ToStr(gained));
WriteLn(' EXP gained: ' + ToStr(expGained));
WriteLn(' EXP/h: ' + ToStr(XPH));
WriteLn('__________________________');
end;
// Created by Echo_, modified by Flight
function BreakHandler(BreakIn, BreakFor, randBreakIn, randBreakFor: Integer): Boolean;
var
realTime, w, x, y, z: Integer;
begin
if not LoggedIn then
Exit;
w := (BreakIn * 60000);
x := (BreakFor * 60000);
y := RandomRange(-randBreakIn * 60000, randBreakIn * 60000);
z := RandomRange(-randBreakFor * 60000, randBreakFor * 60000);
realTime := ((x + z) / 60000);
if (HowManyPlayers = 1) then
begin
if (GetTimeRunning < ((w) + (y) + BreakRounds)) then Exit
else
if (GetTimeRunning > ((w) + (y) + BreakRounds)) then
begin
Writeln('Taking a break for about ' + IntToStr(realTime) + ' minutes.');
Logout;
Wait((x) + (z));
Writeln('Logging in.');
LoginPlayer;
Result := LoggedIn;
FindNormalRandoms;
IncEx(BreakRounds, (w) + (x));
IncEx(TotalBreaks, 1);
Writeln('The next break will occur in about ' + IntToStr(realTime) + ' minutes.');
end;
end;
if (HowManyPlayers > 1) then
begin
if (GetTimeRunning < ((w) + (y) + BreakRounds)) then Exit
else
if (GetTimeRunning > ((w) + (y) + BreakRounds)) then
begin
Writeln('Taking a break for about ' + IntToStr(BreakFor) + ' minutes.');
Logout;
IncEx(BreakRounds, (w));
IncEx(TotalBreaks, 1);
NextPlayer(True);
Exit;
while (LoggedIn) do
Wait((x) + (z));
NextPlayer(True);
end;
end;
end;
procedure MainLoop();
var
T, TT, maxComps: Integer;
begin
repeat
maxComps := (Players[CURRENTPLAYER].Integers[HOW_MANY_COMPS]);
competitionsDone := 0;
comInc := 0;
startingTickets := (TicketAmount);
MarkTime(T);
MarkTime(TT);
FixChats;
Retaliate(AUTO_RETALIATE);
repeat
Inc(competitionsDone);
StartGame;
Wait(RandomRange(300, 500));
FireAtTargets;
Wait(RandomRange(300, 500));
AntiBan;
// Stat reporting & 5 minute debug report
if (TimeFromMark(T) >= 300000) then
begin
ProgressReport;
compsDone := (competitionsDone);
startTickets := (startingTickets);
curTickets := (TicketAmount);
gained := (curTickets - startTickets);
expGained := (Gained * 5);
// Stat committing is now in the main loop as 1.0.4 to test if it works
expThisReport := (expGained);
compsThisReport := (compsDone);
if (not(comInc = 0)) then
begin
comExp := (expThisReport - expLastReport);
comComps := (compsThisReport - compsLastReport);
end else
begin
comExp := (expThisReport);
comComps := (compsThisReport);
end;
expLastReport := (expThisReport);
compsLastReport := (compsThisReport);
stats_IncVariable('Ranged EXP (Gained)', comExp);
stats_IncVariable('Total EXP Gained', comExp);
stats_IncVariable('Competitions Done', comComps);
if (stats_Commit) then
Write('We have committed stats to SRL stats!');
Inc(comInc);
T := 0;
end;
// Breaking
if (ENABLE_BREAKS) then
if (BreakHandler(BREAK_IN, BREAK_FOR, RAND_IN, RAND_FOR)) then
begin
FixCompass;
SetAngle(SRL_ANGLE_LOW);
end;
until((competitionsDone >= maxComps) or (not(LoggedIn)));
ExitPlayer('');
Write('If you have encountered an error, please enable debug mode in the script setup and rerun the script.');
Write('Thank you!');
until((AllPlayersInactive));
end;
procedure Setup();
begin
SMART_Server := WORLD;
SMART_Members := True;
AddOnTerminate('ProgressReport');
SetupSRL;
SetupSRLStats(836, STATS_USER, STATS_PASS);
SPS_Setup(RUNESCAPE_SURFACE, ['6_7']);
MouseSpeed := (RandomRange(10, 12));
DeclarePlayers;
LoginPlayer;
SetAngle(SRL_ANGLE_LOW);
ClearDebug;
FixCompass;
MainLoop;
end;
begin
Setup;
end.