//////////////////////////////////////////////////
/////// ///////
// //
// Smurg's AIO Fletcher V2.01 //
// -------------------------------- //
// | Fill in lines 61-107 | //
// -------------------------------- //
// //
/////// ///////
////////////////////////////////////////////////////////////////////////////////
/////// ///////
// //
// Release Notes: //
// Version 1.00: //
// + Wrote original script and personally tested //
// Version 1.10: //
// + Added in breaks and fixed antiban //
// Version 1.20: //
// + Added final report and fixed formatting, break handler, //
// and various errors //
// Version 1.30: //
// + Added stringing support //
// + Pulled ID #'s out and replaced using constants //
// + Replaced waits with failsafe loops ending on conditions //
// + Restructured the Mainloop from inventory counts to by each //
// 'activity' and individual checks //
// Version 2.00: //
// + Added arrow support. (Darts and Bolts soon!) //
// + Added some more antiban. //
// Version 2.01: //
// + Updated DTMs //
// //
// Future Additions: //
// + Darts/Bolts Support //
// //
// Known Bugs: Sometimes SRL Anti-Ban functions makes it walk (should //
// relocate to a bank if on screen though. //
// //
/////// ///////
////////////////////////////////////////////////////////////////////////////////
// //
// Instructions: //
// //
// + Start with knife in first inventory spot if cutting wood. ///////
// + Only cutting/stringing logs and arrows are supported so far, no bolts/darts. //
// + For arrows/darts/bolts: Start with any items you need in inventory, it will //
// make the headless for you and then attach the tips. //
// ///////
////////////////////////////////////////////////////////////////////////////////
program AIOFletcher; //
{$i SRL/SRL/misc/smart.scar} //
{$i SRL/SRL.scar} //
{$i Reflection/Reflection.Simba} //
const //
//////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//////////////////// Global Settings /////////////////////
///////////////////////////////////////////////////////////
World = 67; // World # to play on //
DebugMode = True; // Output debugging statements? //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
////////// Break Handler for Single Player Only ///////////
////////////////////////////////////////////////////////////////////////////////
BreakEvery = 220; // Break every ... (+/- 'BreakEveryRand' minutes) //
BreakEveryRand = 40; // +/- amount for BreakEvery //
//----------------------------------------------------------------------------//
BreakFor = 10; // Break for ... (+/- 'BreakForRand' minutes) //
BreakForRand = 5; // +/- amount for BreakFor //
////////////////////////////////////////////////////////////////////////////////
procedure DeclarePlayers;
var
x: Integer;
begin
HowManyPlayers := 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
with Players[0] do
begin
Name := '';
Pass := '';
Nick := '';
Pin := '';
Active := True;
//----------------------------------------------------------------------------------------------------
Integers[0] := 99999; // Items (Logs, Arrows, Darts, etc.) to fletch before switching players
// If using one player, leave Integers[0] blank or equal to Integers[1]
//----------------------------------------------------------------------------------------------------
Integers[1] := 99999; // Items (Logs, Arrows, Darts, etc.) to fletch before stopping player.
//----------------------------------------------------------------------------------------------------
Strings[0] := 'Cut'; // Activity ('Cut'/'String'/'Arrows'/'Darts'/'Bolts')
//----------------------------------------------------------------------------------------------------
Strings[1] := 'Willow'; // Cutting/Stringing: ('Normal'/'Oak'/'Willow'/'Maple'/'Yew'/'Magic')
// Arrows: ('ABronze'/'AIron'/'ASteel'/'AMithril'/'ABroad'/'AAdamant'/'ARune'/'ADragon')
// Darts: ('DBronze'/'DIron'/'DSteel'/'DMithril'/'DAdamant'/'DRune'/'DDragon')
// Bolts: ('BBronze'/'BIron'/'BSilver'/'BSteel'/'BMithril'/'BAdamant'/'BRune'/'BBroad')
// Headless: Just for making headless arrows, no tips added.
//----------------------------------------------------------------------------------------------------
Strings[2] := 'Long'; // Cutting/Stringing: ('Long'/'Short'/'Stock'/'Shaft') (Stringing only supports longbows.)
// Arrows, Darts, Bolts: Leave as ''
//----------------------------------------------------------------------------------------------------
Strings[3] := 'lb'; // Bank location.
// veb - Varrock East Bank
// vwb - Varrock West Bank
// fwb - Falador West Bank
// feb - Falador East Bank
// lb - Lumbridge Bank
// db - Draynor Bank
// akb - Al-Kharid Bank
// seb - Seers Bank
// ctb - Catherby Bank
// eb - Edgeville Bank
// fgb - Fishing Guild Bank
// mc - Moonclan Bank
// yb - Yanille Bank
// da - Duel Arena Bank
// asb - Ardougne South Bank
// pc - Pest Control Bank
end; {
with Players[1] do
begin
Name := '';
Pass := '';
Nick := '';
Pin := '';
Active := True;
//----------------------------------------------------------------------------------------------------
Integers[0] := 99999; // Items (Logs, Arrows, Darts, etc.) to fletch before switching players
// If using one player, leave Integers[0] blank or equal to Integers[1]
//----------------------------------------------------------------------------------------------------
Integers[1] := 99999; // Items (Logs, Arrows, Darts, etc.) to fletch before stopping player.
//----------------------------------------------------------------------------------------------------
Strings[0] := 'Cut'; // Activity ('Cut'/'String'/'Arrows'/'Darts'/'Bolts')
//----------------------------------------------------------------------------------------------------
Strings[1] := 'Willow'; // Cutting/Stringing: ('Normal'/'Oak'/'Willow'/'Maple'/'Yew'/'Magic')
// Arrows: ('ABronze'/'AIron'/'ASteel'/'AMithril'/'ABroad'/'AAdamant'/'ARune'/'ADragon')
// Darts: ('DBronze'/'DIron'/'DSteel'/'DMithril'/'DAdamant'/'DRune'/'DDragon')
// Bolts: ('BBronze'/'BIron'/'BSilver'/'BSteel'/'BMithril'/'BAdamant'/'BRune'/'BBroad')
//----------------------------------------------------------------------------------------------------
Strings[2] := 'Long'; // Cutting/Stringing: ('Long'/'Short'/'Stock'/'Shaft') (Stringing only supports longbows.)
// Arrows, Darts, Bolts: Leave as ''
//----------------------------------------------------------------------------------------------------
Strings[3] := 'lb'; // Bank location.
// veb - Varrock East Bank
// vwb - Varrock West Bank
// fwb - Falador West Bank
// feb - Falador East Bank
// lb - Lumbridge Bank
// db - Draynor Bank
// akb - Al-Kharid Bank
// seb - Seers Bank
// ctb - Catherby Bank
// eb - Edgeville Bank
// fgb - Fishing Guild Bank
// mc - Moonclan Bank
// yb - Yanille Bank
// da - Duel Arena Bank
// asb - Ardougne South Bank
// pc - Pest Control Bank
end;}
for x := 0 to (HowManyPlayers - 1) do
begin
Players[x].Integers[90] := 0; // Local loads done per player.
Players[x].Integers[91] := 0; // Global loads done per player.
Players[x].Integers[92] := 0; // Time ran per player.
Players[x].Integers[93] := 0; // Sleep time per player.
// 80: FeathersSlot // 94: Headless Arrow XP
// 81: ShaftSlot // 95: Unstrung Bow ID #
// 82: HeadlessSlot // 96: Finished Bow ID #
// 83: TipsSlot // 97: XP per log
// 98: Wood/Tip ID #
end;
if(HowManyPlayers = 1)then Players[CurrentPlayer].Integers[0] := Players[CurrentPlayer].Integers[1];
end;
var
StartTime, EndTime, Wrong: Integer;
BreakStartTime, SBreakEvery, SBreakFor: Integer;
const
//////////////////
// ID's //
/////////////////////////
Knife = 946; //
BowString = 1777; //
Feathers = 314; //
Shafts = 52; //
Headless = 53; //////////////////////////////////////////////
ABronze = 39; AIron = 40; ASteel = 41; AMithril = 42; //
ABroad = 13278; AAdamant = 43; ARune = 44; ADragon = 11237; //
DBronze = 819; DIron = 820; DSteel = 821; DMithril = 822; //
DAdamant = 823; DRune = 824; DDragon = 11232; //
BBronze = 9375; BIron = 9377; BSilver = 9382; BSteel = 9378; //
BMithril = 9379; BBroad = 13279; BAdamant = 9380; BRune = 9381; //
/////////////////////////////////////////////////////////////////////
// Colors //
/////////////////////////
WhBorder = 16777215; //
OrText = 2070783; //
/////////////////////////
////////////////////////////////////////////////////////////////////////////////
procedure RWait(WaitTime: Integer); //
begin //
Wait(WaitTime + Random(WaitTime / 5)); //
end; //
////////////////////////////////////////////////////////////////////////////////
procedure MC(x, y, rx, ry: Integer; Left: Boolean); //
begin //
Mouse(x + RandomRange(-rx,rx), y + RandomRange(-ry,ry), 0, 0, Left); //
end; //
////////////////////////////////////////////////////////////////////////////////
procedure Debug(Msg: String); //
begin //
if(DebugMode)then //
Writeln(Msg); //
end; //
////////////////////////////////////////////////////////////////////////////////
procedure Bye(Msg: String); //
begin //
Players[CurrentPlayer].Active := False; //
Players[CurrentPlayer].Strings[99] := Msg; //
Logout; //
end; //
////////////////////////////////////////////////////////////////////////////////
function WhiteBorder(x, y: Integer): Boolean;
var
i, n, m: Integer;
begin
Debug('Selecting White Border');
Result := False; i := 0;
repeat
if(FindColorSpiralTolerance(n, m, WhBorder, x - 8, y - 8, x + 8, y + 8, 1))then
Result := True
else begin
MC(x, y, 6, 6, True);
Wait(200 + Random(100));
end;
Inc(i);
until((i > 2) or (Result = True))
end;
function OrangeText: Boolean;
var
i, x, y: Integer;
begin
Debug('Selecting Orange Text');
Result := False;
repeat
Wait(50);
if(FindColorSpiralTolerance(x, y, OrText, MCX1, MCY1, MCX2, MCY2, 2))then
Result := True;
Inc(i);
until((i > 100) or (Result = True))
end;
procedure TakeBreak;
var
i, StartBreak: Integer;
begin
Logout;
StartBreak := GetSystemTime;
Debug('Taking a break for ' + IntToStr(SBreakFor div 1000 div 60) + ' minutes.');
repeat
Wait(1000);
Inc(i);
if((i > 120) and ((SBreakFor - (GetSystemTime - StartBreak)) > 5000))then
begin
i := 0;
Debug('Waking up in ' + IntToStr((SBreakFor - (GetSystemTime - StartBreak)) div 1000 div 60) + ' minutes.');
end;
until(SBreakFor < (GetSystemTime - StartBreak))
Debug('Waking up');
LogInPlayer;
IncEx(Players[CurrentPlayer].Integers[93], SBreakFor);
BreakStartTime := GetSystemTime;
SBreakEvery := (BreakEvery + RandomRange(-BreakEveryRand, BreakEveryRand)) * 60 * 1000;
SBreakFor := (BreakFor + RandomRange(-BreakForRand, BreakForRand)) * 60 * 1000;
Wait(6000 + Random(6000));
end;
procedure AntiBan;
begin
case Random(500) of
0..4: Gametab(RandomRange(tab_Combat, tab_Notes));
5..14: RandomRClick;
15..47: SleepAndMoveMouse(1000+ Random(1200));
48..50: BoredHuman;
51..60: HoverSkill('fletching', False);
61..100: IdleTime(2000, 1000, 0.2);
end;
end;
procedure SoftAntiBan;
begin
case Random(500) of
0..10: RandomRClick;
11..50: SleepAndMoveMouse(RandomRange(200, 1200));
51..85: IdleTime(1000, 500, 0.2);
end;
end;
procedure AFKAntiBan;
begin
Wait(30000 + Random(50000));
end;
function GetDTM(Item: string): Integer;
begin
case Lowercase(Item) of
'normal', 'regular': Result := DTMFromString('mlwAAAHicY2dgYDADYnsg1gNiL' +
'SBWB2ILIHYE4hwgLgDiQiDOAuJiIC6Fsr0sFBmSvbQZWrKsgD wmFMwDJGEYH' +
'TDiwVAAAPZKB1Q=');
'oak': Result := DTMFromString('mlwAAAHicY2dgYEgC4mwgDgPiGCAOBuJ0qB g' +
'I5wNxIRBXAHEuEJcAcRYQV0abMrSlWjNMKQfpYELBPEAShtEB Ix4MBQDr7gl6');
'willow': Result := DTMFromString('mrAAAAHic42BgYOgF4qlA3A7EjUBcjyQ2HY h' +
'zgDgPiIuAOBuIi4G4DIhLgDgTiI11+RmcrUUYIoKsgTwmDMwD JGEYG2AkgGE' +
'AABoVCgQ=');
'maple': Result := DTMFromString('mrAAAAHic42BgYNgBxIeAeBMQrwPitUC8GY j' +
'3AvERIM4B4gIgLgTibCAuBeIKKJ0FxM46nAxxdrwM5SEqQB4T BuYBkjCMDTA' +
'SwDAAAP21C44=');
'yew': Result := DTMFromString('mrAAAAHic42BgYHgKxO+B+B4Q3wLia0B8F4 i' +
'fA/FHIM4B4gIgLgTiLCi7DIpBfDN1dgYfc26GwmgjII8JA/MASRjGBhgJYBg' +
'AAL7lDMM=');
'magic': Result := DTMFromString('mlwAAAHicY2dgYBBiZGBgB2J5IBYGYlkg5g F' +
'iFiDOBcqXAHEOEJcBcSkQV0L5EYGGDIdOn2AI9tVnyEywBoow wTEPkETGyIA' +
'RD4YCAElYCOM=');
'bow string': Result := DTMFromString('mlwAAAHicY2dgYLBjhGAvIDYEYjcgdgViU' +
'yDOBcqXA3EREGcCcQUDRAyEs1OC4DgqyAYowgTHPEASGSMDRj wYCgCv8Qlf');
'umaple': Result := DTMFromString('mggAAAHicY2NgYDjKyMBwHogPAvFJID4Lx' +
'GeA+AFQ7h0Q3wXiR0D8AojfAHF6TCRDeXY6Q4S/D0NDcT5QhAmMeYAkMoY' +
'BRhwYAgBw5A8Z');
'uyew': Result := DTMFromString('mlwAAAHicY2dgYLAEYjsgdgBiZyA2BWJHI' +
'LYFYh5GBgYBIBYDYikg5gRiYSDmBeL0SD6GibUiDHW5QmDMwM AExzwgvUg' +
'YGTDiwVAAAHFnBlg=');
'umagic': Result := DTMFromString('mggAAAHicY2NgYEgD4iQgzoLiXCDOA2IeR' +
'gYGDiDmA2JhIBYHYikgVspPY5Dw92BQzE5iEDAzZJAK82eQDP Ri4AHpwYI' +
'ZcWAIAACCoge2');
else
begin
Bye('Wrong DTM selected.');
Exit;
end;
end;
end;
procedure BankDTM(Item: String; Num: Integer);
var
i, x, y, DTM_OBJ, Start, StartInv: Integer;
begin
if(not(LoggedIn))then Exit;
DTM_OBJ := GetDTM(Item);
repeat
RWait(75);
if(i = 85)then
MMouse(300, 50, 100, 45);
if((i > 90) and (i < 94))then
begin
FreeDTM(DTM_OBJ);
DTM_OBJ := GetDTM(Item);
CloseBank;
R_OpenBankBooth(Players[CurrentPlayer].Strings[3]);
Wait(350 + Random(500));
end;
if(i > 100)then
begin
CloseBank;
Logout;
FreeDTM(DTM_OBJ);
Bye('Couldnt find ' + Item + ' Logs.');
Exit;
end;
Inc(i);
until(FindDTM(DTM_OBJ, x, y, MSX1, 80, MSX2, MSY2))
FreeDTM(DTM_OBJ);
i := 0;
Wait(50 + Random(150));
MC(x, y, 5, 5, False);
Wait(250 + Random(300));
StartInv := InvCount;
if(Num = 28)then
begin
ChooseOption('ithdraw-All but');
RWait(300);
Exit;
end else
begin
if(OptionsExist(['draw-' + IntToStr(num)], False))then
begin
ChooseOption('draw-' + IntToStr(num));
Wait(150 + Random(450));
end else
begin
ChooseOption('draw-X');
DTM_OBJ := DTMFromString('mwQAAAHic42QAAkYGhhtA6g4QawLZekAsAs RvgPxbQKwA' +
'ZE8C4ilA3APEU4G4HyoGwhOAeCIjA9UAIxEYDgCBqglB');
Start := GetSystemTime;
repeat
RWait(100);
if((GetSystemTime - Start) > 7500)then
begin
FreeDTM(DTM_OBJ);
Exit;
end;
until((FindDTM(DTM_OBJ, x, y, 200, 380, 320, 420)))
FreeDTM(DTM_OBJ);
Wait(150 + Random(450));
TypeSend(IntToStr(Num));
end;
end;
repeat
RWait(50);
if(i > 150)then
Break;
Inc(i);
until(InvCount > StartInv)
i := 0;
Wait(100 + Random(250));
end;
{procedure Stats;
begin
Debug('Sending Updated Stats');
if(not(SRLStats_UserID = ''))then
begin
Stats_SendReport;
Stats_ManageAccounts;
end;
end;}
{procedure SetupStats;
begin
Stats_UserID := SRLStats_UserID;
Stats_Password := SRLStats_Password;
Stats_ScriptID := '91';
Debug('Setup Stats With Website');
end;}
procedure CutLogs;
var
i, r, Inv, LogCount, Num, Start: Integer;
begin
if(not(LoggedIn))then Exit;
if(R_BankScreen = False)then
begin
Inv := R_CountItemID(Players[CurrentPlayer].Integers[98]);
if(Inv < 27)then
begin
Inc(Wrong);
Exit;
end;
if(not(WhiteBorder(580, 230)))then
Inc(Wrong)
else begin
Debug('Clicking Knife onto Wood');
Wait(300 + Random(300));
case Random(6) of
0..3: MC(625, 225, 7, 7, True);
4: MC(580, 265, 7, 7, True);
5: MC(625, 265, 7, 7, True);
end;
Wait(300 + Random(300));
if(not(OrangeText))then
Inc(Wrong)
else begin
Debug('Clicking Orange Text');
Wait(200 + Random(300));
case LowerCase(Players[CurrentPlayer].Strings[1]) of
'normal', 'regular': begin
case LowerCase(Players[CurrentPlayer].Strings[2]) of
'shaft': MC(110, 425, 25, 15, True);
'short': MC(210, 425, 25, 15, True);
'long': MC(310, 425, 25, 15, True);
'stock': MC(410, 425, 25, 15, True);
end;
end;
'oak', 'willow', 'maple', 'yew': begin
case LowerCase(Players[CurrentPlayer].Strings[2]) of
'short': MC(160, 425, 25, 15, True);
'long': MC(260, 425, 25, 15, True);
'stock': MC(360, 425, 25, 15, True);
end;
end;
'magic': begin
case LowerCase(Players[CurrentPlayer].Strings[2]) of
'short': MC(210, 425, 25, 15, True);
'long': MC(310, 425, 25, 15, True);
end;
end;
end;
repeat
Wait(100);
Inc(i);
if(i > 75)then
Inc(Wrong);
until((R_CountItemID(Players[CurrentPlayer].Integers[98]) < Inv) or (i > 75))
i := 0;
if(R_CountItemID(Players[CurrentPlayer].Integers[98]) < Inv)then
begin
Wrong := 0;
Start := GetSystemTime;
repeat
if(r = 0)then
LogCount := R_CountItemID(Players[CurrentPlayer].Integers[98]);
RWait(100);
if(LevelUp)then Exit;
if(i > 1000)then
Inc(Wrong);
if(R_CountItemID(Players[CurrentPlayer].Integers[98]) > 8)then
AntiBan
else
SoftAntiBan;
if(R_FindRandoms)then
begin
RWait(2500 + Random(5300));
Exit;
end;
Inc(i); Inc(r);
if(R_CountItemID(Players[CurrentPlayer].Integers[98]) < LogCount)then
begin
//Debug('Less Logs Detected. Resetting R.');
r := 0;
end else
begin
//Debug('R: ' + IntToStr(r));
if(r > 20)then
begin
Inc(Wrong);
Exit;
end;
end;
until((R_CountItemID(Players[CurrentPlayer].Integers[98]) = 0) or ((GetSystemTime - Start) > 120000))
Num := (27 - R_CountItemID(Players[CurrentPlayer].Integers[98]));
IncEx(Players[CurrentPlayer].Integers[90], Num);
IncEx(Players[CurrentPlayer].Integers[91], Num);
//IncEx(Stats_CustomVars[1], Num);
//IncEx(Stats_CustomVars[2], Num * Players[CurrentPlayer].Integers[97]);
//Stats;
Debug(IntToStr(i));
end;
end;
end;
end else
CloseBank;
end;
procedure StringThem;
var
i, r, x, y, Inv, Num, StringCount, Start: Integer;
begin
if(not(LoggedIn))then Exit;
if((R_BankScreen = False) and (R_CountItemID(BowString) = 14) and (R_CountItemID(Players[CurrentPlayer].Integers[95]) = 14))then
begin
Inv := InvCount;
case Random(100) of
0..55: begin
x := 585; y := 340;
end;
56..80: begin
x := 625; y := 340;
end;
81..92: begin
x := 665; y := 300;
end;
93..99: begin
x := 705; y := 300;
end;
end;
if(not(WhiteBorder(x, y)))then
Inc(Wrong)
else begin
Debug('Clicking String onto Unstrung');
Wait(300 + Random(300));
if(x < 600)then
MC(585, 375, 7, 7, True)
else if(x < 640)then
MC(625, 375, 7, 7, True)
else if(x < 680)then
MC(665, 335, 7, 7, True)
else if(x < 720)then
MC(705, 335, 7, 7, True);
Wait(300 + Random(300));
if(not(OrangeText))then
Inc(Wrong)
else begin
Debug('Clicking Orange Text');
Wait(200 + Random(300));
MC(260, 425, 25, 15, True);
repeat
Wait(100);
Inc(i);
if(i > 75)then
begin
Inc(Wrong);
Exit;
end;
until(InvCount < Inv)
i := 0; Wrong := 0;
Start := GetSystemTime;
repeat
if(r = 0)then
StringCount := R_CountItemID(BowString);
RWait(100);
if(LevelUp)then Exit;
if(i > 1000)then
Inc(Wrong);
if(R_CountItemID(Players[CurrentPlayer].Integers[96]) < 8)then
AntiBan
else
SoftAntiBan;
if(R_FindRandoms)then
begin
RWait(2500 + Random(5300));
Exit;
end;
Inc(i); Inc(r);
if(R_CountItemID(BowString) < StringCount)then
begin
Debug('Less Strings Detected. Resetting R.');
r := 0;
end else
begin
Debug('R: ' + IntToStr(r));
if(r > 20)then
begin
Inc(Wrong);
Exit;
end;
end;
until((R_CountItemID(BowString) = 0) or ((GetSystemTime - Start) > 45000))
Num := (14 - R_CountItemID(BowString));
IncEx(Players[CurrentPlayer].Integers[90], Num);
IncEx(Players[CurrentPlayer].Integers[91], Num);
//IncEx(Stats_CustomVars[1], Num);
//IncEx(Stats_CustomVars[2], Num * Players[CurrentPlayer].Integers[97]);
//Stats;
end;
end;
end else
Inc(Wrong);
end;
procedure HeadlessLoop;
var
i, r, Num, Start, StartAmount, StartAmount2: Integer;
Inv: array[1..28] of TInvItem;
begin
if(Players[CurrentPlayer].Booleans[0] = False)then
begin
for i := 1 to 28 do
begin
Inv[i] := GetInvItemAt(i);
case Inv[i].ID of
Feathers: Players[CurrentPlayer].Integers[80] := Inv[i].Slot;
Shafts: Players[CurrentPlayer].Integers[81] := Inv[i].Slot;
Headless: Players[CurrentPlayer].Integers[82] := Inv[i].Slot;
Players[CurrentPlayer].Integers[98]: Players[CurrentPlayer].Integers[83] := Inv[i].Slot;
end;
end;
Players[CurrentPlayer].Booleans[0] := True;
end;
if(Random(2) = 0)then
begin
R_ClickItemID(Feathers, True, '');
RWait(150 + Random(350));
R_ClickItemID(Shafts, True, '');
end else
begin
R_ClickItemID(Shafts, True, '');
RWait(150 + Random(350));
R_ClickItemID(Feathers, True, '');
end;
Start := GetSystemTime;
repeat
RWait(100);
if((GetSystemTime - Start) > 5000)then
begin
Inc(Wrong);
Exit;
end;
until(OrangeText)
Wait(150 + Random(350));
MC(260, 425, 25, 10, True);
StartAmount := GetItemStackSizeAt(Players[CurrentPlayer].Integers[80]);
Start := GetSystemTime;
repeat
RWait(100);
if((GetSystemTime - Start) > 5000)then
begin
Inc(Wrong);
Exit;
end;
until(GetItemStackSizeAt(Players[CurrentPlayer].Integers[80]) < StartAmount)
Wrong := 0;
repeat
if(r = 0)then
StartAmount2 := GetItemStackSizeAt(Players[CurrentPlayer].Integers[80]);
RWait(25);
if(LevelUp)then
begin
Wait(500 + Random(2000));
Exit;
end;
if(R_FindRandoms)then
begin
RWait(2500 + Random(5300));
Exit;
end;
SoftAntiBan;
Inc(r);
if(GetItemStackSizeAt(Players[CurrentPlayer].Integers[80]) < StartAmount2)then
begin
Debug('Less Feathers Detected. Resetting R.');
r := 0;
end else
Debug('R: ' + IntToStr(r));
until((r >= 15) or ((GetSystemTime - Start) > 25000))
Wait(100 + Random(250));
Num := (StartAmount - GetItemStackSizeAt(Players[CurrentPlayer].Integers[80]));
IncEx(Players[CurrentPlayer].Integers[94], Num);
//IncEx(Stats_CustomVars[2], Num * Players[CurrentPlayer].Integers[97]);
//Stats;
if(Random(19) = 0)then BoredHuman;
end;
procedure ArrowLoop;
var
i, r, Num, Start, StartAmount, StartAmount2: Integer;
Inv: array[1..28] of TInvItem;
begin
if(Players[CurrentPlayer].Booleans[1])then
begin
Players[CurrentPlayer].Booleans[0] := False;
Players[CurrentPlayer].Booleans[1] := False;
end;
if(Players[CurrentPlayer].Booleans[0] = False)then
begin
for i := 1 to 28 do
begin
Inv[i] := GetInvItemAt(i);
case Inv[i].ID of
Feathers: Players[CurrentPlayer].Integers[80] := Inv[i].Slot;
Shafts: Players[CurrentPlayer].Integers[81] := Inv[i].Slot;
Headless: Players[CurrentPlayer].Integers[82] := Inv[i].Slot;
Players[CurrentPlayer].Integers[98]: Players[CurrentPlayer].Integers[83] := Inv[i].Slot;
end;
end;
Players[CurrentPlayer].Booleans[0] := True;
end;
if(Random(2) = 0)then
begin
R_ClickItemID(Headless, True, '');
RWait(150 + Random(350));
R_ClickItemID(Players[CurrentPlayer].Integers[98], True, '');
end else
begin
R_ClickItemID(Players[CurrentPlayer].Integers[98], True, '');
RWait(150 + Random(350));
R_ClickItemID(Headless, True, '');
end;
Start := GetSystemTime;
repeat
RWait(100);
if((GetSystemTime - Start) > 5000)then
begin
Inc(Wrong);
Exit;
end;
until(OrangeText)
Wait(150 + Random(350));
MC(260, 425, 25, 10, True);
StartAmount := GetItemStackSizeAt(Players[CurrentPlayer].Integers[83]);
Start := GetSystemTime;
repeat
RWait(100);
if((GetSystemTime - Start) > 5000)then
begin
Inc(Wrong);
Exit;
end;
until(GetItemStackSizeAt(Players[CurrentPlayer].Integers[83]) < StartAmount)
Wrong := 0;
repeat
if(r = 0)then
StartAmount2 := GetItemStackSizeAt(Players[CurrentPlayer].Integers[83]);
RWait(25);
if(LevelUp)then
begin
Wait(500 + Random(2000));
Exit;
end;
if(R_FindRandoms)then
begin
RWait(2500 + Random(5300));
Exit;
end;
SoftAntiBan;
Inc(r);
if(GetItemStackSizeAt(Players[CurrentPlayer].Integers[83]) < StartAmount2)then
begin
Debug('Less Tips Detected. Resetting R.');
r := 0;
end else
Debug('R: ' + IntToStr(r));
until((r >= 15) or ((GetSystemTime - Start) > 25000))
Wait(100 + Random(250));
Num := (StartAmount - GetItemStackSizeAt(Players[CurrentPlayer].Integers[83]));
IncEx(Players[CurrentPlayer].Integers[90], Num);
IncEx(Players[CurrentPlayer].Integers[91], Num);
//IncEx(Stats_CustomVars[1], Num);
//IncEx(Stats_CustomVars[2], Num * Players[CurrentPlayer].Integers[97]);
//Stats;
if(Random(25) = 0)then BoredHuman;
end;
procedure DartLoop;
begin
end;
procedure BoltLoop;
begin
end;
procedure MainLoop;
var
Start: Integer;
begin
if(not(LoggedIn))then Exit;
RWait(150 + Random(150));
case (LowerCase(Players[CurrentPlayer].Strings[0])) of
'cut': begin
R_FindRandoms;
if(not(R_CountItemID(Knife) = 1))then
begin
Bye('No Knife in Inventory');
Exit;
end;
if(not(R_CountItemId(Players[CurrentPlayer].Integers[98]) = 27))then
begin
R_OpenBankBooth(Players[CurrentPlayer].Strings[3]);
//OpenBank(Players[CurrentPlayer].Strings[3], True, True);
Start := GetSystemTime;
repeat
RWait(100);
until((R_BankScreen) or ((GetSystemTime - Start) > 5000))
Wait(200 + random(300));
R_DepositAllButID(Knife);
Wait(200 + Random(300));
BankDTM(Players[CurrentPlayer].Strings[1], 28);
end;
Wait(350 + Random(500));
CloseBank;
if((R_CountItemID(Players[CurrentPlayer].Integers[98]) > 0) and (R_CountItemID(Players[CurrentPlayer].Integers[98]) < 27) and (not(InvCount = 28)))then
begin
Bye('Insufficient Logs Detected');
Exit;
end;
Start := GetSystemTime;
repeat
RWait(100);
until((not(R_BankScreen)) or ((GetSystemTime - Start) > 5000))
if(R_BankScreen)then CloseBank;
Wait(500 + Random(1000));
CutLogs;
R_FindRandoms;
end;
'string': begin
R_FindRandoms;
if(((R_CountItemID(BowString) > 0) and (R_CountItemID(BowString) < 14) and (not(InvCount = 28))) or
((R_CountItemID(Players[CurrentPlayer].Integers[95]) > 0) and (R_CountItemID(Players[CurrentPlayer].Integers[95]) < 14) and (not(InvCount = 28))))then
begin
Bye('Insufficient Strings/Unstrung Detected');
Exit;
end;
if(not((R_CountItemID(BowString) = 14) and (R_CountItemID(Players[CurrentPlayer].Integers[95]) = 14)))then
begin
R_OpenBankBooth(Players[CurrentPlayer].Strings[3]);
//OpenBank(Players[CurrentPlayer].Strings[3], True, True);
Start := GetSystemTime;
repeat
RWait(100);
until((R_BankScreen) or ((GetSystemTime - Start) > 5000))
Wait(200 + random(300));
R_DepositAll(True);
Wait(200 + Random(300));
BankDTM('Bow String', 14);
BankDTM('u' + Players[CurrentPlayer].Strings[1], 14);
end;
Wait(350 + Random(500));
CloseBank;
Start := GetSystemTime;
repeat
RWait(100);
until((not(R_BankScreen)) or ((GetSystemTime - Start) > 5000))
if(R_BankScreen)then CloseBank;
Wait(500 + Random(1000));
StringThem;
R_FindRandoms;
end;
'arrows', 'arrow':
begin
R_FindRandoms;
if(InvCount > 4)then
begin
Debug('To many item in inventory. Get it together.');
Exit;
end else
if((R_CountItemID(Feathers) > 0) and (R_CountItemID(Shafts) > 0))then
begin
HeadlessLoop;
Players[CurrentPlayer].Booleans[1] := True;
end
else if((R_CountItemID(Headless) > 0) and (R_CountItemID(Players[CurrentPlayer].Integers[98]) > 0))then
ArrowLoop
else
begin
Debug('Out of materials');
Exit;
end;
end;
'darts', 'dart':
begin
R_FindRandoms;
DartLoop;
end;
'bolts', 'bolt':
begin
R_FindRandoms;
BoltLoop;
end;
else
begin
Bye('Wrong selection type entered.');
Exit;
end;
end;
R_FindRandoms;
end;
procedure Report;
var
a, i, SleepPer: Integer;
PlayerRunTime: Extended;
begin
if(DebugMode = False)then
ClearDebug;
EndTime := GetSystemTime;
IncEx(Players[CurrentPlayer].Integers[92], EndTime - StartTime);
Writeln('---------------------------------------------');
Writeln('------- Smurgs AIO Fletcher V2.01 -----------');
Writeln('---------------------------------------------');
Writeln('You are running: ' + IntToStr(HowManyPlayers) + ' character(s).');
Writeln('---------------------------------------------');
for a := 0 to (HowManyPlayers - 1) do
begin
PlayerRunTime := Players[a].Integers[92] div 1000.0 div 60.0 div 60.0;
Writeln('Character: ' + Players[a].Nick);
case LowerCase(Players[a].Strings[0]) of
'cut': Writeln('Logs Cut: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91]) div PlayerRunTime)) + ' logs/hr)(Cutting ' + Players[a].Strings[1] + ' ' + Players[a].Strings[2] + 's)');
'string': Writeln('Bows Strung: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91]) div PlayerRunTime)) + ' bows/hr)(Stringing ' + Players[a].Strings[1] + ' Bows)');
'arrows', 'arrow': Writeln('Arrows Fletched: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91] * 15) div PlayerRunTime)) + ' arrows/hr)(Making ' + Players[a].Strings[1] + ' Arrows)');
'darts', 'dart': Writeln('Darts Fletched: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91] * 10) div PlayerRunTime)) + ' darts/hr)(Making ' + Players[a].Strings[1] + ' Darts)');
'bolts', 'bolt': Writeln('Bolts Fletched: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91] * 10) div PlayerRunTime)) + ' bolts/hr)(Making ' + Players[a].Strings[1] + ' Bolts)');
end;
case LowerCase(Players[a].Strings[0]) of
'cut', 'string': Writeln('Experience Gained: ' + IntToStr(Players[a].Integers[91] * Players[a].Integers[97]) + ' (' + IntToStr(Round((Players[a].Integers[91] * Players[a].Integers[97]) div PlayerRunTime)) + ' xp/hr)');
'arrows', 'arrow': Writeln('Experience Gained: ' + IntToStr(((Players[a].Integers[91] * Players[a].Integers[97]) / 15) + Players[CurrentPlayer].Integers[94]) + ' (' + IntToStr(Round((((Players[a].Integers[91] * Players[a].Integers[97]) / 15) + Players[CurrentPlayer].Integers[94]) div PlayerRunTime)) + ' xp/hr)');
'darts', 'dart': Writeln('Experience Gained: ' + IntToStr((Players[a].Integers[91] * Players[a].Integers[97]) / 10) + ' (' + IntToStr(Round(((Players[a].Integers[91] * Players[a].Integers[97]) / 10) div PlayerRunTime)) + ' xp/hr)');
'bolts', 'bolt': Writeln('Experience Gained: ' + IntToStr((Players[a].Integers[91] * Players[a].Integers[97]) / 10) + ' (' + IntToStr(Round(((Players[a].Integers[91] * Players[a].Integers[97]) / 10) div PlayerRunTime)) + ' xp/hr)');
end;
Writeln('This character has been running for: ' + MsToTime(Players[a].Integers[92], 0));
if(HowManyPlayers = 1)then
Writeln('This character has slept for: ' + MsToTime(Players[a].Integers[93], 0))
else
begin
SleepPer := 0;
for i := 0 to (HowManyPlayers - 1)do
begin
if(not(a = i))then
IncEx(SleepPer, Players[i].Integers[92]);
end;
Writeln('This character has slept for: ' + MsToTime(SleepPer, 0));
end;
if(Players[a].Active)then
Writeln('Active Status: Active')
else
begin
Writeln('Active Status: Not Active (Reason: ' + Players[a].Strings[99] + ')');
end;
Writeln('---------------------------------------------');
end;
Writeln('Total Script RunTime: ' + TimeRunning);
Writeln('---------------------------------------------');
end;
procedure FinalReport;
var
a, i, SleepPer: Integer;
PlayerRunTime: Extended;
begin
Writeln('---------------------------------------------');
Writeln('------- Smurgs AIO Fletcher V2.01 -----------');
Writeln('---------------------------------------------');
Writeln('You are running: ' + IntToStr(HowManyPlayers) + ' character(s).');
Writeln('---------------------------------------------');
for a := 0 to (HowManyPlayers - 1) do
begin
PlayerRunTime := Players[a].Integers[92] div 1000.0 div 60.0 div 60.0;
Writeln('Character: ' + Players[a].Nick);
case LowerCase(Players[a].Strings[0]) of
'cut': Writeln('Logs Cut: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91]) div PlayerRunTime)) + ' logs/hr)(Cutting ' + Players[a].Strings[1] + ' ' + Players[a].Strings[2] + 's)');
'string': Writeln('Bows Strung: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91]) div PlayerRunTime)) + ' bows/hr)(Stringing ' + Players[a].Strings[1] + ' Bows)');
'arrows', 'arrow': Writeln('Arrows Fletched: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91] * 15) div PlayerRunTime)) + ' arrows/hr)(Making ' + Players[a].Strings[1] + ' Arrows)');
'darts', 'dart': Writeln('Darts Fletched: ' + IntToStr(Players[a].Integers[91]) + ' (' + IntToStr(Round((Players[a].Integers[91] * 10) div PlayerRunTime)) + ' darts/hr)(Making ' + Players[a].Strings[1] + ' Darts)');
end;
case LowerCase(Players[a].Strings[0]) of
'cut', 'string': Writeln('Experience Gained: ' + IntToStr(Players[a].Integers[91] * Players[a].Integers[97]) + ' (' + IntToStr(Round((Players[a].Integers[91] * Players[a].Integers[97]) div PlayerRunTime)) + ' xp/hr)');
'arrows', 'arrow': Writeln('Experience Gained: ' + IntToStr(((Players[a].Integers[91] * Players[a].Integers[97]) / 15) + Players[CurrentPlayer].Integers[94]) + ' (' + IntToStr(Round((((Players[a].Integers[91] * Players[a].Integers[97]) / 15) + Players[CurrentPlayer].Integers[94]) div PlayerRunTime)) + ' xp/hr)');
'darts', 'dart': Writeln('Experience Gained: ' + IntToStr((Players[a].Integers[91] * Players[a].Integers[97]) / 10) + ' (' + IntToStr(Round(((Players[a].Integers[91] * Players[a].Integers[97]) / 10) div PlayerRunTime)) + ' xp/hr)');
end;
Writeln('This character has been running for: ' + MsToTime(Players[a].Integers[92], 0));
if(HowManyPlayers = 1)then
Writeln('This character has slept for: ' + MsToTime(Players[a].Integers[93], 0))
else
begin
SleepPer := 0;
for i := 0 to (HowManyPlayers - 1)do
begin
if(not(a = i))then
IncEx(SleepPer, Players[i].Integers[92]);
end;
Writeln('This character has slept for: ' + MsToTime(SleepPer, 0));
end;
if(Players[a].Active)then
Writeln('Active Status: Active')
else
begin
Writeln('Active Status: Not Active (Reason: ' + Players[a].Strings[99] + ')');
end;
Writeln('---------------------------------------------');
end;
Writeln('Total Script RunTime: ' + TimeRunning);
Writeln('---------------------------------------------');
end;
procedure SetVars;
var
i: Integer;
begin
SBreakEvery := (BreakEvery + RandomRange(-BreakEveryRand, BreakEveryRand)) * 60 * 1000;
SBreakFor := (BreakFor + RandomRange(-BreakForRand, BreakForRand)) * 60 * 1000;
BreakStartTime := GetSystemTime;
for i := 0 to (HowManyPlayers - 1)do
begin
case LowerCase(Players[i].Strings[1]) of
'regular', 'normal':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
Bye('The script doesnt support stringing normal bows.');
TerminateScript;
end;
Players[i].Integers[98] := 1511;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 5;
'long': Players[i].Integers[97] := 10;
'stock': Players[i].Integers[97] := 6;
'shaft': Players[i].Integers[97] := 5;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'oak':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
Bye('The script doesnt support stringing oak bows.');
TerminateScript;
end;
Players[i].Integers[98] := 1521;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 17;
'long': Players[i].Integers[97] := 25;
'stock': Players[i].Integers[97] := 16;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'willow':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
Bye('The script doesnt support stringing willow bows.');
TerminateScript;
end;
Players[i].Integers[98] := 1519;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 33;
'long': Players[i].Integers[97] := 42;
'stock': Players[i].Integers[97] := 22;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'maple':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
if(not(LowerCase(Players[i].Strings[2]) = 'long'))then
begin
Bye('The script doesnt support stringing anything but longbows.');
TerminateScript;
end;
end;
Players[i].Integers[95] := 62;
Players[i].Integers[96] := 851;
Players[i].Integers[98] := 1517;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 50;
'long': Players[i].Integers[97] := 58;
'stock': Players[i].Integers[97] := 32;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'yew':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
if(not(LowerCase(Players[i].Strings[2]) = 'long'))then
begin
Bye('The script doesnt support stringing anything but longbows.');
TerminateScript;
end;
end;
Players[i].Integers[95] := 66;
Players[i].Integers[96] := 855;
Players[i].Integers[98] := 1515;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 68;
'long': Players[i].Integers[97] := 75;
'stock': Players[i].Integers[97] := 50;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'magic':
begin
if(LowerCase(Players[i].Strings[0]) = 'string')then
begin
if(not(LowerCase(Players[i].Strings[2]) = 'long'))then
begin
Bye('The script doesnt support stringing anything but longbows.');
TerminateScript;
end;
end;
Players[i].Integers[95] := 70;
Players[i].Integers[96] := 859;
Players[i].Integers[98] := 1513;
case LowerCase(Players[i].Strings[2]) of
'short': Players[i].Integers[97] := 83;
'long': Players[i].Integers[97] := 92;
else
begin
Bye('Wrong value entered for fletch type');
TerminateScript;
end;
end;
end;
'abronze': begin Players[i].Integers[98] := ABronze; Players[i].Integers[97] := 40; end;
'airon': begin Players[i].Integers[98] := AIron; Players[i].Integers[97] := 58; end;
'asteel': begin Players[i].Integers[98] := ASteel; Players[i].Integers[97] := 95; end;
'amithril': begin Players[i].Integers[98] := AMithril; Players[i].Integers[97] := 133; end;
'abroad': begin Players[i].Integers[98] := ABroad; Players[i].Integers[97] := 225; end;
'aadamant': begin Players[i].Integers[98] := AAdamant; Players[i].Integers[97] := 170; end;
'arune': begin Players[i].Integers[98] := ARune; Players[i].Integers[97] := 207; end;
'adragon': begin Players[i].Integers[98] := ADragon; Players[i].Integers[97] := 245; end;
'dbronze': begin Players[i].Integers[98] := DBronze; Players[i].Integers[97] := 18; end;
'diron': begin Players[i].Integers[98] := DIron; Players[i].Integers[97] := 38; end;
'dsteel': begin Players[i].Integers[98] := DSteel; Players[i].Integers[97] := 75; end;
'dmithril': begin Players[i].Integers[98] := DMithril; Players[i].Integers[97] := 112; end;
'dadamant': begin Players[i].Integers[98] := DAdamant; Players[i].Integers[97] := 150; end;
'drune': begin Players[i].Integers[98] := DRune; Players[i].Integers[97] := 188; end;
'ddragon': begin Players[i].Integers[98] := DDragon; Players[i].Integers[97] := 250; end;
'bbronze': begin Players[i].Integers[98] := BBronze; Players[i].Integers[97] := 5; end;
'biron': begin Players[i].Integers[98] := BIron; Players[i].Integers[97] := 15; end;
'bsilver': begin Players[i].Integers[98] := BSilver; Players[i].Integers[97] := 25; end;
'bsteel': begin Players[i].Integers[98] := BSteel; Players[i].Integers[97] := 35; end;
'bmithril': begin Players[i].Integers[98] := BMithril; Players[i].Integers[97] := 50; end;
'badamant': begin Players[i].Integers[98] := BAdamant; Players[i].Integers[97] := 70; end;
'brune': begin Players[i].Integers[98] := BRune; Players[i].Integers[97] := 100; end;
'bbroad': begin Players[i].Integers[98] := BBroad; Players[i].Integers[97] := 30; end;
'headless': begin end;
else
begin
Bye('Wrong value entered for wood type');
TerminateScript;
end;
end;
end;
end;
procedure StartSMART;
begin
Smart_Server := World;
Smart_Members := True;
Smart_Signed := True;
Smart_SuperDetail := False;
Debug('SMART Setup');
ClearDebug;
SetupSRL;
SetUpReflectionEx(True);
DeclarePlayers;
if(not LoggedIn)then
begin
LogInPlayer;
Wait(6000 + Random(6000));
end;
Debug('Setup SRL, Declared Players, Logged In');
SetAngle(True);
MakeCompass('N');
Debug('Setup Camera');
AddOnTerminate('FinalReport');
end;
begin
StartSMART;
SetVars;
//if(not(SRLStats_UserID = ''))then SetupStats;
repeat
Players[CurrentPlayer].Integers[90] := 0;
repeat
StartTime := GetSystemTime;
MainLoop;
if(Wrong > 3)then
begin
Bye('Wrong counter exceeded');
Wrong := 0;
Break;
end;
if((Players[CurrentPlayer].Active) and ((GetSystemTime - StartTime) > 5000))then
Report;
if(((SBreakEvery < (GetSystemTime - BreakStartTime))) and (HowManyPlayers = 1))then
TakeBreak;
until(((Players[CurrentPlayer].Integers[90]) >= Players[CurrentPlayer].Integers[0]) or not(LoggedIn))
if(HowManyPlayers > 1)then
begin
if((Players[CurrentPlayer].Integers[91]) >= (Players[CurrentPlayer].Integers[1]))then
NextPlayer(False)
else
NextPlayer(Players[CurrentPlayer].Active);
Wait(6000 + Random(6000));
end else
begin
Players[CurrentPlayer].Active := False;
Logout;
TerminateScript;
end;
until(AllPlayersInactive)
end.
Compiles for me. Not sure if it works though.
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.