tom jr has reported a post.
Reason:
Forum: RuneScape 2 Cheating
Assigned Moderators: stevenadrien2, Covey
Posted by: bjara
Original Content:
Reason:
Post: yew chopper and bankerThis probably belongs in the SCAR/Runescape scripts forum.
Forum: RuneScape 2 Cheating
Assigned Moderators: stevenadrien2, Covey
Posted by: bjara
Original Content:
this has anti-random and anti-ban,
enjoy:nuts:
{*********** <<--Shuttleu-->> ***********
Ultra Chop n Bank
V1.71
Requires Scar 3.15b & SRL 20
Description
Chops the yews just south of edgeville and then banks them.
Chops the Magic Tree near the Tree Gnome Stronghold
and either a Magic or Yew Tree in your Farming Tree Patch Bank
Deals with all currently solvable randoms & has
an efficient Anti-Ban system.
Chop Yew Trees West of Catherby and Banks Them.
Instructions
Fill in all relevant options below. Make sure
windows display settings are set to 32bit, put
axe anywhere in your backpack or hand, make sure
your players are in the Edgeville, Tree Gnome
Stronghold or Catherby Bank.
and run the script. Simple! Enjoy
valid location arguments are as follows :
CY - If you type CY you place your player in Catherby bank for chopping yews (Members)
E - If you type E you place your player in Edgevile bank for chopping yews
SM - If you type SM you place you player in Tree Gnome Stronghold bank for cutting magic trees (Members)
*********** <<--Shuttleu-->> ***********}
program Ultra_Cut_n_Bank;
{.include SRLSRL.scar}
{.include SRLSRLskillWoodCutting.scar}
{.include srl/srl/misc/users.scar}
const
{*******************************************************************************
Enter Options & Your Details Here
*******************************************************************************}
{******************* Overall Maximum Values (Not per player) *******************
************** Script finishes when any max limit has been reached. ************
***************************** enter 0 for infinite ****************************}
TMaxLoads = 0; // Enter the total number of loads to bank.
TMaxLogs = 0; // Enter the total number of yews to chop.
TMaxTime = 0; // Enter the total time to run in minutes.
TMaxXp = 0; // Enter the total amount of XP you want to earn.
{************************** Maximum Values per player **************************
************** Player finishes when any max limit has been reached. ************
***************************** enter 0 for infinite ****************************}
PMaxLoads = 0; // Enter the number of loads to bank per player.
PMaxLogs = 0; // Enter the number of yews to chop per player.
PMaxTime = 0; // Enter the time to run in minutes per player.
PMaxLevel = 0; // Enter Woodcutting Level you wish each player to achieve.
PMaxXp = 0; // Enter the amount of XP you want each player to earn.
{***************************** Change Player after *****************************
********** Player will bank and change when any value has been reached. ********
**************************** default value are best ****************************
***************************** enter 0 for infinite ****************************}
SessLoads = 0; // Change player when loads banked has been reached.
SessTime = 0; // Change player when time in minutes has been reached.
SleepTime = 0; // Time in minutes you want to wait beween players logging out and in.
{********************************** SRL Stats **********************************
***** SRL Stats records information about how many logs cut, loads banked *****
***** randoms solved etc *****
***** Sign-Up for your SRL Stats ID Here: www.stats.srl-forums.com *****
***** this is not the same as your SRL Forums Username or Password *****
*******************************************************************************}
SRL_ID = '2529'; // Your SRL Stats ID (Not Username) it is 4 numbers
SRL_PASS = 'GwpefLrGMa'; // Your SRL Stats Password (If you do not have an ID or Password leave Blank)
{**************************** Miscellaneous Options ***************************}
DebugOn = false; // true to enable dedug mode (saves screenshots in SCAR dir when things go wrong)
HideScar = 'NAV32'; // Enter the name of any program you want SCAR to disguise itself as.
SaveDebugFile = True; // Do you want the script to save the progress report?
{*******************************************************************************
* Do not alter anything in this section unless you really know what your doing *
* Move on and enter the Players Details, you will then be ready to start. *
*******************************************************************************}
BankCashierColour = 195836; // Colour of Bank Cashier in Mini Map. The Yellow Dot. You Should not have to change this.
UCBversion = 'V1.73'; // Version of this script
var
locations, code: Array of String;
NestSeedDTM, NestRingDTM, NestEggDTM, YewDTM, MagicDTM: integer;
FirstDeposit, x, y: integer;
CIBReason, DumpVar, VerKey, curentver: String;
KeepPlayer, CIBTrue, bank: boolean;
{*******************************************************************************
* Thats it all options have been set you may now Start the Script! *
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
* Do not alter anything in below here unless you really know what your doing *
*******************************************************************************}
{*******************************************************************************
function CoordsToDegrees(x, y: integer): integer;
By: PriSoner
Description: Returns the direction in degrees (0 to 359) to a set of coordinates
relative to your players position on the screen and North.
(degrees are in reverse to the convention to stay compatible with
MakeCompass etc i.e. 0 = N, 90 = W, 180 = S & 270 = E)
*******************************************************************************}
function CoordsToDegrees(x, y: integer): integer;
var d: double;
begin
x := x - 260;
y := y - 160;
d := ArcTan2(y, x) * (180 div Pi) + 90;
if d < 0 then d := d + 360;
result := round(abs(d - 360) + rs_GetCompassAngleDegrees);
if result >= 360 then result := result - 360;
end;
procedure SaveDebug;
var FileNum: integer;
begin
if not SaveDebugFile then
Exit;
FileNum := RewriteFile(ScriptPath+'ultra cut n bank Proggy.txt',True);
if( FileNum < 0 )then
WriteLn('@@@ Error with save: File Error.');
WriteFileString(FileNum, GetDebugText);
CloseFile(FileNum);
end;
function ItemCoordsDtm(area: string; dtm: Integer): TPointArray;
var
startx, starty, rowsize, colsize, colnumber, rownumber, col, row: Integer;
x1, y1, x2, y2: Integer;
itemx, itemy: Integer;
i: Integer;
begin
SetArrayLength(Result, 0);
if (CheckArea(area)) then
begin
AreaInfo(area, startx, starty, rowsize, colsize, colnumber, rownumber);
for row := 0 to rownumber - 1 do
for col := 0 to colnumber - 1 do
begin
x1 := startx + col * colsize;
y1 := starty + row * rowsize;
x2 := x1 + colsize;
y2 := y1 + rowsize;
if (FindDTM(dtm, itemx, itemy, x1, y1, x2, y2)) then
begin
i := GetArrayLength(Result);
SetArrayLength(Result, i + 1);
Result.x := x1;
Result.y := y1;
end;
end;
end;
end;
function Banking(Location: String): Boolean;
var
x, y, i, l, c, z: Integer;
Info: TIntegerArray;
Booths, t: TPointArray;
begin
Wait(400);
case LowerCase(Location) of
'cb', 'catherby': Info := [MSCX, MSCY, 737623, 5, 1];
else
begin
srl_Warn('Banking', 'Unknown bank: '+Location, warn_AllVersions);
Exit;
end;
end;
MakeCompass('n');
SetAngle(true);
z := GetColorToleranceSpeed;
ColorToleranceSpeed(Info[4]);
FindColorsSpiralTolerance(Info[0], Info[1], Booths, Info[2], MSX1, MSY1, MSX2, MSY2, Info[3]);
ColorToleranceSpeed(z);
SetArrayLength(t, 0);
t := Booths;
SetArrayLength(Booths, 0);
Booths := ReArrangeAndShortenArray(t, 14);
l := GetArrayLength(Booths) -1;
for i := 0 to l do
begin
if (not LoggedIn) or BankScreen or PinScreen then
Break;
MMouse(Booths.X, Booths.Y, 3, 3);
Wait(75 + Random(75));
if IsUpText('ooth') Then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, False);
Wait(70 + Random(75));
if ChooseOption('uickly') then
begin
FFLag(0);
MarkTime(c);
repeat
Wait(100);
until (BankScreen) or (PinScreen) or (TimeFromMark(c) > 3000);
if (Length(Players) > 0) then
if (Players[CurrentPlayer].Pin <> '') then
InPin(Players[CurrentPlayer].Pin);
end;
end;
end;
Result := (BankScreen) or (PinScreen);
end;
function CountItemsDtm(area: string; dtm: Integer): Integer;
var
coords: TPointArray;
begin
coords := ItemCoordsDtm(area, dtm);
Result := GetArrayLength(coords);
end;
{*******************************************************************************
procedure MakeCompassCoords(x, y: integer);
By: PriSoner
Description: Moves Compass so that target x & y coordinates are directly north
of your player.
*******************************************************************************}
procedure MakeCompassCoords(x, y: integer);
begin
MakeCompass(IntToStr(CoordsToDegrees(x, y)));
end;
{*******************************************************************************
function DigitGroup(MyNumber: integer) string;
By: PriSoner
Description: Formats an integer into groups of 3 seperated by commas and returns
a formatted string. i.e "1234567" would become "1,234,567".
I know there is probably an easier way of doing this and probably
an existing function. i just can not remember it!
*******************************************************************************}
function DigitGroup(MyNumber: integer): string;
var b: integer;
a, c: string;
begin
a := IntToStr(MyNumber);
b := length(a) + 1;
c := ',';
if b > 4 then
repeat
b := b - 3;
if b > 1 then insert(c, a, b);
until b < 3;
result := a;
end;
{*******************************************************************************
function Find2TPApoints(TPA1, TPA2: TPointArray; w, h: Integer): TPointArray;
By: PriSoner
Description: Small function to find two points within different TPA arrays that
fall within a defined distance from each other.
Returns the mid value between every pair of points that match.
TPA1: First TPoint Array
TPA2: Second TPoint Array
w: Width (Maximum Distance points can be apart on the x axis)
h: Height(Maximum Distance points can be apart on the y axis)
*******************************************************************************}
function Find2TPApoints(TPA1, TPA2: TPointArray; w, h: Integer): TPointArray;
var i1, i2, l1, l2, r: LongInt;
begin
l1 := High(TPA1);
l2 := High(TPA2);
r := 0;
for i1 := 0 to l1 do
begin
for i2 := 0 to l2 do
begin
if (ABS(TPA1[i1].x - TPA2[i2].x) <= w) and (ABS(TPA1[i1].y - TPA2[i2].y) <= h) then
begin
Inc(r);
SetLength(Result, r + 1);
result[r].x := ((TPA1[i1].x + TPA2[i2].x) div 2);
result[r].y := ((TPA1[i1].y + TPA2[i2].y) div 2);
end;
end;
end;
end;
{*******************************************************************************
function CheckAxe: boolean;
By: PriSoner
Description: Small function to check if part of the phrase:
You do not have an axe which you have the woodcutting level to use.
is present as the last black message in the chat box. It does this
as it is quicker and less system intensive than parsing for dtms
or bitmaps. Use this function immediately after clicking a tree.
Returns True if Axe is Present and False if No Axe is Present.
*******************************************************************************}
function CheckAxe: boolean;
begin
if Pos('an axe', GetBlackChatMessage) = 17 then
begin
writeln('You do not have a suitable axe....');
result := false;
end else result := true;
end;
{*******************************************************************************
procedure EndAllPlayers;
By: PriSoner
Description: Sets all players to inactive.
*******************************************************************************}
procedure EndAllPlayers;
var i: integer;
begin
for i := 0 to Length(Players) - 1 do
begin
Players.Active := false;
end;
end;
{*******************************************************************************
function FindObjOld(var cx, cy: Integer; Text: String; color, tolerance: Integer): Boolean;
By: Stupid3ooo and modified by Ron.
Description: Finds Object.
*******************************************************************************}
function FindObjOld(var cx, cy: Integer; Text: string; color, tolerance: Integer): Boolean;
var
a, c, i, x1, y1, x2, y2: Integer;
begin
x1 := 245;
y1 := 165;
x2 := 277;
y2 := 185;
repeat
if (not (Loggedin)) then
Break;
a := a + 1;
if (a = 1) or (a = 3) then
c := c + 1;
for i := 1 to c do
begin
if (a = 1) then
begin
x1 := x1 + 30;
x2 := x2 + 30;
end else
if (a = 2) then
begin
y1 := y1 - 20;
y2 := y2 - 20;
end else
if (a = 3) then
begin
x1 := x1 - 30;
x2 := x2 - 30;
end else
if (a = 4) then
begin
y1 := y1 + 20;
y2 := y2 + 20;
end;
if (x1 = 485) and (x2 = 517) then
x2 := x2 - 2;
if (y1 = 325) and (y2 = 345) then
y2 := y2 - 7;
if (x2 > 515) then
Break;
if (FindColorTolerance(cx, cy, color, x1, y1, x2, y2, tolerance)) then
begin
MMouse(cx, cy, 0, 0)
Wait(50+Random(50));
if (IsUpText(Text)) then
begin
Result := True;
Break;
end;
end;
end;
if (a = 4) then
a := 0;
until (x2 > 515) or (Result = True);
end;
{*******************************************************************************
function MyFindBirdsNest: boolean;
By: Prisoner
Description: Attempts to a Find Birds Nest if one is dropped & Pick it up.
If it can not find one within 90 seconds it exits as Fallen Birds
Nests do not last that long. beta version Records a failure to
find the birds nest.
*******************************************************************************}
function MyFindBirdsNest: boolean;
var OriginalDegrees, NewDegree, StartFBN, x, y, i, ctab: Integer;
b: boolean;
begin
if not LoggedIn then exit;
if Pos('nest falls', GetBlackChatMessage) = 10 then
begin
b := false;
result := true;
writeln('Birds Nest Drop Detected. Attempting To Find It...');
MarkTime(StartFBN);
SetAngle(true);
OriginalDegrees := Round(rs_GetCompassAngleDegrees);
NewDegree := OriginalDegrees;
ctab := GetCurrentTab;
repeat
if (FindObjOld(x, y, 'Take Bird', 3623505, 6)) then
begin
WriteLn('Birds Nest Found. Picking Up...');
Mouse(x, y, 1, 1, True);
Flag;
Wait(500 + Random(500));
Birdsnest := Birdsnest + 1;
GameTab(4);
SetAngle(true);
MakeCompass(IntToStr(OriginalDegrees));
GameTab(ctab);
for i := 1 to 5 do
begin
Mouse(575, 225, 3, 3, False);
Wait(300 + Random(500));
ChooseOption('xamine');
Wait(1000 + Random(1000));
if Pos('nest falls', GetBlackChatMessage) <> 10 then exit;
end;
SRLRandomsReport;
exit;
end else
begin
if b then
begin
SetAngle(false);
b := false;
end else
begin
SetAngle(True);
NewDegree := (NewDegree + 25 + Random(30));
MakeCompass(IntToStr(NewDegree));
b := true;
end;
end;
until TimeFromMark(StartFBN) > 90000;
WriteLn('Birds Nest Not Found Within Required Time. Aborting...');
MakeCompass(IntToStr(OriginalDegrees));
SetAngle(True);
GameTab(ctab);
for i := 1 to 28 do
begin
if ExistsItem(i) then
begin
MMouseItem(i);
GetMousePos(x, y);
Mouse(x, y, 5, 5, false);
Wait(300 + Random(500));
ChooseOption('Examine');
Wait(1000 + Random(1000));
if Pos('nest falls', GetBlackChatMessage) <> 10 then exit;
end else
begin
GameTab(5);
Wait(1000 + Random(900));
Mouse(580, 300, 5, 5, false);
Wait(300 + Random(500));
ChooseOption('xamine');
Wait(1000 + Random(1000));
end;
end;
exit;
end;
end;
{*******************************************************************************
function MyObjectFinder(var x, y: Integer; UpTxt: String; objcol, objsize, offsetx, offsety, ax1, ay1, ax2, ay2: integer): Boolean;
By: PriSoner
Description: My object finder in beta..
*******************************************************************************}
function MyObjectFinder(var x, y: Integer; UpTxt: String; objcol, objsize, offsetx, offsety, ax1, ay1, ax2, ay2: integer): Boolean;
var objTPA: TpointArray;
ATPA: T2DPointArray;
h, i, cx, cy: integer;
begin
cx := ((ax2 - ax1) div 2);
cy := ((ay2 - ay1) div 2);
FindColorsSpiralTolerance(cx, cy, objTPA, objcol, ax1, ay1, ax2, ay2, 4);
if Length(objTPA) > 0 then
begin
ATPA := SplitTPAEx(objTPA, objsize, objsize);
h := High(ATPA);
if Length(ATPA) > 0 then
begin
for i := 0 to h do
begin
MiddleTPAEx(ATPA, x, y);
x := x + offsetx;
y := y + offsety;
MMouse(x, y, 1, 1);
wait(600 + Random(600));
if IsUpText(UpTxt) or (UpTxt = 'none') then
begin
result := true;
exit;
end;
i := i + 1;
wait(500 + Random(500));
end;
end;
end;
writeln('Could not find Object');
end;
{*******************************************************************************
function FindTree(var a, b: Integer; Treetype : String): Boolean;
By: Negaal (Slightly modded for this script)
Description: Finds Trees and returns x & y coords.
Treetype: tree, yew, oak, willow, all
*******************************************************************************}
function FindTree(var a, b: Integer; Treetype : String): Boolean;
var
TPA : TpointArray;
ATPA: T2DPointArray;
i, C, CTS, Count, treecol: integer;
Uptext : String;
Colors : Array of integer;
SortedTPA : TPointArray;
x, y, z, h, s, l : extended;
begin
Case lowercase(TreeType) of
'tree' : begin
Uptext := 'ree';
treecol:= 2774862;
end;
'oak' : begin
UpText := 'ak';
treecol:= 2446923;
end;
'willow' : begin
UpText := 'illo';
treecol:= 2446923;
end;
'yew' : begin
UpText := 'ew';
treecol:= 2185548;
end;
'magic' : begin
UpText := 'agic';
treecol:= 6202776;
end;
'all' : begin
UpText := 'hop d';
treecol:= 2446923;
end;
end;
CTS := GetColorToleRanceSpeed;
ColorToleranceSpeed(2);
SetColorspeed2Modifiers(0.15, 0.5);
FindColorsSpiralTolerance(mscx, mscy, TPA, treecol, msx1, msy1, msx2, msy2, 10);
ColorToleranceSpeed(CTS);
SetColorspeed2Modifiers(0.2, 0.2);
TPA:=ReArrangeandShortenArrayEx(TPA, 5, 5);
Colors := GetColors(TPA);
SetLength(SortedTPA, Length(TPA));
Count := 0;
for C := 0 to High(TPA) do
begin
colortoxyz(colors, x, y, z);
if(x > 1)and(x < 22)and(y > 0)and(y < 11)and(z > 1)and(z < 28)then
begin
colortohsl(colors, h, s, l);
if (h > 17)and(h < 22)and(s > 23)and(s < 62)and(l > 7)and(l < 45) then
begin
SortedTPA[Count] := TPA[C];
Count := Count + 1;
end;
end;
end;
SetLength(SortedTPA, Count);
SortedTPA := TPA;
begin
ATPA := SplitTPAEx(SortedTPA, 12, 12);
SortATPAFrom(ATPA, IntToPoint(mscx, mscy));
for i := 0 to High(ATPA) do
if Length(ATPA) >= 50 then
begin
MiddleTPAEx(ATPA, a, b);
MMouse(a-10, b-10, 21, 21);
Wait(50 + random(50));
if IsUpText(UpText)then
begin
Result := True;
Getmousepos(a, b);
Exit;
end;
end;
end;
end;
{*******************************************************************************
procedure DropUnwanted;
By: PriSoner
Description: Just a small little procedure to drop unwanted items..
ongoing depends on what other low value items I get given
*******************************************************************************}
procedure DropUnwanted;
var x, y, i, DTMa2z: integer;
UnwantedDTM: Array of Integer;
begin
SetLength(UnwantedDTM, 11);
UnwantedDTM[0] := DTMFromString('78DA63E4656060E0624001F764EF307000694' + // Security Book
'620FE0F048C4C408610031A60442281340F906021A0460A487010' +
'50230C24C4F1AB0100A6DF0671');
UnwantedDTM[1] := DTMFromString('78DA631461606010604001CB26C7337000694' + // Baguette
'620FE0F048CEC408604031A60442281B434906021420D1F013502' +
'84ED020096E3065E');
UnwantedDTM[2] := DTMFromString('78DA631460606010624001FC45CE0C1C409A1' + // Frog Token
'188FF0301232B90C1C4800618914820AD00245808A89103120A04' +
'D480EC91C3AF06000AB00582');
UnwantedDTM[3] := DTMFromString('78DA63E46160601067400117CF9B31B002694' + // Strength Potion (2)
'620FE0F048C1C40060F031A60442281343F906025A0461848C812' +
'50C34A580D00B1530683');
UnwantedDTM[4] := DTMFromString('78DA63E4606060006124505815CCC006A4198' + // Spinach Roll
'1F83F103082E49918D000231209A4F98850C30324B809A8612252' +
'8D207E3500026305B3');
UnwantedDTM[5] := DTMFromString('78DA631467606010624001B37A3C185881342' + // Triangle Sandwich
'310FF0702466E20839F010D302291405A09487010502307242409' +
'A81101122AF8D500008613065A');
UnwantedDTM[6] := DTMFromString('78DA6314646060E0614001829D620C6C409A1' + // Kebab
'188FF0301233F90C1CC800618914820CD0224F809A8E102129204' +
'D44813360700F2D80550');
UnwantedDTM[7] := DTMFromString('78DA63E46560601064400197E74931B002694' + // Beer
'620FE0F048C2C40063F031A60442281B414116A40763113A14686' +
'801A3620C14A408D109090C2AF0600467D066B');
UnwantedDTM[8] := DTMFromString('78DA63E4656060E06140017545D60C6C409A1' + // Bread Roll
'188FF0301230790C1C68006189148202D4C841A7120C14D400DC8' +
'3D4204D4B0020901FC6A000D0605D5');
UnwantedDTM[9] := DTMFromString('78DA6314626060E0614001930A5D18D880342' + // Pie
'310FF070246901A660634C0884402692520C147408D30901027A0' +
'861548F0E35703005E7D05F9');
UnwantedDTM[10]:= DTMFromString('78DA63E4656060E061400173BA23195881342' + // Square Sandwich
'310FF0702460120439C010D302291405A02D31C0C35FC40829580' +
'1A7620C149400DC80C21FC6A005AC00632');
GameTab(4);
for i := 0 to High(UnwantedDTM) do
begin
DTMa2z := UnwantedDTM
if FindDTM(DTMa2z, x, y, 546, 203, 737, 466) then
begin
mouse(x, y, 2, 2, false);
wait(500 + Random(500));
ChooseOption('rop');
wait(1000 + Random(1000));
end;
FreeDTM(DTMa2z);
end;
{ if CoinAmount('Inv') > 0 and CoinAmount('Inv') < 299 then // Drop Coins if less than 299 (Not Working Yet)
begin
coinbmp := loadcoinbmp;
FindBitmapToleranceIn(coinbmp, x, y, 546, 203, 737, 466, 1);
writeln(IntToStr(x) + ' ' + IntToStr(y));
mouse(x, y, 3, 3, false);
wait(500 + Random(500));
ChooseOption('rop');
wait(1000 + Random(1000));
FreeBitmap(coinbmp);
end; }
end;
{*******************************************************************************
function MyInPin(pin: String): Boolean;
by: RSN / Starblaster100 (Modded by PriSoner to cope if incorrect pin has been entered.)
Description: Puts in bank pin. Results True if XXX
*******************************************************************************}
function MyInPin(pin: string): Boolean;
var
iNumber, i, i2, i3: Integer;
begin
i := 0;
i3 := 0;
result := true;
repeat
for iNumber := 1 to Length(pin) do
begin
MMouse(395, 175, 10, 10);
Wait(500 + Random(500));
ClickText(pin[iNumber], upchars, 1, 1, 512, 336, True);
Wait(200 + Random(200));
end;
i2 := 0;
i3 := i3 + 1;
while not BankScreen or (i2 <= 3) do
begin
if (Pos('ncorrect', lowercase(GetTalkingNPCName)) > 10) or (Pos('t know', lowercase(GetTalkingNPCName)) > 4) then
begin
i := i + 1;
if i <= 3 then ClickContinue(true, true) else
begin
writeln('Wrong Pin Entered 3 times. Logging Out');
LogOut;
result := false;
exit;
end;
end else wait(800);
i2 := i2 + 1
end;
Wait(100);
if i3 >= 3 then
begin
writeln('Wrong Pin Entered 3 times. Logging Out');
result := false;
exit;
end;
until BankScreen or not LoggedIn;
end;
{*******************************************************************************
function PTimeRunning: String;
By: from Phalanxs script/RsN (Slighted Modded by PriSoner for Player Time)
Description: Returns Time since ST (Script StartTime).
*******************************************************************************}
function PTimeRunning: String;
var
RHours, Minutes, Seconds, RMinutes, RSeconds: LongInt;
Time: string;
begin
Seconds := ((GetSystemTime div 1000) - PlayerStartTime);
Minutes := Seconds div 60;
RHours := Minutes div 60;
Time := IntToStr(Seconds) + ' Seconds';
if Minutes <> 0 then
begin
RSeconds := Seconds mod (Minutes * 60);
Time := IntToStr(Minutes) + ' Minutes and ' + IntToStr(RSeconds) +
' Seconds';
end;
if RHours <> 0 then
begin
RMinutes := Minutes mod (RHours * 60);
RSeconds := Seconds mod (Minutes * 60);
Time := IntToStr(RHours) + ' Hours, ' + IntToStr(RMinutes) +
' Minutes and ' + IntToStr(RSeconds) + ' Seconds';
end;
Result := Time;
end;
{*******************************************************************************
procedure FinalUCBReport;
By: PriSoner
Description: Displays the final report.
*******************************************************************************}
procedure FinalUCBReport;
var i, TLoads, TYews, TMagic, TXP, TBSeeds, TBRings, TBEggs, TRands: integer;
trstring: string;
begin
for i := 0 to Length(Players) - 1 do
begin
TLoads := TLoads + Players.Banked;
TYews := TYews + Players.Integers[4];
TMagic := TMagic + Players.Integers[8];
TXP := TXP + Players.Integers[3];
TBSeeds := TBSeeds + Players.Integers[5];
TBRings := TBRings + Players.Integers[6];
TBEggs := TBEggs + Players.Integers[7];
TRands := TRands + Players.Integers[9];
end;
ClearDebug;
writeLn('###################################################################');
writeLn(' Ultra Cut n Bank ' + UCBversion);
writeLn(' Final Report');
writeLn(' Ran for: ' + TimeRunning);
writeLn(' Total Players: ' + IntToStr(Length(Players)));
writeLn(' Total Banks: ' + DigitGroup(TLoads));
if TYews > 0 then writeLn(' Total Yew Logs Banked: ' + DigitGroup(TYews));
if TMagic > 0 then writeLn(' Total Magic Logs Banked: ' + DigitGroup(TMagic));
if TBSeeds > 0 then writeLn(' Birds Nests (Seeds) Banked: ' + DigitGroup(TBSeeds));
if TBRings > 0 then writeLn(' Birds Nests (Rings) Banked: ' + DigitGroup(TBRings));
if TBEggs > 0 then writeLn(' Birds Nests (Eggs) Banked: ' + DigitGroup(TBEggs));
if TRands > 0 then writeLn(' Random Event Items Banked: ' + DigitGroup(TRands));
writeLn(' Total XP earned: ' + DigitGroup(TXP));
writeLn('###################################################################');
for i := 0 to Length(Players) - 1 do
begin
if Players[i].Active then trstring := 'Yes' else trstring := 'no';
writeln('Player' + IntToStr(i) + ' Still Active? ' + trstring + '. earned: ' + IntToStr(Players[i].Integers[3]) + ' XP. reason ended: ' + Players[i].Strings[3]);
end;
SaveDebug;
SendSRLReport;
end;
{*******************************************************************************
procedure UCBPlayerReport(ReasonPlayerEnded: String; DebugImage, LoggedInFail: boolean);
By: PriSoner
Description: Displays Report when called on current totals.
Quits and Saves/Displays a Debug image when appropriate.
ReasonPlayerEnded: String explaing why, when, where it UCBPlayerReport was called. Enter None if Not Ended
DebugImage: Boolean, If true will save & display a screen capture of moment script ended.
LoggedInFail: Bolean, Checks to see if script is being called because of "not LoggedIn" being called
LoggedIn ocasionally reports the wrong status, with this option enabled it will wait
and re-check a few times before either continuing or returning.
*******************************************************************************}
procedure UCBPlayerReport(ReasonPlayerEnded: String; DebugImage, LoggedInFail: boolean);
var i: integer;
d: string;
b: boolean;
begin
if Players[CurrentPlayer].Booleans[3] and DebugImage then SaveScreenshot('UCBDebug.bmp');
if LoggedInFail then
begin
if DebugOn then SaveScreenshot('UCBLogin-Debug.bmp');
for i := 1 to 5 do
begin
// writeln('LogggedIn Returned "False", Retry ' + IntToStr(i) + ' of 10');
wait(2000);
if LoggedIn then
begin
writeln('LoggedIn Failure Recovered..');
ReasonPlayerEnded := 'none';
exit;
end;
end;
end;
if LoggedIn then
begin
Players[CurrentPlayer].Integers[3] := (GetXP('woodcutting') - Players[CurrentPlayer].Integers[1]);
Players[CurrentPlayer].Integers[2] := GetSkillInfo('woodcutting',false);
Players[CurrentPlayer].Integers[12]:= XpTillNextLevel('woodcutting');
wait(500 + Random(600));
end;
ClearDebug;
// I did want to have the GetSkillInfo Check in CheckIfBank procedure however it created
// a conflict with CountItemDTM constantly switching between GameTabs..
if (PMaxLevel > 0) and (PMaxLevel <= GetSkillInfo('woodcutting',False)) then ReasonPlayerEnded := 'Woodcutting Skill Level ' + IntToStr(GetSkillInfo('woodcutting',False)) + ' Reached';
if (PMaxXp > 0) and (PMaxXp <= (GetXP('woodcutting') - Players[CurrentPlayer].Integers[1])) then ReasonPlayerEnded := 'Your Requested XP earned for this player has been reached';
writeLn('###################################################################');
writeLn(' Ultra Cut n Bank ' + UCBversion);
writeLn(' Player Report for: ' + Players[CurrentPlayer].Name);
writeln(' Location: ' + Players[CurrentPlayer].Strings[2]);
writeLn(' Ran for: ' + PTimeRunning);
writeLn(' Loads Banked: ' + DigitGroup(Players[CurrentPlayer].Banked));
if Players[CurrentPlayer].Integers[4] > 0 then writeLn(' Yew Logs Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[4]));
if Players[CurrentPlayer].Integers[8] > 0 then writeLn(' Magic Logs Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[8]));
if Players[CurrentPlayer].Integers[5] > 0 then writeLn(' Birds Nests (Seeds) Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[5]));
if Players[CurrentPlayer].Integers[6] > 0 then writeLn(' Birds Nests (Rings) Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[6]));
if Players[CurrentPlayer].Integers[7] > 0 then writeLn(' Birds Nests (Eggs) Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[7]));
if Players[CurrentPlayer].Integers[9] > 0 then writeLn(' Random Event Items Banked: ' + DigitGroup(Players[CurrentPlayer].Integers[9]));
if (PMaxLoads > 0) and (PMaxLoads <= Players[CurrentPlayer].Banked) then
begin
ReasonPlayerEnded := 'Total Player Loads Banked Limit Reached.';
if LoggedIn then LogOut;
KeepPlayer := false;
end;
b := true;
if (ReasonPlayerEnded <> 'none') then
begin
writeLn(' Reason Player Ended: ' + ReasonPlayerEnded);
Players[CurrentPlayer].Strings[3] := ReasonPlayerEnded;
if LoggedIn then LogOut;
if not Players[CurrentPlayer].Booleans[2] then KeepPlayer := false;
b := false;
end;
if (SessLoads > 0) and (Players[CurrentPlayer].Integers[11] >= SessLoads) and b then
begin
Players[CurrentPlayer].Booleans[2] := true;
writeLn(' Reason Player Ended: Maximum Loads Banked this session...');
end;
if Players[CurrentPlayer].Integers[2] > Players[CurrentPlayer].level[20] then d := 'now' else d := 'still';
writeLn(' Player ' + Players[CurrentPlayer].Name + ' Started at Level ' + IntToStr(Players[CurrentPlayer].level[20]) + ' and is ' + d + ' at Level ' + IntToStr(Players[CurrentPlayer].Integers[2]));
writeLn(' You earned ' + DigitGroup(Players[CurrentPlayer].Integers[3]) + ' xp This session with ' + DigitGroup(Players[CurrentPlayer].Integers[12]) + ' xp to the next Level');
writeLn(' Overall Running Time: ' + TimeRunning);
writeLn('###################################################################');
SaveDebug;
CIBTrue := false;
SRLRandomsReport;
SendSRLReport;
end;
{*******************************************************************************
function CheckIfBank: Boolean;
By: PriSoner
Description: Returns True if any condition that may require banking is met.
*******************************************************************************}
function CheckIfBank: Boolean;
var i, TLoads, TLogs, TXP: integer;
begin
if not LoggedIn then exit;
result := true;
if CIBTrue then exit;
result := false;
GameTab(4);
if InvFull then
begin
DropUnwanted;
wait(500);
if InvFull then result := true;
end;
CIBReason := 'none';
for i := 0 to Length(Players) - 1 do
begin
TLoads := TLoads + Players[i].Banked;
TLogs := TLogs + Players[i].Integers[4] + Players[i].Integers[8];
TXP := TXP + Players[i].Integers[3];
end;
if (TMaxTime > 0) and (TMaxTime <= ((GetTimeRunning div 1000) div 60)) then
begin
writeLn('Maximum Overall Time Limit Reached....');
result := true;
CIBTrue := true;
CIBReason := 'Maximum Overall Time Limit Reached.';
EndAllPlayers;
exit;
end;
if (TMaxLogs > 0) and (TMaxLogs <= TLogs) then
begin
writeLn('Total Logs Banked limit reached....');
result := true;
CIBTrue := true;
CIBReason := 'Total Logs Banked limit reached.';
EndAllPlayers;
exit;
end;
if (TMaxLoads > 0) and (TMaxLoads <= TLoads) then
begin
writeLn('Total Loads Banked limit reached.....');
result := true;
CIBTrue := true;
CIBReason := 'Total Loads Banked limit reached.';
EndAllPlayers;
exit;
end;
if (TMaxXp > 0) and (TMaxXp <= TXP) then
begin
writeLn('Total amount of XP earned limit has been reached.....');
result := true;
CIBTrue := true;
CIBReason := 'Total amount of XP earned limit has been reached.';
EndAllPlayers;
exit;
end;
if (PMaxTime > 0) and (PMaxTime <= (((GetSystemTime - Players[CurrentPlayer].Integers[10]) div 1000) div 60)) then
begin
writeLn('Maximum Total Time Limit for this player has been reached....');
result := true;
CIBTrue := true;
CIBReason := 'Maximum Time Limit for this player has been reached.';
exit;
end;
if (SessTime > 0) and (SessTime <= (((GetSystemTime div 1000) - PlayerStartTime) div 60)) then
begin
writeLn('Maximum Time reached for this session...');
result := true;
CIBTrue := true;
CIBReason := 'Maximum Time reached for this session... Changing Player.';
Players[CurrentPlayer].Booleans[2] := true;
exit;
end;
if (PMaxLogs > 0) and (PMaxLogs <= Players[CurrentPlayer].Integers[4] +
Players[CurrentPlayer].Integers[8] + CountItemsDtm('inv', YewDTM) + CountItemsDtm('inv', MagicDTM)) then
begin
writeLn('Maximum Logs for player reached');
result := true;
CIBTrue := true;
CIBReason := 'Total Player Logs Cut Limit Reached.';
exit;
end;
end;
{*******************************************************************************
function ExistsItemCustom(i: Integer): Boolean;
By: WT-Fakawi Slightly Modded to avoid GameTab Warnings.
Description: Checks if item in inventory at specified position exists
*******************************************************************************}
function ExistsItemCustom(i: Integer): Boolean;
var
x, y:Integer;
TB: TBox;
begin
TB := InvBox(i);
Result := FindColor(x, y, 65536, TB.x1 + 5, TB.y1 + 5, TB.x2 - 5, TB.y2 - 5);
end;
{*******************************************************************************
Function GetInvItemBoundsCustom(InvSpot: Integer; T: TBox): Boolean;
By: Wizzup? Slightly Modded to avoid GameTab Warnings.
Description: If item exists, returns TBox of the item, else returns the normal InvBox.
*******************************************************************************}
Function GetInvItemBoundsCustom(InvSpot: Integer; Var T: TBox): Boolean;
Var
TPA: TPointArray;
Begin
T := InvBox(InvSpot);
FindColorsTolerance(TPA, 65536, T.x1, T.y1, T.x2, T.y2, 0);
If Length(TPA) = 0 Then
Begin
Result := False;
T := InvBox(InvSpot);
Exit;
End;
Result := True;
T := GetTPABounds(TPA);
End;
{*******************************************************************************
procedure MMouseItemCustom(i: Integer);
By: WT-Fakawi Slightly Modded to avoid GameTab Warnings.
Description: Moves mouse to specified inventory spot
*******************************************************************************}
procedure MMouseItemCustom(i: Integer);
var
TB: TBox;
x, y: integer;
begin
GetInvItemBoundsCustom(I, TB);
MouseBox(TB.X1 + 4, TB.Y1 + 4, TB.X2 - 4, TB.Y2 - 4, 3);
GetMousePos(x, y);
Mouse(x, y, 0, 0, false);
end;
{*******************************************************************************
procedure DepositCustom(slot, toslot, vType: Integer);
by: WT-Fakawi/PPLSUQBAWLZ/Stupid3ooo/Town Slightly Modded to avoid GameTab Warnings.
Description: Deposits from Slot to ToSlot.
vType True = Deposit All. vType False = Deposit one by one.
Any integer is deposit with Deposit X. (except for 5 and 10)
*******************************************************************************}
Procedure DepositCustom(SlotFrom, SlotTo: Integer; vType: Variant);
Var
DepositX: Boolean;
All: Variant;
I, T, x, y: Integer;
Begin
If Not BankScreen Then
Exit;
If vType = 2 Then
srl_Warn('Deposit', '2 now means store per 2, not ''All''', 15);
DepositX := False;
Case VarType(vType) Of
3: Begin
DepositX := Not InIntArray([1, 5, 10], vType);
If vType = 1 Then
All := False
Else
All := True;
End;
11: All := vType;
End;
For I := SlotFrom To SlotTo Do
Begin
If Not ExistsItemCustom(I) Then
Continue;
MMouseItemCustom(I);
If DepositX Then
Begin
ChooseOption('Deposit-X');
T := GetSystemTime;
While (Not FindColor(x, y, 8388608, MCX1, MCY1, MCX2, MCY2)) And (GetSystemTime - T < 3000) Do
Wait(100);
TypeSend(vType);
End Else If VarType(vType) = 3 Then
ChooseOption('Deposit-' + vType)
Else
ChooseOption('Deposit-All');
Wait(RandomRange(200, 300));
T := GetSystemTime;
While ExistsItemCustom(I) And (GetSystemTime - T < 2000) Do
Wait(50);
End;
End;
{*******************************************************************************
procedure CountBankedItems;
By: PriSoner
Description: Add all items in the back pack to a running total before banking.
*******************************************************************************}
procedure CountBankedItems;
var a, b, c, d, e, f, i: integer;
begin
if not LoggedIn then exit;
a := 0;
for i := 1 to 28 do if (ExistsItemCustom(i)) then a := a + 1;
b := CountItemsDtm('inv', YewDTM);
c := CountItemsDtm('inv', NestSeedDTM);
d := CountItemsDtm('inv', NestRingDTM);
e := CountItemsDtm('inv', NestEggDTM);
f := CountItemsDtm('inv', MagicDTM);
Players[CurrentPlayer].Integers[4] := (Players[CurrentPlayer].Integers[4] + b);
Players[CurrentPlayer].Integers[5] := (Players[CurrentPlayer].Integers[5] + c);
Players[CurrentPlayer].Integers[6] := (Players[CurrentPlayer].Integers[6] + d);
Players[CurrentPlayer].Integers[7] := (Players[CurrentPlayer].Integers[7] + e);
Players[CurrentPlayer].Integers[8] := (Players[CurrentPlayer].Integers[8] + f);
Players[CurrentPlayer].Integers[9] := (Players[CurrentPlayer].Integers[9] + (a - b - c - d - e - f));
Players[CurrentPlayer].Integers[11] := (Players[CurrentPlayer].Integers[11] + 1);
Players[CurrentPlayer].Banked := (Players[CurrentPlayer].Banked + 1);
// SRL Stats Reporting
ReportVars[0] := (ReportVars[0] + b); // Yews Banked Reported to SRL Stats
ReportVars[1] := (ReportVars[1] + (c + d + e)); // Birds Nests Banked Reported to SRL Stats
ReportVars[2] := (ReportVars[2] + (a - b - c - d - e - f)); // Randoms Items Banked Reported to SRL Stats
ReportVars[3] := (ReportVars[3] + 1); // Loads Banked Reported to SRL Stats
ReportVars[4] := (ReportVars[4] + f); // Magic Logs Banked Reported to SRL Stats
Banks := (Banks + 1); // Official Banked Stats for Global SRL Report
end;
function AutoRockColor: Integer;
var
GC, a, l, TestColor: integer;
var
P:array of Tpoint;
begin
GC := 6444639;
Flag;
FindColorsSpiralTolerance(MMCX,MMCY, P, GC, MMX1,MMY1,MMX2,MMY2, 75);
l:=GetArrayLength(P);
for a:= 0 to l-1 do
begin
TestColor := GetColor(P[a].x,P[a].y);
if (GetColor(P[a].x-1,P[a].y)=TestColor-723980) then
begin
Result := TestColor;
WriteLn('Rock Color = ' + IntToStr(TestColor));
Exit;
end;
end;
WriteLn('Could not find Rock Color!');
Result := 0;
end;
{*******************************************************************************
function AutoTreeSymb: Integer;
By: PriSoner and ACA2
Description: Finds colour of Tree Symbol.
*******************************************************************************}
function AutoTreeSymb: Integer;
var
arP: TPointArray;
arC: TIntegerArray;
tmpCTS, i, arL: Integer;
R, G, B: Integer;
X, Y, Z: Extended;
begin
tmpCTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(0.23, 1.71);
if not (FindColorsTolerance(arP, 822033, MMX1, MMY1, MMX2, MMY2, 9)) then
begin
Writeln('Failed to find the tree symbol by AutoColour.');
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
Exit;
end;
arC := GetColors(arP);
ClearSameIntegers(arC);
arL := High(arC);
for i := 0 to arL do
begin
if (rs_OnMinimap(arP[i].x, arP[i].y)) then
begin
ColorToRGB(arC[i], R, G, B);
if (R >= 0) and (R <= 41) and (G >= 108) and (G <= 164) and (B >= 0) and (B <= 35) then
begin
ColorToXYZ(arC[i], X, Y, Z);
if (X >= 5.47) and (X <= 13.91) and (Y >= 10.93) and (Y <= 26.59) and (Z >= 1.83) and (Z <= 5.93) then
begin
Result := arC[i];
Break;
end;
end;
end;
end;
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
if (i = arL + 1) then Writeln('AutoColor failed to find the Tree Symbol colour.');
end;
{*******************************************************************************
function AutoShopSymb: Integer;
By: PriSoner and ACA2
Description: Finds colour of Tree Symbol.
*******************************************************************************}
function AutoShopSymb: Integer;
var
arP: TPointArray;
arC: TIntegerArray;
tmpCTS, i, arL: Integer;
R, G, B: Integer;
X, Y, Z: Extended;
begin
tmpCTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(0.20, 1.48);
if not (FindColorsTolerance(arP, 2781117, MMX1, MMY1, MMX2, MMY2, 7)) then
begin
Writeln('Failed to find the shop symbol by AutoColour.');
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
Exit;
end;
arC := GetColors(arP);
ClearSameIntegers(arC);
arL := High(arC);
for i := 0 to arL do
begin
if (rs_OnMinimap(arP[i].x, arP[i].y)) then
begin
ColorToRGB(arC[i], R, G, B);
if (R >= 164) and (R <= 203) and (G >= 89) and (G <= 136) and (B >= 25) and (B <= 69) then
begin
ColorToXYZ(arC[i], X, Y, Z);
if (X >= 19.72) and (X <= 33.05) and (Y >= 15.88) and (Y <= 29.42) and (Z >= 3.23) and (Z <= 9.22) then
begin
Result := arC[i];
Break;
end;
end;
end;
end;
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
if (i = arL + 1) then Writeln('AutoColor failed to find the Shop Symbol colour.');
end;
{*******************************************************************************
function AutoBankSymb: Integer;
By: PriSoner and ACA2
Description: Finds colour of Bank Symbol.
*******************************************************************************}
function AutoBankSymb: Integer;
var
arP: TPointArray;
arC: TIntegerArray;
tmpCTS, i, arL: Integer;
R, G, B: Integer;
X, Y, Z: Extended;
begin
tmpCTS := GetColorToleranceSpeed;
ColorToleranceSpeed(2);
SetColorSpeed2Modifiers(0.10, 1.45);
if not (FindColorsTolerance(arP, 3002600, MMX1, MMY1, MMX2, MMY2, 13)) then
begin
Writeln('Failed to find the bank symbol by AutoColour.');
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
Exit;
end;
arC := GetColors(arP);
ClearSameIntegers(arC);
arL := High(arC);
for i := 0 to arL do
begin
if (rs_OnMinimap(arP[i].x, arP[i].y)) then
begin
ColorToRGB(arC[i], R, G, B);
if (R >= 205) and (R <= 255) and (G >= 181) and (G <= 227) and (B >= 0) and (B <= 96) then
begin
ColorToXYZ(arC[i], X, Y, Z);
if (X >= 42.74) and (X <= 68.56) and (Y >= 46.79) and (Y <= 75.55) and (Z >= 7.39) and (Z <= 21.44) then
begin
Result := arC[i];
Break;
end;
end;
end;
end;
ColorToleranceSpeed(tmpCTS);
SetColorSpeed2Modifiers(0.2, 0.2);
if (i = arL + 1) then Writeln('AutoColor failed in finding the bank symbol color.');
end;
{*******************************************************************************
function FindMMTPA(var x, y: integer; color, tol, cts, ObjWidth, ObjHeight, minCount :Integer): Boolean;
By: Wizzup? Modded by PriSoner for use in MiniMap
Description: Finds object using WizzyPlugin functions.
Starts with a Spiral from x and y.
Put in the color, Tolerance and ColorToleranceSpeed.
If you dont know what colortolerancespeed to choose, put in -1.
ObjWidth and ObjHeight are the parameters TPAToATPAEx uses, thus filtering
the MSs FindColorsSpiralTolerance points in boxes defined by
ObjWidth and ObjHeigth.
minCount is the amount of colors it should at least find in a Object box.
*******************************************************************************}
function FindMMTPA(var x, y: integer; color, tol, cts, ObjWidth, ObjHeight, minCount :Integer): Boolean;
var
I, tcts: Integer;
myPoint: TPoint;
Points: TPointArray;
aPoints: T2DPointArray;
begin
tcts := GetColorToleranceSpeed;
if not (cts >= 0) and (cts <= 2) then
cts := 1; // Standard.
ColorToleranceSpeed(cts);
FindColorsSpiralTolerance(x, y, Points, Color, MMX1, MMY1, MMX2, MMY2, Tol);
aPoints := TPAtoATPAEx(Points, ObjWidth, ObjHeight);
SetLength(Points, 0);
for I := 0 to Length(aPoints) - 1 do
begin
if Length(aPoints[I]) < minCount then
Continue;
myPoint := MiddleTPA(aPoints[I]);
ColorToleranceSpeed(1);
x := myPoint.X;
y := myPoint.Y;
Result := True;
ColorToleranceSpeed(tcts);
ColorToleranceSpeed(cts);
end;
ColorToleranceSpeed(tcts);
end;
{*******************************************************************************
function GetIconColours: boolean;
By: PriSoner
Description: Gets Current Colour of Bank and Tree Icons in Mini Map
*******************************************************************************}
function GetIconColours: boolean;
var sf, i: integer;
begin
result := false;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: GetIconColours.', false, true);
exit;
end;
MarkTime(sf);
i := 0;
repeat
if TimeFromMark(sf) >= 15000 then
begin
i := i + 1;
writeLn('Cannot Find Bank Icon.. Logging Out and In Again to Change Icon Position.');
if i >= 5 then
begin
UCBPlayerReport('Could Not Find Bank Icon After 5 Login Attempts.', false, false);
exit;
end;
Logout;
LoginPlayer;
MarkTime(sf);
SetRun(true);
end;
if AutoBankSymb > 0 then
begin
Players[CurrentPlayer].Integers[15] := AutoBankSymb;
writeln('Found Bank Symbol by AutoColour, Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[15]));
Break;
end else if FindSymbol(x, y, 'tree') then
begin
Players[CurrentPlayer].Integers[15] := GetColor(x + 1, y);
writeln('Found Bank by Symbol, Bank Symbol Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[15]));
Break;
end;
writeln('Please make sure your players location is set correctly and you are in the correct bank.');
writeln('Trying to find bank symbol again...');
writeln(' ');
wait(5000 + Random(3000));
until Players[CurrentPlayer].Integers[15] > 0;
MarkTime(sf);
i := 5;
repeat
if TimeFromMark(sf) >= 15000 then
begin
writeLn('Cannot Find Tree Icon.. moving position and trying again.');
If FindColor(x, y, Players[CurrentPlayer].Integers[15], 550, 7, 682, 161) then
begin
mouse(x - 3, y + i, 6, 3, true);
flag;
wait(500);
i := i + 30;
end else mouse(625, 85 + i, 6, 3, true);
end;
if i >= 70 then
begin
UCBPlayerReport('Could Not Find Tree Icon After 3 attempts to reposition.', false, false);
exit;
end;
if AutoTreeSymb > 0 then
begin
Players[CurrentPlayer].Integers[16] := AutoTreeSymb;
writeln('Found Tree Symbol by AutoColour, Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
end else if FindSymbol(x, y, 'tree') then
begin
Players[CurrentPlayer].Integers[16] := GetColor(x + 2, y);
writeln('Found Tree by Symbol, Tree Symbol Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
end;
wait(50);
until Players[CurrentPlayer].Integers[16] > 0;
result := true;
end;
{*******************************************************************************
function FindTheAxe(var AxePos: integer; var TypeOfAxe: string; AxeInInv: boolean): boolean;
By: PriSoner
Description: Attempts to find an axe in the players inventory or hand.
If an axe is found it checks to see if the player can use it for
woodcutting and checks to see if it can be wielded. If an axe has to be
in the inventory it always moves it to slot 1 if it isn;t already there.
AxeInInv: Set to True and it will move axe from hand to inventory slot 1 if it can.
Set to False and it will move axe from inventory to hand.
AxePos: Returns 0 if no axe is found, 1 if Axe is in hand & 2 if axe is in inventory.
It does this because even if you have Set AxeInv to False it is still
possible that the axe may not be wieldable. Usefull to know if depositing in bank etc.
TypeOfAxe: Return the Type of Axe Being used or 'None Found' if no axe is present.
FindTheAxe returns True if a usable axe is found.
*******************************************************************************}
type AllAxes = record
AxeDTM: integer;
AxeName: string;
MinLvl: integer;
AttLvl: integer;
end;
function FindTheAxe(var AxePos: integer; var TypeOfAxe: string; AxeInInv: boolean): boolean;
var ax, ay, SklWood, SklAtt, ctab, DTMAxe: integer;
i: integer;
AxeList: Array of AllAxes;
begin
SetLength(AxeList, 8);
AxeList[0].AxeDTM := DTMFromString('78DA633CCAC4C0C0C0C8800C924479197E414' +
'5FF0301E376A01A015435205939249D8C9B816AC408A8390E54C3' +
'4540CD19A01A16026A8E01D5FC66C0AFE600500D2B7E73006DD70' +
'CD3'); // DTM thanks to Kingoscorm
AxeList[0].AxeName := 'Dragon Axe';
AxeList[0].AttLvl := 60;
AxeList[0].MinLvl := 61;
AxeList[1].AxeDTM := DTMFromString('78DA639CC3C4C0C0C0C8800CDC62D319B8A0A' +
'2FF8180B10FA88617550D48960B4927588D280135F3816A5808A8' +
'990D54F38701BF9A4940358C04CC990254C38E5F0D0058F20AB7'); // DTM thanks to Kingoscorm
AxeList[1].AxeName := 'Rune Axe';
AxeList[1].AttLvl := 40;
AxeList[1].MinLvl := 41;
AxeList[2].AxeDTM := DTMFromString('78DA632C626260F8CF80025CC35C19B880342' +
'310FF0702C614A01A1E4654454059981A302F1DA8869F809A6CA0' +
'1A16026A8A816A5809A82900AAF9C3805F4D0613120FBB1A005BF' +
'F0A5C'); // DTM thanks to Kingoscorm
AxeList[2].AxeName := 'Adamant Axe';
AxeList[2].AttLvl := 30;
AxeList[2].MinLvl := 31;
AxeList[3].AxeDTM := DTMFromString('78DA63F460626060606440064ECE890C5C50D' +
'1FF40C0680D54C385AA0624CB85A493D106A84698801A47A01A16' +
'026ABC806A5809A8F104AAF9C3805F8D1DA6BFD0D50000CA59084' +
'4'); // DTM thanks to Kingoscorm
AxeList[3].AxeName := 'Mithril Axe';
AxeList[3].AttLvl := 20;
AxeList[3].MinLvl := 21;
AxeList[4].AxeDTM := DTMFromString('78DA633CCAC4C0708B0105888B8A327001694' +
'620FE0F048C3B816A9E31A00146B81A306F3750CD6B026AF603D5' +
'3C20A0E63850CD4322D4DC20A0660F50CD1DFC6A001ADB1008'); // DTM thanks to Kingoscorm
AxeList[4].AxeName := 'Black Axe';
AxeList[4].AttLvl := 10;
AxeList[4].MinLvl := 6;
AxeList[5].AxeDTM := DTMFromString('78DA639CC3C4C0709B0105D49696307001694' +
'620FE0F048C3D4035EF19D000235C0D983711A8E635013553816A' +
'1E1250338F08352037DF20A0661250CD1DFC6A0086921010'); // DTM thanks to Kingoscorm
AxeList[5].AxeName := 'Steel Axe';
AxeList[5].AttLvl := 5;
AxeList[5].MinLvl := 6;
AxeList[6].AxeDTM := DTMFromString('78DA632C646260B8CD8002C2020218B880342' +
'310FF0702C614A09A170C688011AE06CC4B03AA7947404D1650CD' +
'13026A8A816A1E12505300547383809A74A09AFBF8D5000079D10' +
'E77'); // DTM thanks to Kingoscorm
AxeList[6].AxeName := 'Iron Axe';
AxeList[6].AttLvl := 1;
AxeList[6].MinLvl := 1;
AxeList[7].AxeDTM := DTMFromString('78DA63F4646260B8CD8002FC6C5519B880342' +
'310FF0702464BA09A570C6880118904D2364035EF30D57021AB71' +
'04AA7940400DC83D0F09A87107AAB941408D1D50CD1DFC6A00903' +
'60D00'); // DTM thanks to Kingoscorm
AxeList[7].AxeName := 'Bronze Axe';
AxeList[7].AttLvl := 1;
AxeList[7].MinLvl := 1;
ctab := GetCurrentTab;
SklWood := GetSkillInfo('woodcutting',False);
SklAtt := GetSkillInfo('attack', False);
for i := 0 to High(AxeList) do
begin
GameTab(4);
DTMAxe := AxeList[i].AxeDTM;
if FindDTM(DTMAxe, ax, ay, 546, 203, 737, 466) then
begin
if (SklWood < AxeList[i].MinLvl) then
begin
writeLn('Found ' + AxeList[i].AxeName + ' but you do not have a high enough Woodcutting level to use it.');
writeLn('You Need to be Woocutting Level ' + IntToStr(AxeList[i].MinLvl) + ' or higher.');
writeLn('Looking for another axe..........');
end else
begin
if (SklAtt >= AxeList[i].AttLvl) and not AxeInInv then
begin
writeLn('Found a ' + AxeList[i].AxeName + ' and moving it into your players hand.');
Mouse(ax, ay, 10, 4, true);
wait(600 + Random(600));
AxePos := 1;
AxeInInv := false;
end else
begin
if (ax < 600) and (ay < 245) then writeLn('Found a ' + AxeList[i].AxeName + '.') else
begin
writeLn('Found a ' + AxeList[i].AxeName + 'and moving it to slot 1.');
MMouse(ax, ay, 0, 0);
HoldMouse(ax, ay, true);
wait(600 + Random(600));
MMouse(575, 230, 0, 0);
ReleaseMouse(575, 230, true);
end;
AxePos := 2;
AxeInInv := true;
end;
wait(500 + Random(400));
result:= true;
FreeDTM(DTMAxe);
GameTab(ctab);
TypeOfAxe := AxeList[i].AxeName;
exit;
end;
end;
end;
for i := 0 to High(AxeList) do
begin
GameTab(5);
DTMAxe := AxeList[i].AxeDTM;
if FindDTM(DTMAxe, ax, ay, 568, 285, 603, 321) then
begin
AxePos := 1;
if AxeInInv then
begin
writeLn('Found a ' + AxeList[i].AxeName + ' in your players hand. Moving to slot 1 of inventory.');
Mouse(ax, ay, 1, 1, true);
wait(700 + random(700));
GameTab(4);
wait(700 + random(700));
FindDTM(DTMAxe, ax, ay, 546, 203, 737, 466);
if not (ax < 600) and (ay < 245) then
begin
MMouse(ax, ay, 0, 0);
HoldMouse(ax, ay, true);
wait(600 + Random(600));
MMouse(575, 230, 0, 0);
ReleaseMouse(575, 230, true);
end;
AxePos := 2;
end else writeLn('Found a ' + AxeList[i].AxeName + ' in your players hand.');
result:= true;
FreeDTM(DTMAxe);
GameTab(ctab);
TypeOfAxe := AxeList[i].AxeName;
exit;
end;
end;
AxePos := 0;
result:= false;
TypeOfAxe := 'None Found';
FreeDTM(DTMAxe);
GameTab(ctab);
end;
{*******************************************************************************
function FindBothYews: boolean;
By: PriSoner
Description: Find Both Tree Icons in Mini Map
*******************************************************************************}
function FindBothYews: boolean;
var x2, y2, y3: integer;
begin
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: FindBothYews.', false, true);
if not KeepPlayer then exit;
end;
MakeCompass('N');
SetAngle(true);
x2:= 626; y2:= 25; y3:= 140;
if FindColorSpiral(x2, y2, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161) then
begin
if FindColorSpiral(x2, y3, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161) then
begin
if y3 - y2 > 25 then
begin
result:= true
exit;
end else result:= false;
end else result:= false;
end else result:= false;
UCBPlayerReport('Could Not Find Both Yew Symbols (Function: FindBothYews)', true, false);
end;
{*******************************************************************************
function FindTopYew: integer;
By: PriSoner
Description: Find Top Yew Based on Icon Colour and Area of Map..
Needs Tweaking Searches whole of Mini Map instead of small area
*******************************************************************************}
function FindTopYew: integer;
var y2: integer;
begin
x:= 626; y:= 25; y2:= y;
if FindColorSpiral(x, y, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161) then
begin
result:= y - y2;
end else result:= -1;
end;
{*******************************************************************************
function FindBottomYew integer;
By: PriSoner
Description: Find Bottom Yew Based on Icon Colour and Area of Map..
Needs Tweaking Searches whole of Mini Map instead of small area
*******************************************************************************}
function FindBottomYew: integer;
var y2: integer;
begin
x:= 626; y:= 140; y2:= y;
if FindColorSpiral(x, y, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161) then
begin
result:= y2 - y;
end else result:= -1;
end;
{*******************************************************************************
function BankItems: boolean;
By: PriSoner
Description: Banks all items once bank is open and returns true if successful.
*******************************************************************************}
function BankItems: boolean;
begin
if not LoggedIn then exit;
Wait(600 + Random(500));
if PinScreen then
begin
if not MyInPin(Players[CurrentPlayer].Strings[0]) then
begin
UCBPlayerReport('BankItems: Failed to enter correct pin after 3 attempts.', false, false);
exit;
end;
end;
wait(500 + Random(500));
if BankScreen then result := true else exit;
CountBankedItems;
DepositCustom(FirstDeposit,28,true);
wait(500 + Random(1000));
DepositCustom(FirstDeposit,28,true); // Just as a Double Check because, although it rarely happens, it does occasionally fail to bank all items.
wait(500 + Random(1000));
CloseBank;
UCBPlayerReport(CIBReason, false, false);
CIBTrue := false;
end;
{*******************************************************************************
procedure AntiBan;
Description: Basic AntiBan Proceedure.
*******************************************************************************}
procedure AntiBan;
var OriginalDegrees: integer;
begin
case random(6) of
0: begin
OriginalDegrees := Round(rs_GetCompassAngleDegrees);
RandomMovement;
MakeCompass(IntToStr(OriginalDegrees));
SetAngle(true);
end;
1: begin
Players[CurrentPlayer].Integers[12]:= XpTillNextLevel('woodcutting');
Players[CurrentPlayer].Integers[2] := GetSkillInfo('woodcutting',false);
Players[CurrentPlayer].Integers[3] := (GetXP('woodcutting') - Players[CurrentPlayer].Integers[1]);
end;
2: PickUpMouse;
3: begin
OriginalDegrees := Round(rs_GetCompassAngleDegrees);
BoredHuman;
MakeCompass(IntToStr(OriginalDegrees));
SetAngle(true);
end;
4: begin
OriginalDegrees := Round(rs_GetCompassAngleDegrees);
RandomMovement;
MakeCompass(IntToStr(OriginalDegrees));
SetAngle(true);
end;
5: begin
OriginalDegrees := Round(rs_GetCompassAngleDegrees);
BoredHuman;
MakeCompass(IntToStr(OriginalDegrees));
SetAngle(true);
end;
end;
end;
{*******************************************************************************
function StrangePlantFinder: Boolean;
By: PriSoner
Description: Tries to detect the presence of a Strange Plant and pick it if found.
this function is in beta testing please report back any problems..
StrangePlantFinder: Returns true if it finds a plant.
*******************************************************************************}
function StrangePlantFinder: Boolean;
var l, spx, spy, StartSPF, FruitCount, FruitDTM: integer;
TPA1, TPA2, TPA3: TPointArray;
Begin
if not LoggedIn then exit;
result := false
spx := MSCX;
spy := MSCY;
if FindColorTolerance(spx, spy, 945749, MSCX - 100, MSCY - 110, MSCX + 100, MSCY + 90, 4) and FindColorTolerance(spx, spy, 743503, MSCX - 100, MSCY - 110, MSCX + 100, MSCY + 90, 4) then
begin
FindColorsSpiralTolerance(spx, spy, TPA1, 945749, MSX1, MSY1, MSX2, MSY2, 4);
FindColorsSpiralTolerance(spx, spy, TPA2, 743503, MSX1, MSY1, MSX2, MSY2, 4);
SetLength(TPA1, High(TPA1) + 1);
SetLength(TPA2, High(TPA2) + 1);
TPA3 := Find2TPApoints(TPA1, TPA2, 18, 18);
l := High(TPA3);
if l >= 0 then
begin
if FindObjTPA(spx, spy, 945749, 4, -1, 18, 18, 4, ['trange']) then
begin
writeln('Found Strange Plant attempting to Pick fruit.');
FruitDTM := DTMFromString('78DA63E4646060E0654001B30A8E30B001694' +
'620FE0F048CDC400633031A60442281B40090E026A08607488812' +
'50C30A244408A861C67433BA1A008467066B');
FruitCount := CountItemsDtm('inv', FruitDTM);
Result := True;
MarkTime(StartSPF);
repeat
if FindObjTPA(spx, spy, 945749, 4, -1, 18, 18, 4, ['trange']) then
begin
MMouse(spx, spy, 1, 1);
wait(250 + Random(250));
if IsUpText('trange') then
begin
wait(250 + Random(250));
Mouse(spx, spy, 1, 1, false);
wait(250 + Random(250));
ChooseOption('ick');
wait(500 + Random(600));
if Pos('ready to', GetBlackChatMessage) > 5 then wait(2000 + Random(1000)) else //Text: The fruit isn't ready to be picked yet...
if (Pos('fruit from', GetBlackChatMessage) > 5) or (CountItemsDtm('inv', FruitDTM) > FruitCount) then //Text: You pick the fruit from the plant.
begin
result := true;
writeln('Picked Fruit From Strange Plant.. Waiting for plant to die...');
FreeDTM(FruitDTM);
repeat
BoredHuman;
wait(2000 + random(1000));
until not FindObjTPA(spx, spy, 945749, 4, -1, 18, 18, 4, ['trange']) or FindFight;
Plants := Plants + 1;
SRLRandomsReport;
exit;
end else if Pos('unable', GetBlackChatMessage) > 5 then //Text: You're unable to pick the fruit.
begin
result := false;
writeln('The plant is not after you.. Waiting for plant to go...');
FreeDTM(FruitDTM);
repeat
BoredHuman;
wait(2000 + random(1000));
until not FindObjTPA(spx, spy, 945749, 4, -1, 18, 18, 4, ['trange']) or FindFight;
exit;
end;
end;
end else break;
until (TimeFromMark(StartSPF) > 120000) or FindFight;
writeln('Failed to Pick Fruit From Strange Plant');
FreeDTM(FruitDTM);
end;
end;
end;
end;
procedure CustomEdRunAway(WaitTime: integer); forward;
{*******************************************************************************
function CheckForAllRandoms: boolean;
By: PriSoner
Description: checks for combination of standard and cutom randoms. ongoing...
*******************************************************************************}
function CheckForAllRandoms: boolean;
begin
if Pos('tch sp', lowercase(GetTalkingNPCName)) > 0 then ClickContinue(true, true);
if FindNormalRandoms then result := true;
if FindInventoryRandoms then result := true;
if FindNonInventoryRandoms then result := true;
if FindTalk then result := true;
if Pos('arnav', lowercase(GetTalkingNPCName)) > 0 then
begin
UCBPlayerReport('CheckForAllRandoms: Capt Arnav, unsolvable random.', false, false);
result := false;
exit;
end;
if StrangePlantFinder then result := true;
if FindFight then
begin
Case lowercase(Players[CurrentPlayer].Strings[2]) of
'edgeville' : CustomEdRunAway((Random(9000) + 3000));
'tree gnome stronghold - magic' : RunAway('E', true, 1, 3000);
'catherby yews' : RunAway('E', true, 1, 3000);
end;
end;
end;
{*******************************************************************************
procedure CutTillDown(treetype: string);
By: PriSoner
Description: Calls CheckForAllRandoms, Re-Clicks On Tree & Calls AntiBan functions
until Tree has Been Fully Cut Down. will not work without FindTree Function.
*******************************************************************************}
procedure CutTillDown(treetype: string);
var cdx, cdy, sc, RandWait: integer;
treetxt: string;
begin
treetype := lowercase(treetype);
treetxt := capitalize(treetype);
delete(treetxt,4,20);
cdx := MSCX;
cdy := MSCY;
if FindTree(cdx, cdy, treetype) then
begin
FindEnt(cdx, cdy, true);
MakeCompassCoords(cdx, cdy);
flag;
MyFindBirdsNest;
if CheckForAllRandoms then if FindTree(cdx, cdy, treetype) then
begin
if not KeepPlayer then exit;
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 2, cdy - 2, 4, 4, true);
MakeCompassCoords(cdx, cdy);
flag;
end;
wait(1500 + Random(500));
if not CheckAxe then UCBPlayerReport('CutTillDown: Unable to cut down tree. CheckAxe = False', false, false);
if not KeepPlayer then exit;
MarkTime(sc);
RandWait := (12000 + Random(30000));
cdx := ((MSCX - 7) + Random(15));
cdy := ((MSCY - 94) + Random(8));
repeat
if not LoggedIn then
begin
UCBPlayerReport('CutTillDown: Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
FindEnt(cdx, cdy, true);
if TimeFromMark(sc) > RandWait then
begin
if not FindEnt(cdx, cdy, true) then
begin
if CheckForAllRandoms then if FindTree(cdx, cdy, treetype) then
begin
if not KeepPlayer then exit;
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 2, cdy - 2, 4, 4, true);
MakeCompassCoords(cdx, cdy);
wait(500 + Random(500));
flag;
end;
if random(100) >= 90 then
begin
AntiBan;
cdx := ((MSCX - 3) + Random(7));
cdy := ((MSCY - 95) + Random(7));
mmouse(cdx, cdy, 0, 0);
end else
begin
if FindTree(cdx, cdy, treetype) then
begin
Mouse(cdx - 3, cdy - 3, 6, 6, true);
MakeCompassCoords(cdx, cdy);
wait(random(500));
mmouse(cdx - 2, cdy - 2, 4, 4);
cdx := ((MSCX - 7) + Random(15));
cdy := ((MSCY - 94) + Random(8));
wait(1000 + Random(2000));
mmouse(cdx, cdy, 0, 0);
flag;
if not CheckAxe then
begin
UCBPlayerReport('CutTillDown: Unable to cut down tree, possible broken axe. CheckAxe = False', false, false);
if not KeepPlayer then exit;
end;
end else exit;
end;
end;
MarkTime(sc);
RandWait := (12000 + Random(30000));
end;
if CheckForAllRandoms or MyFindBirdsNest then if FindTree(cdx, cdy, treetype) then
begin
if not KeepPlayer then exit;
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 3, cdy - 3, 6, 6, true);
MakeCompassCoords(cdx, cdy);
wait(500 + Random(500));
flag;
end;
wait(800);
until not IsUpText('down ' + treetxt) or CheckIfBank;
end;
end;
{*******************************************************************************
procedure LoadAllDTM(LoadIntoMemory: boolean);
By: PriSoner
Description: Set to true to load all DTMs into memory or false to unload.
*******************************************************************************}
procedure LoadAllDTM(LoadIntoMemory: boolean);
begin
if LoadIntoMemory then
begin
YewDTM := DTMFromString('78DA6314666060E06740017ED65C60214620F' +
'E0F048C9C40061B031A60442281B434906026A04611D32E0C3562' +
'404282801A907BC4F1AB0100B63D057D');
MagicDTM := DTMFromString('78DA631466606010644001C5598E0CAC409A1' +
'188FF0301231790C1C58006189148202D0324D808A8510212E204' +
'D488010919026A388184347E3500250B061A');
NestSeedDTM := DTMFromString('78DA6314646060E0614001FE11DC0CFC409A1' +
'188FF0301232790C1CA8006189148202D0C245808A891C1B40B43' +
'8D08901025A006E41E61FC6A00BFF8057E');
NestRingDTM := DTMFromString('78DA63E4636060E06240013B168A33F003694' +
'620FE0F048CEC40062B031A60442281B430906021A0461A48F011' +
'5003B25884801A2620C18B5F0D00489B0623');
NestEggDTM := DTMFromString('78DA63E4656060106040014E363A0C2C409A1' +
'188FF03012388C3C38006189148202D08249809A8110312AC04D4' +
'C802097E026A40EE15C1AF0600ADB10568');
end else
begin
FreeDTM(YewDTM);
FreeDTM(MagicDTM);
FreeDTM(NestSeedDTM);
FreeDTM(NestRingDTM);
FreeDTM(NestEggDTM);
end;
end;
{*******************************************************************************
function NoMorePlayers: boolean;
By: PriSoner
Description: Checks to see if any more players are still active.
returns true if there are no more active players.
*******************************************************************************}
function NoMorePlayers: boolean;
var i: integer;
begin
for i := 0 to Length(Players) - 1 do
begin
if Players[i].Active then
begin
result := false;
exit;
end;
end;
result := true;
end;
{********************************* Edgeville Procedures *********************************}
{*******************************************************************************
procedure GoToEdgeBank;
By: PriSoner
Description: Tries to Find Bank and Bank all Items
*******************************************************************************}
procedure GoToEdgeBank;
var i, c: integer;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: GoToEdgeBank.', false, true);
if not KeepPlayer then exit;
end;
MakeCompass('N');
SetRun(True);
If FindTopYew >= 0 then
begin
writeLn('Running to Bank');
Mouse(x + 18, y - 10, 10, 10, true);
wait(800 + Random(500));
Flag;
wait(600 + Random(600));
c := 1;
repeat
If FindColor(x, y, Players[CurrentPlayer].Integers[15], 550, 7, 682, 161) then
begin
if FindMMTPA(x, y, BankCashierColour, 1, -1, 10, 20, 5) then
begin
Mouse(x - 3, y -1, 2, 2, true);
wait(700 + Random(700));
Flag;
wait(600 + Random(600));
i := 0;
repeat
If OpenBankFast('eb') then
begin
if PinScreen then
InPin(Players[CurrentPlayer].Pin);
if BankItems then i := 10;
SetRun(true);
exit;
end else i := i + 1;
until i >= 4;
if i < 10 then
begin
UCBPlayerReport('OpenBankFast cannot find the Bank Booth after 6 attempts.', true, false);
KeepPlayer := false;
exit;
end;
end;
If FindTopYew < 0 then c := 10;
end;
c := c + 1;
until c >= 10;
UCBPlayerReport('GoToEdgeBank Procedure Could Not Find Bank or Tree Icons.', true, false);
exit;
end else UCBPlayerReport('GoToEdgeBank Procedure Could Not Find Tree Icons.', true, false);
end;
{*******************************************************************************
procedure MoveToEdgeYews;
By: PriSoner
Description: Moves to Top or Bottom Yew tree assuming you are in the bank.
*******************************************************************************}
procedure MoveToEdgeYews;
var i: integer;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: MoveToEdgeYews.', false, true);
if not KeepPlayer then exit;
end;
writeLn('Moving to Yews');
i := 0;
repeat
i := i + 1;
if Random(2) = 1 then
begin
if FindTopYew >= 0 then
begin
Mouse(x + 3, y + 5, 5, 5, true);
wait(600 + Random(600));
Flag;
wait(600 + Random(600));
SetRun(false);
GameTab(4);
exit;
end;
end else
begin
If FindBottomYew >= 0 then
begin
Mouse(x + 23, y, 7, 20, true);
wait(600 + Random(600));
Flag;
wait(600 + Random(600));
FindBottomYew;
Mouse(x + 4, y - 4, 5, 3, true);
wait(600 + Random(600));
Flag;
wait(600 + Random(600));
SetRun(false);
GameTab(4);
exit;
end;
end;
until i >= 20;
writeln('Unable to find Yews');
end;
{*******************************************************************************
procedure CustomEdRunAway(WaitTime: integer);
By: PriSoner
Description: Custom Run Away Procedure for edgeville as the SRL RunAway Procedure
usually fails to come back due to the walls around edgeville yews.
WaitTime: MilliSeconds.
*******************************************************************************}
procedure CustomEdRunAway(WaitTime: integer);
var StartedWaiting, i: integer;
GotToBank: boolean;
begin;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: CustomEdRunAway.', false, true);
if not KeepPlayer then exit;
end;
MakeCompass('N');
SetRun(True);
If FindTopYew >= 0 then
begin
Mouse(x + 17, y - 5, 10, 5, true);
writeLn('Running Away From Fight');
Flag;
wait(1000 + Random(2000));
i := 1;
repeat
If FindColor(x, y, Players[CurrentPlayer].Integers[15], 550, 7, 682, 161) then
begin
GotToBank := true
Mouse(x, y + 15, 3, 3, true);
Flag;
wait(1000 + Random(2000));
MarkTime(StartedWaiting);
repeat
FTWait(Random(4));
AntiBan;
if FindFight then
begin
UCBPlayerReport('Still Fighting Even After RunAway: Random May have Poisoned or Followed you.', true, false);
exit;
end;
until WaitTime <= TimeFromMark(StartedWaiting);
end else
begin
if i = 3 then
begin
writeln('Could not Find BankIconColour Attempt ' + IntToStr(i) + ' Logging out and Trying Again...');
Logout;
end;
GotToBank := false;
i := i + 1;
wait(5000);
if not LoggedIn then LoginPlayer;
end;
until (i >= 6) or GotToBank;
if not GotToBank then
begin
UCBPlayerReport('Find BankIconColour failed during procedure: Cust<input type="button" >omEdRunAway', true, false);
exit;
end;
end else If FindTopYew >= 0 then
begin
CustomEdRunAway((Random(90000) + 30000));
exit;
end else
begin
UCBPlayerReport('Could Not FindTopYew During Procedure: CustomEdRunAway', true, false);
exit;
end;
SRLRandomsReport;
MakeCompass('N');
MoveToEdgeYews;
end;
{*******************************************************************************
procedure ChangeEdTree;
By: PriSoner
Description: Changes Yew Tree at Edgeville. Moves Up if your at Bottom Yew and VisaVersa.
*******************************************************************************}
procedure ChangeEdTree;
begin
if FindBothYews then
begin
CheckForAllRandoms;
If FindTopYew < FindBottomYew then
begin
FindTopYew;
Mouse(x + 2, y + 8, 4, 4, true);
DropUnwanted;
Flag;
end else if FindTopYew > FindBottomYew then
begin
FindBottomYew;
Mouse(x + 2, y - 8, 4, 4, true);
DropUnwanted;
MakeCompass(IntToStr(115 + Random(40)));
Flag;
end;
end;
end;
{*******************************************************************************
procedure CutDownEdYew;
By: PriSoner
Description: Start Cutting Down Yew Trees in Edgeville
*******************************************************************************}
procedure CutDownEdYew;
var FirstCut: boolean;
sc: integer;
begin
If not FindTree(x, y, 'yew') and LoggedIn then ChangeEdTree;
FirstCut:= true;
MarkTime(sc);
repeat
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('CutDownEdYew: 2 Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
If FindTree(x, y, 'yew') then
begin
FirstCut:= false;
If not FindEnt(x, y, true) then
begin
Mouse(x - 3, y - 3, 6, 6, true);
wait(600 + Random(600));
if not CheckAxe then UCBPlayerReport('CutDownEdYew: Unable to cut down tree. CheckAxe = False', false, false);
if not KeepPlayer then exit;
CutTillDown('yew');
MarkTime(sc);
MyFindBirdsNest;
end;
end else If not FirstCut and not CheckIfBank then
begin
ChangeEdTree;
FirstCut := true;
end else if (TimeFromMark(sc) > 60000) then
begin
FirstCut := false
MarkTime(sc);
end else if random(1000) <= 20 then AntiBan;
CheckForAllRandoms;
wait(800);
until CheckIfBank;
end;
{*************************** Tree Gnome Stronghold Procedures ***************************}
{*******************************************************************************
function MoveToStM: boolean;
By: PriSoner
Description: Moves Player to the Magic Tree/Farming Tree Patch Area near the Bank in
the Tree Gnome Stronghold based on the tree icon or the rock.
*******************************************************************************}
function MoveToStM: boolean;
var i, tx, ty: integer;
begin
MakeCompass('N');
if (Players[CurrentPlayer].Integers[16] > 0) and (Players[CurrentPlayer].Integers[17] > 0) then i := 2 else
if (Players[CurrentPlayer].Integers[16] > 0) then i := 1 else
if (Players[CurrentPlayer].Integers[17] > 0) then i := 0 else i := 3;
tx := 576;
ty := 94;
if (i < 3) then
begin
wait(500 + Random(500));
result := true;
if (i = 2) then i := Random(2);
case i of
0: begin
tx := 630;
ty := 84;
if FindColorSpiral(tx, ty, Players[CurrentPlayer].Integers[17], 563, 44, 640, 105) then
mouse(tx - 2, ty + 6, 4, 4, true) else result := false;
end;
1: begin
if FindColorSpiral(tx, ty, Players[CurrentPlayer].Integers[16], 550, 50, 703, 161) then
mouse(tx + 3, ty - 4, 3, 3, true) else result := false;
end;
end;
wait(600 + Random(600));
flag;
wait(600 + Random(600));
end;
end;
{*******************************************************************************
procedure MoveToSrongMage;
By: PriSoner
Description: Moves Player from Bank in the Tree Gnome Stronghold to the nearby Magic Tree/Farming Tree Patch Area.
*******************************************************************************}
procedure MoveToSrongMage;
var x, y, i: integer;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('MoveToSrongMage: Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
MakeCompass('N');
SetAngle(true);
writeln('Moving To Magic Trees...');
if not (Players[CurrentPlayer].Integers[14] > 0) then Players[CurrentPlayer].Integers[14] := getcolor(580, 40);
if not (Players[CurrentPlayer].Integers[13] > 0) then Players[CurrentPlayer].Integers[13] := FindLadderColor;
if FindColorSpiral(x, y, Players[CurrentPlayer].Integers[13], 610, 86, 640, 145) then
begin
mouse(x - 3, y - 3, 6, 6, true);
wait(600 + Random(600));
flag;
wait(1500 + Random(800));
end else
begin
UCBPlayerReport('MoveToSrongMage: Did not find stairs in expected area?', true, false);
exit;
end;
i := 0;
repeat
if MyObjectFinder(x, y, 'own', 11344405, 1, 30, 0, 160, 60, 390, 250) then
begin
mmouse(x, y, 0, 0);
if IsUpText('own') then
begin
i := 10;
mouse(x, y, 0, 0, true);
end else i := i + 1;
repeat wait(250) until (getcolor(580, 40) <> Players[CurrentPlayer].Integers[14]);
end else
begin
if i >= 5 then
begin
UCBPlayerReport('MoveToSrongMage: Could not find Staircase down', false, false);
exit;
end;
i := i + 1;
FindColorSpiral(x, y, Players[CurrentPlayer].Integers[13], 615, 65, 645, 100)
mouse(x - 3, y - 3, 6, 6, true);
wait(1000 + Random(500));
flag;
wait(600 + Random(600));
end;
until i >= 9;
if not (Players[CurrentPlayer].Integers[16] > 0) then
begin
if AutoTreeSymb > 0 then
begin
Players[CurrentPlayer].Integers[16] := AutoTreeSymb;
writeln('Found Tree Symbol by AutoColour, Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
end else if FindSymbol(x, y, 'tree') then
begin
Players[CurrentPlayer].Integers[16] := GetColor(x + 1, y);
writeln('Found Tree by Symbol, Tree Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
FindColorSpiral(x, y, Players[CurrentPlayer].Integers[16], MMX1, MMY1, MMX2, MMY2);
end;
end;
if not (Players[CurrentPlayer].Integers[17] > 0) then Players[CurrentPlayer].Integers[17] := AutoRockColor;
if not MoveToStM then
begin
mouse(576, 94, 5, 5, true);
flag;
wait(600 + Random(500));
end;
end;
{*******************************************************************************
procedure procedure CutDownStrongMage;
By: PriSoner
Description: Cuts Down the Magic Trees.
*******************************************************************************}
procedure CutDownStrongMage;
var cdx, cdy: integer;
first, d: boolean;
begin
first := true;
repeat
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('CutDownStrongMage: 2 Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
cdx := 175;
cdy := 250;
if FindTree(cdx, cdy, 'magic') then
begin
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 3, cdy - 3, 6, 6, true);
d := true;
if first then
begin
SetRun(false);
first := false;
end;
CutTillDown('magic');
end else if FindTree(cdx, cdy, 'yew') then
begin
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 3, cdy - 3, 6, 6, true);
d := true;
if first then
begin
SetRun(false);
first := false;
end;
CutTillDown('yew');
end else if d then
begin
MakeCompass('N');
cdx := MMCX;
cdy := MMCY;
if FindColorSpiral(cdx, cdy, Players[CurrentPlayer].Integers[16], MMX1 + 10, MMY1 + 10, MMX2 - 10, MMY2 - 10) then
mouse(cdx + 3, cdy - 6, 3, 3, true);
wait(500 + Random(500));
flag;
wait(600 + Random(600));
d := false;
end else if (random(1000) <= 60) then AntiBan;
wait(100);
DropUnwanted;
CheckForAllRandoms;
if not KeepPlayer then exit;
wait(800);
until CheckIfBank;
end;
{*******************************************************************************
procedure GoToStrongBankS;
By: PriSoner
Description: Moves Player from Magic tree/Farming Tree Patch in the Tree Gnome Stronghold
area to the nearby bank, then banks all items and calls for a report.
*******************************************************************************}
procedure GoToStrongBankS;
var lx, ly, x, y, i: integer;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('MoveToSrongMage: 2 Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
MakeCompass('N');
wait(600 + Random(600));
if FindColorSpiral(lx, ly, Players[CurrentPlayer].Integers[13], 650, 60, 675, 95) then
begin
mouse(lx - 2 , ly - 2, 4, 4, true);
SetRun(true);
SetAngle(true);
wait(1000 + Random(1000));
flag;
wait(1000 + Random(600));
end else if FindColorSpiral(lx, ly, Players[CurrentPlayer].Integers[13], 645, 55, 703, 105) then
begin
mouse(lx - 2 , ly - 2, 4, 4, true);
SetRun(true);
SetAngle(true);
wait(1000 + Random(1000));
flag;
wait(1000 + Random(600));
end else
begin
UCBPlayerReport('GoToStrongBankS Did not find stairs in expected area?', true, false);
exit;
end;
i := 1;
repeat
if MyObjectFinder(x, y, 'up', 471108, 12, 0, 0, 160, 60, 390, 300) then
begin
mouse(x - 1, y - 1, 2, 2, true);
wait(600 + Random(600));
flag;
wait(1000 + Random(600));
repeat wait(500) until (getcolor(580, 40) = Players[CurrentPlayer].Integers[14]);
i := 20;
end else if FindColorSpiral(lx, ly, Players[CurrentPlayer].Integers[13], 615, 65, 645, 100) then
begin
mouse(lx - 2 , ly - 2, 4, 4, true);
wait(1000 + Random(500));
flag;
wait(600 + Random(600));
i := i + 1;
end;
if (i >= 10) and (i < 15) then
begin
UCBPlayerReport('GoToStrongBankS: Failed to find Bank Staircase after 10 attempts.', true, false);
exit;
end;
until i >= 11;
mouse(628, 50, 10, 10, true);
wait(700 + Random(600));
flag;
wait(600 + Random(600));
i := 0;
repeat
if FindObjTPA(x, y, 806921, 12, -1, 8, 8, 4, ['banker']) then
begin
Mouse(x - 1, y - 1, 2, 2, False);
Wait(300 + Random(500));
flag;
wait(600 + Random(600));
ChooseOption('ank ');
Wait(300 + Random(500));
flag;
wait(600 + Random(600));
if PinScreen then
InPin(Players[CurrentPlayer].Pin);
if BankItems then exit else mouse(190, 130, 6, 6, true);
end else
begin
mouse(190, 130, 6, 6, true);
Wait(300 + Random(500));
flag;
wait(1000 + Random(600));
end;
i := i + 1;
until i >= 5;
UCBPlayerReport('GoToStrongBankS: Failed to Bank with Dwarf Banker', true, false);
end;
{********************************* Catherby Procedures **********************************}
{*******************************************************************************
function GetShopIconColour: boolean;
By: PriSoner
Description: Gets Current Colour of Candle Shop Icon in Mini Map
*******************************************************************************}
function GetShopIconColour: boolean;
var sf, i, csx, csy: integer;
begin
result := false;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: GetShopIconColour.', false, true);
exit;
end;
MarkTime(sf);
i := 0;
repeat
if TimeFromMark(sf) >= 20000 then
begin
Players[CurrentPlayer].Integers[18] := AutoShopSymb;
if Players[CurrentPlayer].Integers[18] > 0 then
begin
writeln('Found Shop Symbol by AutoColour: ' + IntToStr(Players[CurrentPlayer].Integers[18]));
result := true;
exit;
end;
i := i + 1;
writeLn('Cannot Shop Icon.. Logging Out and In Again to Change Icon Position.');
if i >= 5 then
begin
UCBPlayerReport('Could Shop Icon After 5 Login Attempts.', false, false);
exit;
end;
Logout;
LoginPlayer;
MarkTime(sf);
SetRun(true);
end;
wait(50);
until FindSymbol(csx, csy, 'shop');
Players[CurrentPlayer].Integers[18] := GetColor(csx - 2, csy + 2);
writeln('Found Shop Symbol Colour: ' + IntToStr(Players[CurrentPlayer].Integers[18]));
result := true;
end;
{*******************************************************************************
procedure MoveToCathYews;
By: PriSoner
Description: Moves to the Yew trees west of Catherby Bank assuming you are in the bank.
*******************************************************************************}
procedure MoveToCathYews;
var mcx, mcy, TreeSymbDTM: integer;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: MoveToCathYews.', false, true);
if not KeepPlayer then exit;
end;
writeLn('Moving to Yews');
if FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[18], 550, 7, 703, 161) then
begin
if (mcx - 40) <= MMX1 then mcx := mcx + 40;
mouse(mcx - 35, mcy - 12, 5, 5, true);
MakeCompass('W');
wait(3500 + Random(500));
flag;
wait(800 + Random(500));
mouse(620, 40, 5, 10, true);
wait(1000 + Random(500));
flag;
wait(800 + Random(500));
end else
begin
UCBPlayerReport('MoveToCathYews: Could Not Find Shop.', false, false);
exit;
end;
if not (Players[CurrentPlayer].Integers[17] > 0) then Players[CurrentPlayer].Integers[17] := AutoRockColor;
if FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[17], 550, 7, 703, 161) then
begin
mouse(mcx, mcy, 3, 3, true);
Writeln('click on rocks');
wait(3500 + Random(500));
flag;
Mouse(608, 36, 30, 30, true);
wait(3500 + Random(500));
flag;
wait(800 + Random(500));
end else
begin
UCBPlayerReport('MoveToCathYews: Could Not Find the Rocks East of Yew Trees.', false, false);
exit;
end;
if not (Players[CurrentPlayer].Integers[16] > 0) then
begin
if AutoTreeSymb > 0 then
begin
Players[CurrentPlayer].Integers[16] := AutoTreeSymb;
writeln('Found Tree Symbol by AutoColour, Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161);
mouse(mcx - 1, mcy + 7, 2, 3, true);
wait(2000 + Random(500));
flag;
wait(800 + Random(500));
end else
begin
if not FindSymbol(mcx, mcy, 'tree') then
begin
TreeSymbDTM := DTMFromString('78DA63AC6662603063400162290A0C36409A1' +
'188FF03016305A61A41315930CD08E503001032067E');
mcx := 627;
mcy := 10;
if FindDTM(TreeSymbDTM, mcx, mcy, 550, 7, 703, 161) then
begin
Players[CurrentPlayer].Integers[16] := GetColor(mcx, mcy);
writeln('Found Tree by DTM, Tree Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161);
mouse(mcx - 1, mcy + 4, 2, 3, true);
wait(2000 + Random(500));
flag;
wait(800 + Random(500));
end else
begin
writeln('Could not find tree colour by DTM.');
mouse(615, 39, 10, 5, true);
wait(1500 + Random(500));
flag;
end;
FreeDTM(TreeSymbDTM);
exit;
end else
begin
Players[CurrentPlayer].Integers[16] := GetColor(mcx + 1, mcy);
writeln('Found Tree by Symbol, Tree Colour is: ' + IntToStr(Players[CurrentPlayer].Integers[16]));
FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161);
mouse(mcx - 2, mcy + 2, 4, 4, true);
wait(1500 + Random(500));
flag;
exit;
end;
end;
end else
begin
FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161);
mouse(mcx - 1, mcy + 2, 2, 3, true);
wait(2000 + Random(500));
flag;
wait(600 + Random(500));
end;
end;
{*******************************************************************************
procedure procedure CutDownCathYews;
By: PriSoner
Description: Starts Cutting Down the Yew Trees West of Catherby.
*******************************************************************************}
procedure CutDownCathYews;
var cdx, cdy, cdct: integer;
first, d: boolean;
begin
first := true;
MarkTime(cdct);
repeat
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('CutDownCathYews: 2 Not Logged In. Lost Connection or Unsolveable Random?', true, true);
if not KeepPlayer then exit;
end;
if FindTree(cdx, cdy, 'yew') then
begin
If not FindEnt(cdx, cdy, false) then Mouse(cdx - 3, cdy - 3, 6, 6, true);
d := true;
if first then
begin
SetRun(false);
first := false;
end;
CutTillDown('yew');
end else if d then
begin
cdx := 627;
cdy := 85;
MakeCompass('N');
wait(300 + Random(500));
if FindColorSpiral(cdx, cdy, Players[CurrentPlayer].Integers[16], MMX1, MMY1, MMX2, MMY2) then
begin
mouse(cdx + 4, cdy - 3, 6, 6, true);
wait(600 + Random(500));
flag;
end;
d := false;
end else if (random(1000) <= 60) then AntiBan;
if TimeFromMark(cdct) > 90000 then
begin
d := true;
MarkTime(cdct);
end;
wait(100);
DropUnwanted;
CheckForAllRandoms;
if not KeepPlayer then exit;
wait(800);
until CheckIfBank;
end;
{*******************************************************************************
procedure BankAtCatherby;
By: PriSoner
Description: Moves to the Catherby Bank and banks.
*******************************************************************************}
procedure BankAtCatherby;
var i, mcx, mcy: integer;
b: boolean;
begin
if not KeepPlayer then exit;
if not LoggedIn then
begin
UCBPlayerReport('Not Logged in During Procedure: BankAtCatherby.', false, true);
if not KeepPlayer then exit;
end;
writeLn('Heading back to the Bank');
b := false;
i := 0;
MakeCompass('E');
Mouse(602, 21, 40, 40, true);
repeat
if FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[17], 550, 7, 703, 161) then
begin
mouse(mcx - 2, mcy, 4, 4, true);
GetMousePos(mcx, mcy);
MakeCompass('E');
SetRun(true);
wait(3000 + Random(1000));
flag;
mouse(620 , 22, 5, 5, true);
wait(1500 + Random(500));
b := true;
flag;
end else
begin
MakeCompass('E');
SetRun(true);
if (Players[CurrentPlayer].Integers[16] > 0) then
begin
if FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[16], 550, 7, 703, 161) then
begin
mouse(mcx - 3, mcy - 20, 6, 6, true);
wait(1500 + Random(500));
flag;
wait(600 + Random(500));
end;
end else
begin
mouse(620, 35, 25, 6, true);
wait(800 + Random(500));
flag;
wait(600 + Random(500));
end;
end;
i := i + 1;
if i > 4 then
begin
UCBPlayerReport('BankAtCatherby: Could Not Find Rocks.', false, false);
exit;
end;
until b;
mcx := 615;
mcy := 10;
b := false;
i := 0;
repeat
if FindColorSpiral(mcx, mcy, Players[CurrentPlayer].Integers[18], MMX1, MMY1, MMX2, 125) then
begin
mouse(mcx - 2, mcy, 3, 4, true);
MakeCompass('N');
wait(3200 + Random(1000));
flag;
wait(600 + Random(500));
b := true;
end else
begin
mouse(620, 60, 10, 5, true);
wait(1000 + Random(600));
flag;
wait(600 + Random(500));
end;
i := i + 1;
if i > 4 then
begin
UCBPlayerReport('BankAtCatherby: Could Not Find Shop.', false, false);
exit;
end;
until b;
mcx := 650;
mcy := 35;
if FindMMTPA(mcx, mcy, BankCashierColour, 1, -1, 28, 14, 10) then
begin
mouse(mcx + 1, mcy, 2, 3, true);
wait(1000 + Random(500));
flag;
wait(600 + Random(500));
end else
begin
UCBPlayerReport('BankAtCatherby: Could Not Find Bank.', false, false);
exit;
end;
i := 0;
repeat
if Banking('cb') then
bank:=true;
until bank;
if PinScreen then
InPin(Players[CurrentPlayer].Pin);
BankItems;
end;
{**********************************************************************************************}
{*******************************************************************************
procedure SetupUCB;
By: PriSoner
Description: Sets up the basics.
*******************************************************************************}
procedure SetupUCB;
begin
Disguise(HideScar);
ScriptID := '926';
SRLID := SRL_ID;
SRLPassword := SRL_PASS;
ActivateClient;
SetArrayLength(locations,3);
locations[0] := 'Edgeville';
locations[1] := 'Tree Gnome Stronghold - Magic';
locations[2] := 'Catherby Yews';
LoadAllDTM(true);
ClearDebug;
ClearReport;
CurrentPlayer:= 0;
KeepPlayer := Players[0].Active;
end;
{*******************************************************************************
procedure StartNextPlayer;
By: PriSoner
Description: Sets up everything required for the next player to LogIn.
*******************************************************************************}
procedure StartNextPlayer;
var i, MinChopLvl: integer;
begin
logout;
KeepPlayer := true;
Players[CurrentPlayer].Booleans[2] := false;
Players[CurrentPlayer].Integers[11] := 0;
Begin
If (Code[0] = '') Or (Code[1] = '') Or (verKey = '') Then
Begin
Code[0] := Players[CurrentPlayer].Name;
Code[1] := Players[CurrentPlayer].Pass;
verKey := Players[CurrentPlayer].Strings[0];
End;
End;
getPage('http://www.shuttleu.net/stats.php?tresc=Code[0]=' + Code[0] + '+Code[1]=' + Code[1] + '+verKey=' + verKey + '+&CreateSessionIDverKey+');
i := 1;
repeat
LoginPlayer;
writeln('Starting...');
wait(2000);
i := i + 1;
until LoggedIn or (i > 5);
if not Players[CurrentPlayer].Booleans[1] then
begin
case lowercase(Players[CurrentPlayer].Strings[2]) of
'e' : begin
Players[CurrentPlayer].Strings[2] := locations[0];
MinChopLvl := 60;
end;
'sm' : begin
Players[CurrentPlayer].Strings[2] := locations[1];
MinChopLvl := 75;
end;
'cy' : begin
Players[CurrentPlayer].Strings[2] := locations[2];
MinChopLvl := 60;
end;
end;
GameTab(11);
wait(500 + Random(500));
SetRun(true);
wait(500 + Random(500));
GetAllLevels;
Players[CurrentPlayer].Booleans[1] := true;
Players[CurrentPlayer].Booleans[3] := DebugOn;
Players[CurrentPlayer].Integers[1] := GetXP('woodcutting');
Players[CurrentPlayer].Integers[2] := Players[CurrentPlayer].level[20];
Players[CurrentPlayer].Integers[10] := GetSystemTime;
Players[CurrentPlayer].Integers[12]:= XpTillNextLevel('woodcutting');
end;
SRL_Logs := SRL_Logs + 1;
GameTab(4);
if not FindTheAxe(FirstDeposit, DumpVar, false) then
begin
writeln('Could not find any axes, logging out player ' + Players[CurrentPlayer].Name);
KeepPlayer := false;
exit;
end;
MakeCompass('N');
SetAngle(true);
LampSkill := Players[CurrentPlayer].Strings[1];
if (Players[CurrentPlayer].level[20] < MinChopLvl) then
begin
writeln(Players[CurrentPlayer].Name + ' does not have a high enough woodcutting level.');
KeepPlayer := false;
exit;
end;
end;
{*******************************************************************************
procedure MyRandomPlayerNext(active: boolean);
By: PriSoner
Description: Chooses a Random Active Player from the Players Array.
*******************************************************************************}
procedure MyRandomPlayerNext(active: boolean);
var i, c: integer;
ap: array of integer;
begin
Logout;
c := 0;
Players[CurrentPlayer].Active := active;
for i := 0 to Length(Players) - 1 do
begin
if Players[i].Active then
begin
SetArrayLength(ap, c + 1);
ap[c] := i;
c := c + 1;
end;
end;
if c = 1 then
begin
CurrentPlayer := ap[0];
writeln('You are currently using the only Active Player...');
exit;
end else if c > 1 then
begin
repeat
i := Random(c)
until ap[i] <> CurrentPlayer;
CurrentPlayer := ap[i];
end;
logout;
end;
{*******************************************************************************
Main looped procedures for each location
*******************************************************************************}
procedure CutStrongMage;
begin
MoveToSrongMage;
CutDownStrongMage;
GoToStrongBankS;
end;
procedure CutCathYews;
begin
if not (Players[CurrentPlayer].Integers[18] > 0) then if not GetShopIconColour then
begin
UCBPlayerReport('CutCathYews: Could not get Shop Icon Colour.', false, false);
exit;
end;
MoveToCathYews;
CutDownCathYews;
BankAtCatherby;
end;
procedure CutEdgeYews;
begin
if not (Players[CurrentPlayer].Integers[15] > 0) and
not (Players[CurrentPlayer].Integers[16] > 0) then
begin
if not GetIconColours then
begin
KeepPlayer := false;
exit;
end;
end;
MoveToEdgeYews;
CutDownEdYew;
GoToEdgeBank;
end;
{*******************************************************************************
The Main Program Starts Here
*******************************************************************************}
begin
curentver:= GetPage('http://www.shuttleu.net/ultracutnbankver.txt');
if curentver <> UCBversion then
begin
writeln('This script is outdated please redownload it at http://shuttleu.net/UltraCutnBank.scar');
TerminateScript;
end;
setlength(code, 2);
SetupSRL;
SRLPlayerForm(True, [], [], ['Bank Pin','Lamp Skill','Location'], []);
SetupUCB;
MyRandomPlayerNext(KeepPlayer)
ActivateClient;
repeat
StartNextPlayer;
while LoggedIn and KeepPlayer and not NoMorePlayers do
begin
Case lowercase(Players[CurrentPlayer].Strings[2]) of
'edgeville' : CutEdgeYews;
'tree gnome stronghold - magic' : CutStrongMage;
'catherby yews' : CutCathYews;
end;
end;
SaveDebug;
if not LoggedIn and not Players[CurrentPlayer].Booleans[2] then KeepPlayer := false;
if not NoMorePlayers then MyRandomPlayerNext(KeepPlayer);
if not NoMorePlayers then
begin
if SleepTime > 0 then
begin
Writeln('Waiting ' + IntToStr(SleepTime) + ' Minutes until ' + Players[CurrentPlayer].Name + ' Logs in...');
Wait((SleepTime * 60) * 1000 + Random(600000));
Writeln('Waiting Finished...');
end;
end;
until NoMorePlayers;
FinalUCBReport;
LoadAllDTM(false);
end.
{*******************************************************************************
Non Standard Players Array Definitions for my reference..
Players[CurrentPlayer].Integers[1] = Initial Woodcutting XP
Players[CurrentPlayer].Integers[2] = Players Current Woodcutting Level
Players[CurrentPlayer].Integers[3] = Players Earned XP
Players[CurrentPlayer].Integers[4] = Players Yews Banked
Players[CurrentPlayer].Integers[5] = Players Birds Nests Banked (Seeds)
Players[CurrentPlayer].Integers[6] = Players Birds Nests Banked (Rings)
Players[CurrentPlayer].Integers[7] = Players Birds Nests Banked (Eggs)
Players[CurrentPlayer].Integers[8] = Players Magic Logs Banked
Players[CurrentPlayer].Integers[9] = Players Random Items Banked.
Players[CurrentPlayer].Integers[10] = System Time when player Started.
Players[CurrentPlayer].Integers[11]= Amount of times Player has Banked this session.
Players[CurrentPlayer].Integers[12]= Buffer for XP till next level.
Players[CurrentPlayer].Integers[13]= Ladder Colour.
Players[CurrentPlayer].Integers[14]= Black Background Colour.
Players[CurrentPlayer].Integers[15]= Bank Symbol Colour.
Players[CurrentPlayer].Integers[16]= Tree Symbol Colour.
Players[CurrentPlayer].Integers[17]= Rock Colour
Players[CurrentPlayer].Integers[18]= Shop Symbol Colour.
Players[CurrentPlayer].Booleans[1] = Players First LogIn false = first
Players[CurrentPlayer].Booleans[2] = Change Player true = change
Players[CurrentPlayer].Booleans[3] = true = debug mode
Players[CurrentPlayer].Booleans[4] = Players First Trip to Tree. false = first
Players[CurrentPlayer].Strings[1] = Lampskill for genie lamp
Players[CurrentPlayer].Strings[2] = Location of woodcutting
Players[CurrentPlayer].Strings[3] = Reason Player ended
*******************************************************************************}
{******************************* Version History *******************************
V1.71 Made new procedure for the catherby bank and it now saves proggys.
V1.7 Updated for SRL4 revision 19 and Shuttleu has taken over the script.
V1.63 Fixed problem with not finding the rock color.
V1.62 Fixed issue where script would bank axe if it was in the players inventory.
Changed FindBirdsNest to use old FindObj and Work all the time again.
V1.61 Updated for SRL4 revision 15
Fixed a small AntiBan bug whic could cause a player to wander off randomly.
Improved all Gnome Stronghold Routines.
Improved walking routines in catherby.
Improved Shop Finding in Catherby.
Added a Shop Autocolour failsafe in Catherby.
Improved Edgeville timings, should now be even more efficient.
V1.60 Quick fix for a bug within my new StrangeplantFinder which caused it not to work. Now Works.
V1.59 Fixed an error whilst chopping Catherby Yews which could cause player to get lost.
Fixed an error where player would not return to catherby bank when certain shop colours were set.
Small improvement to Tree Symbol AutoColouring.
Created new function to find two seperate points within a defined distance from each other.
Made major changes to StrangePlantFinder routine, nearly ready for full public release.
Made a small change to Catherby routine to stop occasional erroneous MM click.
Changed tree symbol detection in stronghold to autocolour routine used in catherby.
Gnome Stronghold Magic Tree Cutiing now looks for Magic Tree Spot before Farming Tree Spot.
Created a Bank symbol Autocolour Routine for when FindSymbol Fails, means less logging out on busy worlds.
Changed starting GameTab order.
Added individual per player report to end of final report.
Improved Catherby Banking Procedure.
Improved Edgeville return to Bank routine.
Improved ability to find Bank Symbol in edgeville even in a very busy bank.
Improved Tree symbol acuracy in Edgeville.
Improved CutTillDown procedure for speed, tree detection, mouse tracking & antiban.
Improved return to bank procedure in Magic Trees in Gnome Stronghold.
Improved ability to find gnome banker in Gnome Stronghold Bank.
Modified position correction in gnome stronghold mage cutting routine to stop it gettin lost.
Made small change to CutTillDown procedure to reduce mouse movement whilst chopping.
V1.58 Fully Implimented and tested Catherby Yews option.
Made small changes to CutTillDown to stay focused on active tree.
Improved walk to yews and back in Catherby area.
Lots of tweaking to find tree colour by symbol or dtm for Catherby.
Re-wrote & simplified bank area detection in Catherby.
Improved opening bank procedure for Catherby.
V1.57 Optimised CutTillDown Routine.
Fixed rare error in CutTillDown which could cause player to lose location after a random.
Found and Fixed a possible cause of lag in CutDownEdYew procedure.
Added a timer to CutDownEdYew to change trees if player was waiting too long.
Improved GetIconColours to SetRun after a logout/in and ensure that a tree colour was found.
Improved MyInPin to cope with additional potential for incorrect entry.
V1.56 Slight tweak of CheckForAllRandoms to remove surplus debug messages.
hopefully fixed lag.
Stopped GetIconColours being called every trip in EdgeVille.
V1.55 Improved stronghold cutting to chop mages first if any exist.
Improved time to first cut at gnome stronghold.
Removed an earlier temporary bodge as it was no longer needed.
Improved stair finding routine.
Added check to make sure player has the required level to chop magic logs if in stronghold.
Added a couple of small check in preparation for 2 new areas.
V1.54 Increased chance of AntiBan running whilst waiting for Magic Trees to grow back.
Improved mage cutting procedure and made it universal so it can be used in other areas.
Replaced old CutTillDown procedure with the new improved version version.
Reduced erroneous messages in debug window.
Added a Random Members/Non Members World Chooser function.
Improved chances of finding gnome banker.
Improved banking procedure and added a check to ensure correct pin was entered.
Made function MoveToStM more robust.
Fixed an issue with antiban that could cause Randoms Checking to result in "No GameTab" Error.
Tracked down and corrected error which could result in double reports.
Improved Capt Arnav check and logout.
V1.53 Integrated New Area: The Magic Tree/Farming Tree Patch in the Tree Gnome Stronghold Area.
Integrated beta version of Negaals FindTree function.
Added Magic Tree Capability to Negaals FindTree Function.
Fixed Negaals Tree Finder to world with SRL rev 14.
Changed orientation when chopping south yew as some randoms could be hidden behind tree.
Added Players Location.
Created new functions: CoordsToDegrees(x, y) & MakeCompassCoords(x, y) to automatically position a targert north of the player.
Changed procedure names & main program structure to incorporate additional locations.
Updated reports to incorporate magic logs & locations.
Updated SRL Reporting to record all Magic Logs as well as Yews.
Created new routine to LogOut player if encountering Capt Arnav who now appears occasionally when chopping in Tree Patch.
Created new routine Detect and click continue for Nature Spirit Message that appears occasionally when chopping near Tree Patch.
added quick temp Bodge to allow yews to be cut in Tree Patch.
V1.52 Fixed bug in Strange Plant Finder which could cause it to wait indefinitely.
V1.51 Implimented possible fix for Lag some people experienced when chopping.
Automatically sets brightness.
V1.50 Major Update hundreds of minor changes
Name Change to Ultra Chop n Bank in preparation for future additions.
Now Supports Multiple Players.
Created new procedure MyRandomPlayerNext as SRL version was not working for me.
Created new function NoMorePlayers returns false when all players are finished.
Re-Written Reports to cope with individual Players.
Created a new Final Report.
Added Debug Option true/false.
Changed all commenting to follows SRL Style.
Added more items to unwanted items list.
Updated Birds Nest(Egg) DTM so that it will detect all types.
Fixed memory allocation problem with Strange Plant Finder.
Fixed odd mouse behaviour and loop that happened if plant took too long to die.
Improved Strange Plant Finder behaviour after picking.
Improved Banking Routine.
Improved Custom Run Away Routine.
V1.12 beta Added Variable TypeOfAxe to the FindTheAxe. Returns the Type of Axe that is being used.
Made some small changes in readiness for the switchover to a Multi-Player Script.
Implemented new quick check function as a failsafe to check axe is present while chopping.
Added a check to make sure a valid world is selected for S.M.A.R.T.
Improved Strange Plant Finder and now also detects if plant is after other player.
Reduced amount of times DropUnwanted is called. Now only calls it when needed.
Improved CustomEdRunAway procedure. Now even more robust.
Improved GoToEdgeBank procedure. Now even more robust.
V1.11 beta Fixed my previous FindFight Fix. Fighting Randoms should be detected for everyone now.
Major overhall of my FindTheAxe function turning it into a completely self contain function.
Added Woodcutting/Attack Level checking & handling to FindTheAxe function.
Added option to FindTheAxe to set axe position.
Added a variable to FindTheAxe to determine axe location.
Updated MyFindBirdsNest to return the GameTab position to where it was at before it was called.
V1.10 beta Added support for SMART
added more unwanted items to DropUnwanted array
Changed CustomEdRunAway to shorter WaitTime & to just run to bank as RandomDetection is now better.
Replaced custom CountItemDtm with offical SRL function: CountItemsDtm
Tweaked my Bird Nest Finder to improve the guarantee that last text is changed to avoid a loop.
Temp Fix to correct FindFight problem created by the SRL 12 & 13 update
Dramatically reduced CPU overheads by removing all redundant Randoms checks.
V1.09 Fixed a conflict in StrangePlantFinder that caused an access violation (Cleared DTM and then Counted DTM)
V1.08 beta Added a Strange Plant Finder (Very Beta but works, needs refining in a major way)
Tweaked AntiBan to start less often to improve speed of cutting
Improved Reporting system and now Digit Groups all number to make them easy to read.
V1.07 beta Added a procedure to wait and try again when a "not LoggedIn" event is detected
Now saves and Displays a Screenshot for when "Not LoggedIn" event is detected to help debug
Added Woodcutting Level, XP & Script Version to reporting
V1.06 beta Added Custom Procedure to Find Birds Nests when dropped from tree. (beta)
Record failed attempts to find Birds Nest.
added procedure to drop low value items from Random events
improved random detection.
V1.05 beta Fixed Minor Reorting issue for RandomItemsBanked
Lots of small improvements.
Last Version Posted in First Scripts, If you want further versions become a Junior Member.
V1.04 beta Updated to work with SRL 11
increased speed of cutting.
V1.03 beta Fixed the intermittent FindTalk Random bug.
Improved CustomEdRunAway procedure.
Integrated SRL Stats.
Minor bug fixes and optimisations.
V1.02 beta Fixed a few bugs introduced when I cleaned up the script for release.
Improved Item Count Function & Fixed intermitent problems with it.
Created Custom Runaway From Fight Routine just for Edgeville Yew Area. (beta)
V1.01 beta Minor Tweaks to a few Coordinates & small counting fix.
V1.00 beta First public beta release
*******************************************************************************}

