KillerTHC
2010-12-04 20:44:12
How Long have You Played Runescape?
8 Year(s)
Are you affilated in anyway with Jagex LTD?
No
Were you Referred to SRL?
What is your general programming knowledge?
Java, C++, VB.Net
Are you a member of any other communities?
Previously a member of IBot, Sythe, but that was years ago.
Tell us about yourself…
RM: Edited to show script. Thread here: http://villavu.com/forum/showthread.php?t=60377
8 Year(s)
Are you affilated in anyway with Jagex LTD?
No
Were you Referred to SRL?
What is your general programming knowledge?
Java, C++, VB.Net
Are you a member of any other communities?
Previously a member of IBot, Sythe, but that was years ago.
Tell us about yourself…
From: KillerTHC
I am 17, I enjoy botting, so much that after taking a break from RS I botted other games, but eventually it didnt compare to botting RS. I enjoy script and computer programing.
RM: Edited to show script. Thread here: http://villavu.com/forum/showthread.php?t=60377
program FaladorSmith;
{$I SRL/SRL/misc/SMART.scar}
{$I SRL/SRL.scar}
{$I Reflection/Reflection.simba}
var
SmeltingAnimation, FurnaceID, AntiBanPercent, BankAttempts, Breaks,
StopReason, StartTime, BreakTime: Integer;
WalkToFurnace, WalkToBank, WalkToFurnace2, WalkToBank2: TTileArray;
SmithyTile, BankTile, FurnaceTile: TTile;
FurnaceObj: TRSObject;
TP: TPoint;
Failed: Boolean;
const
SmartWorld = 0;
Members = False;
SignedClient = True;
HighDetail = False;
Version = 1.3;
//Stop Reasons
LOADSDONE = 1;
BANKFAIL = 2;
SMELTFAIL = 3;
WALKFAIL = 4;
BREAKFAIL = 5;
NOORE = 6;
//Script States
BANKING = 1;
WALK = 2;
SMELTING = 3;
BREAK = 4;
procedure DeclarePlayers; //Player setup
begin
AntiBanPercent := 1; //1 = do antiban 1% of the time(recommended)
HowManyPlayers := 2;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
with Players[0] do
begin
Name := '';
Pass := '';
Pin := '';
Nick := '';
Active := True;
Integers[5] := 100;//Loads to do
Integers[6] := 30;//Rest every X minutes
Integers[7] := 5;//Rest for X minutes
//bronze, iron, silver, steel, gold, mithril, adamantite, rune, best
Strings[0] := 'steel'; //Must be lower case!!!!
Booleans[0] := False; //Always make best bar (not recomended)
end;
with Players[1] do
begin
Name := '';
Pass := '';
Pin := '';
Nick := '';
Active := False; //Change this to activate this player
Integers[5] := 20;//Loads to do
Integers[6] := 15;//Rest every X minutes
Integers[7] := 1;//Rest for X minutes
//bronze, iron, silver, steel, gold, mithril, adamantite, rune, best
Strings[0] := 'iron'; //Must be lower case!!!!
Booleans[0] := False; //Always make best bar (not recomended)
end;
end;
procedure FindRandoms();
begin
if not R_FindRandoms then
FindNormalRandoms;
end;
procedure AntiBan();
begin
FindRandoms();
case Random(6) of
0: HoverSkill('Smithing',False);
1: PickUpMouse;
2: BoredHuman;
3: ExamineInv;
4: HoverSkill('Random',False);
5:
begin
RandomMovement();
Wait(250 + Random(250));
SetAngle(True);
end;
6: Wait(500 + Random(15000));
end;
end;
procedure ProgressReport;
var
I, TotalLoads, TotalAntiBans, TotalLevelsGained, TotalBars, CPBars, CPLoads, CPAntiBan, CPLevelsGained: Integer;
S, S2, S3, S4, S5, Active : String;
begin
ClearDebug;
CPLoads := Players[CurrentPlayer].Integers[0];
CPAntiBan := Players[CurrentPlayer].Integers[1];
CPLevelsGained := Players[CurrentPlayer].Integers[2];
CPBars := Players[CurrentPlayer].Integers[3];
for I := 0 to HowManyPlayers - 1 do
begin
TotalLoads := TotalLoads + Players[I].Integers[0];
TotalAntiBans := TotalAntiBans + Players[I].Integers[1];
TotalLevelsGained := TotalLevelsGained + Players[I].Integers[2];
TotalBars := TotalBars + Players[I].Integers[3];
end;
//Credits to Tickyy for his ProgReport
S := ' ';
S2 := 'FaladorSmith ~ By KillerTHC';
S3 := 'Ver 1.3';
S4 := 'Players Report';
S5 := 'Credits to Tickyy for his ProgReport';
WriteLn('[----------------------------------------------------------------------------]');
WriteLn('[' + padr(padl(S3, 38 + Length(S3) / 2), 76) + ']');
WriteLn('[----------------------------------------------------------------------------]');
WriteLn('[' + Padr(Padl(TheDate(2) + s + (TheTime), 38 + Length(TheDate(2) + s + TheTime) / 2), 76) + ']');
WriteLn('[----------------------------------------------------------------------------]');
WriteLn('[' + Padr(padl(S2, 38 + Length(S2) / 2), 76) + ']');
WriteLn('[----------------------------------------------------------------------------]');
WriteLn('[' + Padr(padl(S5, 38 + Length(S5) / 2), 76) + ']');
WriteLn('[----------------------------------------------------------------------------]');
WriteLn(padr('[ Total Time Running: ' + TimeRunning, 77) + ']');
WriteLn(PadR('[ Total Breaks: ' + IntToStr(Breaks), 77) + ']');
WriteLn(PadR('[ Total Loads Done: ' + IntToStr(TotalLoads), 77) + ']');
WriteLn(PadR('[ Total Bars Smelted and Banked: ' + IntToStr(TotalBars), 77) + ']');
WriteLn(PadR('[ Smelting Rate: ' + IntToStr(Round((TotalBars * 3600) / (GetTimeRunning / 1000))) + ' Bars/Hr', 77) + ']');
WriteLn(PadR('[ Smithing Levels Gained: ' + IntToStr(TotalLevelsGained), 77) + ']');
Writeln(PadR('[ AntiBans Done: ' + IntToStr(TotalAntiBans), 77) + ']');
WriteLn('[----------------------------------------------------------------------------]');
Writeln('[' + padr(padl(S4, 38 + Length(S4) / 2), 76) + ']');
Writeln('[----------------------------------------------------------------------------]');
Writeln(Padr('[ Player Number | Nick | Active | Loads', 77) + ']');
for i:= 0 to High(Players) do
begin
if (Players[I].Active = True) then
Active := 'T'
else
Active := 'F';
Writeln(Padr(Padr(Padr(Padr(Padr(Padr(Padr(Padr('[', 12) + (IntToStr(I)), 24) + '|', 31) + (players[I].nick), 39) + '|', 47) + (Active), 55)
+ '|', 64) + (IntToStr(Players[I].Integers[0])), 77) + ']');
end;
Writeln('[----------------------------------------------------------------------------]');
Writeln('');
end;
procedure StopCause;
begin
case StopReason of
0: WriteLn('Unknown reason for stopping...');
LOADSDONE: WriteLn('Stopped due to load amount reached');
BANKFAIL: WriteLn('Stopped due to banking failure');
WALKFAIL: WriteLn('Stopped due to walking failure');
BREAKFAIL: WriteLn('Stopped due to break failure');
SMELTFAIL: WriteLn('Stopped due to smelting failure');
NOORE: WriteLn('Stopped due to all ore being used');
end;
end;
procedure Bling;
var
I: Integer;
PictureArray: TStringArray;
begin
PictureArray := [' W ',
' WWW ',
' WWW ',
' WWWWW ',
' W WWWWW W ',
' WWW WWWWW WWW ',
' WWW WWWWW WWW ',
' WWW WWW WWW ',
' WWW WWW WWW ',
' WWWWWWW ',
' WWWW | WWWW ',
' | ',
' | ',
' ',
' _ _ _ _____ ___ ',
' /\ /(_) | | ___ _ _/__ \/\ /\/ __\',
' / //_/ | | |/ _ \ |__|/ /\/ /_/ / / ',
'/ __ \| | | | __/ | / / / __ / /___ ',
'\/ \/|_|_|_|\___|_| \/ \/ /_/\____/ '];
for I := 0 to High(PictureArray) do
WriteLn(PictureArray[I]);
Wait(5000);
end;
function NearTile(DTile: TTile; Distance: Integer): Boolean;
var
MyTile: TTile;
x1, x2, y1, y2, tx, ty: Integer;
begin
MyTile := GetMyPos;
tx := MyTile.x;
ty := MyTile.y;
x1 := DTile.x - Distance;
x2 := DTile.x + Distance;
y1 := DTile.y - Distance;
y2 := DTile.y + Distance;
if (tx >= x1) and (tx <= x2) and (ty >= y1) and (ty <= y2) then
Result := True;
end;
procedure SetupVars;
begin
//Booleans
Failed := False;
//Integers
StartTime := GetSystemTime;
StopReason := 0;
FurnaceID := 11666;
SmeltingAnimation := 3243;
//Tiles, TileArrays
BankTile := Tile(3013, 3356);
SmithyTile := Tile(2975, 3369);
FurnaceTile := Tile(2976,3369);
WalkToFurnace := [Tile(3012, 3363), Tile(3004, 3364), Tile(2996, 3367),
Tile(2986, 3373), Tile(2979, 3376), Tile(2973, 3372),
Tile(2975, 3369)];
WalkToFurnace2 := [Tile(3006, 3359), Tile(2995, 3364), Tile(2981, 3372),
Tile(2975, 3369)];
WalkToBank2 := [Tile(2975, 3369), Tile(2982, 3376), Tile(2993, 3367),
Tile(3004, 3366), Tile(3009, 3361), Tile(3013, 3356)];
WalkToBank := [Tile(2975, 3369), Tile(2975, 3369), Tile(2979, 3375),
Tile(2986, 3374), Tile(2992, 3370), Tile(2998, 3365),
Tile(3003, 3364), Tile(3013, 3363), Tile(3013, 3356)];
end;
procedure SetBest;
begin
case GetSkillLevel('smithing') of
1 - 14: Players[CurrentPlayer].Strings[0] := 'bronze';
15 - 19: Players[CurrentPlayer].Strings[0] := 'iron';
20 - 29: Players[CurrentPlayer].Strings[0] := 'silver';
30 - 39: Players[CurrentPlayer].Strings[0] := 'steel';
40 - 49: Players[CurrentPlayer].Strings[0] := 'gold';
50 - 69: Players[CurrentPlayer].Strings[0] := 'mithril';
70 - 84: Players[CurrentPlayer].Strings[0] := 'adamantite';
85 - 99: Players[CurrentPlayer].Strings[0] := 'rune';
end;
end;
function WithdrawNoFix(Col, Row, Amount: Integer): Boolean;
var
BBox: TBox;
X, Y: Integer;
begin
Result := False;
BBox := BankIndexToMSBox(BankPointToBankIndex(Point(Col, Row)));
GetMousePos(X, Y);
if (not PointInBox(Point(X, Y), BBox)) then
MouseBox(BBox.X1 + 5, BBox.Y1 + 5, BBox.X2 - 5, BBox.Y2 - 5, 3);
ClickMouse2(Amount = 1);
if (Amount = 1) then
begin
Result := True;
Wait(RandomRange(250, 550));
Exit;
end;
if (Amount = 0) then
Result := WaitOptionMulti(['Withdraw-All', 'w-A'], 300)
else
Result := WaitOptionMulti(['Withdraw-' + IntToStr(Amount), 'w-' + IntToStr(Amount)] , 300);
if (not (Result)) and (Amount > 0) then
begin
MouseBox(BBox.X1 + 5, BBox.Y1 + 5, BBox.X2 - 5, BBox.Y2 - 5, 2);
if WaitOptionMulti(['Withdraw-X', 'w-X'], 500) then
begin
X := GetSystemTime + 10000;
while (X >= GetSystemTime) and (not (InRange(CountColor(0, 250, 396, 307, 410), 155, 165))) do
Wait(50);
Wait(RandomRange(75, 400));
TypeSend(IntToStr(Amount));
Result := True;
end;
end;
end;
function WithdrawItems(OreType: String; Amount: Integer): Boolean;
var
OreName: String;
begin
case RandomRange(1, 2) of
1: OreName := OreType + ' Ore';
2: OreName := OreType + ' ore';
end;
if OreType = 'Coal' then
begin
SearchBank(OreType);
Wait(RandomRange(250, 750));
if WithdrawNoFix(0, 0, Amount) then Result := True;
end else
begin
SearchBank(OreName);
Wait(RandomRange(250, 750));
if WithdrawNoFix(0, 0, Amount) then Result := True;
end;
end;
function WithdrawOre(): Boolean;
begin
case Capitalize(Players[CurrentPlayer].Strings[0]) of
'Bronze':
begin
if WithdrawItems('Copper', 14) then Result := True;
Wait(RandomRange(500, 1000));
if WithdrawItems('Tin', 14) then Result := True;
end;
'Iron': if WithdrawItems('Iron', 28) then Result := True;
'Silver': if WithdrawItems('Silver', 28) then Result := True;
'Steel':
begin
if WithdrawItems('Iron', 9) then Result := True;
Wait(RandomRange(500, 1000));
if WithdrawItems('Coal', 0) then Result := True;
end;
'Gold': if WithdrawItems('Gold', 28) then Result := True;
'Mithril':
begin
if WithdrawItems('Mithril', 5) then Result := True;
Wait(RandomRange(500, 1000));
if WithdrawItems('Coal', 0) then Result := True;
end;
'Adamantite':
begin
if WithdrawItems('Adamantite', 4) then Result := True;
Wait(RandomRange(500, 1000));
if WithdrawItems('Coal', 0) then Result := True;
end;
'Rune':
begin
if WithdrawItems('Rune', 3) then Result := True;
Wait(RandomRange(500, 1000));
if WithdrawItems('Coal', 0) then Result := True;
end;
end;
end;
function DoBanking(): Boolean;
begin
Wait(RandomRange(500, 1500));
FindRandoms;
if R_OpenBankBooth('feb') then
begin //Opened the bank successfully
Wait(500 + Random(500));
R_DepositAll(True);
Wait(500 + Random(500));
if WithdrawOre() then
Result := True;
end else
begin //Reflection failed trying non reflection
if OpenBankFast('feb') then
begin
Wait(500 + Random(500));
R_DepositAll(True);
Wait(500 + Random(500));
if WithdrawOre() then
Result := True;
end else
begin //Non reflection failed trying a different one
if OpenBank('feb', False, False) then
begin
WriteLn('Bank booth opened, depositing all items');
Wait(500 + Random(500));
R_DepositAll(True);
Wait(500 + Random(500));
if WithdrawOre() then
Result := True;
end;
end;
end;
CloseBank;
end;
function WalkFunc(): Boolean;
var
Energy: Integer;
begin
Energy := R_GetMMLevels('run');
if(Energy < 15+random(15)) then
R_Rest(30+random(20));
if(not R_IsRunning) then
SetRun(True);
FindRandoms;
//Walking to smithy
if TileOnMM(BankTile) then
if RandomRange(1, 2) = 1 then
begin
if WalkPath(WalkToFurnace) then
begin
Result := True;
Exit;
end;
end else
begin
if WalkPath(WalkToFurnace2) then
begin
Result := True;
Exit;
end;
end;
//Walking to bank
if RandomRange(1, 2) = 1 then
begin
if WalkPath(WalkToBank) then
begin
Result := True;
Exit;
end;
end else
begin
if WalkPath(WalkToBank2) then
begin
Result := True;
Exit;
end;
end;
end;
function InteractWithFurnace(): Boolean;
begin
FurnaceObj := GetObjectByID(FurnaceID, OBJECT_TYPE_INTERACTABLE, 5)
TP := TileToMS(FurnaceObj.Tile, 1);
if TP.x > 0 then
begin
Mouse(TP.x, TP.y, 10, 10, False);
if not R_ChooseOptionMulti(['Smelt','smelt','melt']) then
begin
WriteLn('Reflection ChooseOptionMulti failed, using SRL');
Mouse(TP.x, TP.y, 5, 5, False);
if ChooseOptionMulti(['Smelt','smelt','melt']) then
begin
Result := True;
end;
end else
begin
Result := True;
end;
end else
begin
TP := TileToMS(FurnaceTile, 1);
Mouse(TP.x, TP.y, 10, 10, False);
if not R_ChooseOptionMulti(['Smelt','smelt','melt']) then
begin
WriteLn('Reflection ChooseOptionMulti failed, using SRL');
if ChooseOptionMulti(['Smelt','smelt','melt']) then
begin
Result := True;
end;
end else
begin
Result := True;
end;
end;
end;
function NotSmelting(): Boolean;
var
CAnimation: Integer;
begin
CAnimation := GetAnimation;
if not CAnimation = SmeltingAnimation then
Result := True;
end;
function GetBarID(): Integer;
var
BarID: Integer;
begin
case Capitalize(Players[CurrentPlayer].Strings[0]) of
'Bronze': BarID := 2349; //Copper Ore
'Iron': BarID := 2351;
'Silver': BarID := 2355;
'Steel': BarID := 2353;
'Gold': BarID := 2357;
'Mithril': BarID := 2359;
'Adamantite': BarID := 2361;
'Rune': BarID := 2363;
end;
Result := BarID
end;
function CalculateBars(): Integer;
var
I, BarID, Count: Integer;
Item: TInvItem;
begin
BarID := GetBarID();
Count := 0;
for I := 1 to 28 do
begin
Item := GetInvItemAt(I);
if Item.ID = BarID then
begin
Count := Count + 1;
end;
end;
Result := Count;
end;
function GetOreID(): Integer;
var
OreID: Integer;
begin
case Capitalize(Players[CurrentPlayer].Strings[0]) of
'Bronze': OreID := 436; //Copper Ore
'Iron': OreID := 440;
'Silver': OreID := 442;
'Steel': OreID := 440;
'Gold': OreID := 444;
'Mithril': OreID := 447;
'Adamantite': OreID := 449;
'Rune': OreID := 451;
end;
Result := OreID
end;
function HaveOre(): Boolean;
var
I, OreID: Integer;
Item: TInvItem;
begin
OreID := GetOreID();
for I := 1 to 28 do
begin
Item := GetInvItemAt(I);
if Item.ID = OreID then
begin
Result := True;
Exit;
end;
end;
end;
function SmeltBar(): Boolean;
begin
case Capitalize(Players[CurrentPlayer].Strings[0]) of
'Bronze': TP := Point(260, 420);
'Iron': TP := Point(260, 420);
'Silver': TP := Point(260, 420);
'Steel': TP := Point(290, 420); //Different for steel
'Gold': TP := Point(260, 420);
'Mithril': TP := Point(260, 420);
'Adamantite': TP := Point(260, 420);
'Rune': TP := Point(260, 420);
end;
case RandomRange(1, 2) of
1:
begin
Mouse(TP.x, TP.y, 25, 25, False);
if not R_ChooseOptionMulti(['Make All','make all','all']) then
begin
WriteLn('Reflection ChooseOptionMulti failed, using SRL');
if not ChooseOptionMulti(['Make All','make all','all']) then
begin
Result := False;
Exit;
end
end;
end;
2: Mouse(TP.x, TP.y, 25, 25, True);
end;
repeat
if not HaveOre() then
begin
Result := True;
Exit;
end;
if ClickToContinue then
begin
InteractWithFurnace();
Wait(RandomRange(1500, 3000));
SmeltBar();
end;
if Random(100) <= AntiBanPercent then
begin
AntiBan;
Players[CurrentPlayer].Integers[1] := Players[CurrentPlayer].Integers[1] + 1;
end;
until(NotSmelting);
Result := True;
end;
function DoSmelting(): Boolean;
begin
Wait(RandomRange(500, 1500));
FindRandoms;
if InteractWithFurnace() then
begin
Wait(RandomRange(1500, 3000));
if SmeltBar() then
Result := True;
end;
end;
function IsBreakTime(): Boolean;
var
TFromMark, TimeToBreak: Integer;
begin
if not LoggedIn then
Exit;
if (Players[CurrentPlayer].Integers[6] = 0) or (Players[CurrentPlayer].Integers[7] = 0) then
Exit;
TimeToBreak := Players[CurrentPlayer].Integers[6] * 60000;
TFromMark := GetSystemTime - StartTime;
if(TFromMark >= TimeToBreak) then
begin
BreakTime := GetSystemTime + (Players[CurrentPlayer].Integers[7] * 60000)+RandomRange(-150000,150000);
Result := True;
end;
end;
procedure TakeBreak();
begin
case RandomRange(1, 3) of
1:
begin
ExitToLobby;
repeat
WriteLn('Time Left in Break:'+MsToTime((BreakTime-GetSystemTime),Time_Short));
if(BreakTime-GetSystemTime>60000) then
begin
wait(RandomRange(180000,300000));
end else
begin
wait(RandomRange(40000,60000));
end;
until(BreakTime<GetSystemTime);
WriteLn('Break Over');
end;
2:
begin
repeat
WriteLn('Time Left in Break:'+MsToTime((BreakTime-GetSystemTime),Time_Short));
if(BreakTime-GetSystemTime>60000) then
begin
wait(RandomRange(180000,300000));
end else
begin
wait(RandomRange(40000,60000));
end;
until(BreakTime<GetSystemTime);
WriteLn('Break Over');
end;
3:
begin
Logout;
repeat
WriteLn('Time Left in Break:'+MsToTime((BreakTime-GetSystemTime),Time_Short));
if(BreakTime-GetSystemTime>60000) then
begin
wait(RandomRange(180000,300000));
end else
begin
wait(RandomRange(40000,60000));
end;
until(BreakTime<GetSystemTime);
WriteLn('Break Over');
end;
end;
end;
function GetState(): Integer;
begin
if IsBreakTime() then
begin
Result := BREAK;
Exit;
end;
if NearTile(BankTile, 10) and not InvFull() and HaveOre() then
begin
Result := WALK;
StopReason := NOORE;
Exit;
end;
if NearTile(BankTile, 10) and not InvFull() then
begin
Result := BANKING;
Exit;
end;
if NearTile(BankTile, 10) and InvFull() then
begin
Result := WALK;
Exit;
end;
if NearTile(SmithyTile, 10) and not HaveOre() then
begin
Result := WALK;
Exit;
end;
if NearTile(SmithyTile, 10) and HaveOre() then
begin
Result := SMELTING;
Exit;
end;
end;
procedure CheckLevels();
var
New, Gained: Integer;
begin
New := GetSkillLevel('smithing');
if New > 0 then
begin
Gained := New - Players[CurrentPlayer].Integers[4];
if Gained > 0 then
Players[CurrentPlayer].Integers[2] := Gained;
end;
end;
begin
SetupSRL;
SetupReflectionEx(True);
DeclarePlayers;
ClearDebug;
Bling;
repeat
ClearDebug;
WriteLn('Welcome to FaladorSmith'+' '+Players[CurrentPlayer].Name+'!');
while not LoggedIn() do
LoginPlayer();
SetAngle(True);
SetRun(True);
Players[CurrentPlayer].Integers[4] := GetSkillLevel('smithing');
SetupVars;
repeat
if Players[CurrentPlayer].Booleans[0] then
SetBest;
if Players[CurrentPlayer].Integers[0] < Players[CurrentPlayer].Integers[5] then
begin
case GetState() of
BANKING:
begin
WriteLn('In the bank, withdrawing ores');
if not DoBanking() then
begin
LogOut;
Failed := True;
StopReason := BANKFAIL;
end;
BankAttempts := BankAttempts + 1;
if BankAttempts > 2 then
begin
LogOut;
Failed := True;
StopReason := BANKFAIL;
end;
Wait(RandomRange(250, 1000));
end;
WALK:
begin
WriteLn('Walking...');
BankAttempts := 0;
if not WalkFunc() then
begin
LogOut;
Failed := True;
StopReason := WALKFAIL;
end;
end;
SMELTING:
begin
WriteLn('Smelting ore');
if not DoSmelting() then
begin
LogOut;
Failed := True;
StopReason := SMELTFAIL;
end;
CheckLevels;
Players[CurrentPlayer].Integers[0] := Players[CurrentPlayer].Integers[0] + 1;
Players[CurrentPlayer].Integers[3] := Players[CurrentPlayer].Integers[3] + CalculateBars();
ProgressReport;
if StopReason = NOORE then
begin
LogOut;
Failed := True;
end;
end;
BREAK:
begin
WriteLn('Taking a break');
StopReason := BREAKFAIL;
TakeBreak();
Breaks := Breaks + 1;
SetupVars;
end;
end;
end else
begin
WriteLn('Player reached load limit, changing to next player');
StopReason := LOADSDONE;
LogOut;
end;
until not(LoggedIn);
if Failed then
begin
StopCause;
NextPlayer(False);
end;
until(AllPlayersInActive);
end.
Players Array Notes
Integers:
0 - LoadsCompleted
1 - AntiBansDone
2 - LevelsGained
3 - BarsSmelted
4 - StartingSmithingLevel
5 - LoadsToDo
6 - RestEvery
7 - RestFor
Strings:
0 - BarType
Booleans:
0 - MakeBestBarType