SCAR Code:
program New;
{.include SRL/SRL/Misc/SMART.scar}
{.include SRL/SRL.scar}
{.include srl/srl/misc/worldswitcher.scar}
{.include SRL/SRL/Reflection/Reflection.scar}
{.include SRL/SRL/Misc/FindXP.Scar}
Type
Progress = Record
StartExp, StartLevels, ExpGain, LevelsGain : Array [1..2] of Integer;
WeaponSpot : Integer;
Weapon : TInvItem;
Time : Integer;
end;
var
ProgressPlayer : array of Progress;
TotalExp, TotalLevels, TotalAttacks,OgreIndex, Counter, Action: integer;
TypeThis: String;
frmDesign : TForm;
Button : array [0..5] of TButton;
TS : TEdit;
const
DebugMode = False;
ChangeWorldIfCannon = True;
FKeyForOptions = 10;
XCordForSMARTProggie = 6;
YCordForSMARTProggie = 25;
procedure DeclarePlayers;
begin
HowManyPlayers:= 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
Players[0].Name := '';
Players[0].Pass := '';
Players[0].Nick := '';
Players[0].Active := True;
Players[0].Booleans[0] := False; // Logout about every 10 minutes.
Players[0].Booleans[1] := True; // Sleep once in a while.. /Needs Booleans[0] true.
Players[0].Booleans[2] := True; // Take long sleeps. Good for 24/hour runs. /Needs Booleans[0] true.
Players[0].Booleans[3] := True; // Special attack?
Players[0].Booleans[4] := False; // Right Click only?
Writeln( IntToStr ( HowManyPlayers ) + ' Players' );
SetPlayerNameTPAs;
SetArrayLength(ProgressPlayer, HowManyPlayers);
end;
Procedure DebugThis(S :String);
begin
If DebugMode Then
Writeln(s + ' | LoggedIn : ' + BoolToStr(LoggedIn));
end;
Procedure WantOptions;Forward;
Procedure DoButton1(Sender : TObject);
begin
TypeThis := TS.Text;
TS.Text := '';
Action := 1;
end;
Procedure DoButton2(Sender : TObject);
begin
Action := 2;
end;
Procedure DoButton3(Sender : TObject);
begin
Action := 3;
end;
Procedure DoButton4(Sender : TObject);
begin
Action := 4;
end;
Procedure DoButton5(Sender : TObject);
begin
Action := 5;
end;
Procedure DoButton6(Sender : TObject);
begin
Action := 6;
end;
procedure InitForm;
var
i: integer;
begin
frmDesign := CreateForm;
frmDesign.Left := 200;
frmDesign.Top := 345;
frmDesign.Width := 200;
frmDesign.Height := 345;
frmDesign.Caption := 'ToolBox!';
frmDesign.Color := clBlack;
frmDesign.Font.Color := clWindowText;
frmDesign.Font.Height := -11;
frmDesign.Font.Name := 'MS Sans Serif';
frmDesign.Font.Style := [];
frmDesign.Visible := True;
frmDesign.PixelsPerInch := 96;
frmDesign.BorderStyle := BsSingle;
TS := TEdit.Create(frmDesign);
TS.Parent := frmDesign;
TS.Left := 100;
TS.Top := 23;
TS.Width := 70;
TS.Height := 20;
For i:=1 to 5 do
begin
Button[i] := TButton.Create(frmDesign);
Button[i].Parent := frmDesign;
Button[i].Left := 30;
Button[i].Top := 16 + I * 48;
Button[i].Width := 140;
Button[i].Height := 33;
Button[i].TabOrder := I;
end;
Button[0] := TButton.Create(frmDesign);
Button[0].Parent := frmDesign;
Button[0].Left := 30;
Button[0].Top := 16;
Button[0].Width := 65;
Button[0].Height := 33;
Button[0].OnClick := @DoButton1;
Button[0].Caption := 'Type this';
Button[1].OnClick := @DoButton2;
Button[1].Caption := 'Special attack';
Button[2].OnClick := @DoButton3;
Button[2].Caption := 'NextPlayer(True)';
Button[3].OnClick := @DoButton4;
Button[3].Caption := 'NextPlayer(False)';
Button[4].OnClick := @DoButton5;
Button[4].Caption := 'Uptade ProgressReport';
Button[5].OnClick := @DoButton6;
Button[5].Caption := 'Change world';
end;
procedure SafeInitForm;
var
v: TVariantArray;
begin
setarraylength(V, 0);
ThreadSafeCall('InitForm', v);
end;
procedure ShowFormModal;
begin
frmDesign.Show;
end;
procedure SafeShowFormModal;
var
v: TVariantArray;
begin
setarraylength(V, 0);
ThreadSafeCall('ShowFormModal', v);
end;
Procedure OpenForm;
begin
SafeInitForm;
SafeShowFormModal;
end;
Procedure GetWeapon;
var
Equiped : TItemArray;
begin
DebugThis('GetWeapon Started.');
Equiped := GetEquippedItems;
If Equiped[3].Stack > 100 then
Begin
ProgressPlayer[CurrentPlayer].WeaponSpot := 3;
ProgressPlayer[CurrentPlayer].Weapon.ID := Equiped[3].ID;
ProgressPlayer[CurrentPlayer].Weapon.Stack := Equiped[3].Stack;
Exit;
end;
If Equiped[13].Stack > 100 then
begin
ProgressPlayer[CurrentPlayer].WeaponSpot := 13;
ProgressPlayer[CurrentPlayer].Weapon.ID := Equiped[13].ID;
ProgressPlayer[CurrentPlayer].Weapon.Stack := Equiped[13].Stack;
Exit;
end;
end;
Function HowMuchAmmo: Integer;
begin
DebugThis('HowMuchAmmo Started.');
Result := GetEquippedItemAmountAt(ProgressPlayer[CurrentPlayer].WeaponSpot);
Writeln('Ammo left : ' + IntToStr(Result));
DebugThis('HowMuchAmmo ended : ' + IntToStr(Result));
end;
Procedure CheckAmmo;
begin
DebugThis('CheckAmmo Started.');
If HowMuchAmmo < 100 then
begin
WriteLn(Players[CurrentPlayer].Name + ' Logged. Cause: Low ammo.');
LogOut;
Exit;
end;
end;
Function ChangeWorld(WorldNumber: Integer; Members, Pvp: Boolean): Boolean;
begin
If LoggedIn Then Logout;
Wait(1000+Random(2000));
If WorldNumber > 0 then
begin
Result := SelectWorld(WorldNumber);
Exit;
end;
Result := SelectWorld(RandomWorld(Members, Pvp));
end;
Function FindCannon: Boolean;
var TempT : TPoint;
begin
If ChangeWorldIfCannon then
Result := FindObjectEx(TempT, 6, 25);
end;
Function DealWithCannon:Boolean;
begin
If FindCannon Then
begin
DebugThis('Found Cannon, Changing world.');
LogOut;
ChangeWorld(0, True, False);
Wait(RandomRange(1500, 10000));
LoginPlayer;
Result := True;
end;
end;
{*******************************************************************************
Function CountSpecial: Integer;
By: N1ke!
Description: Counts special attack power, results in 25, 50, 75 or 100.
*******************************************************************************}
Function CountSpecial: Integer;
var
Spec : array [1..2] of TPoint;
i, x, y : Integer;
begin
If Not GameTab(1)Then Exit;
Spec[1] := Point(602, 417);
Spec[2] := Point(619, 426);
Wait(250+Random(500));
For i:=1 to 4 do
begin
If FindColorTolerance(x, y, 4294720, Spec[1].X, Spec[1].Y, Spec[2].X, Spec[2].Y, 10)then
begin
Result := Result + 25;
Spec[1] := Point(Spec[1].X + 28, Spec[1].Y);
Spec[2] := Point(Spec[2].X + 28, Spec[2].Y);
end else Exit;
end;
end;
{*******************************************************************************
Function UseSpecial(PowerNeed: Integer):Boolean;
By: N1ke!
Description: Uses special. Powerneed = How much power you need to
perform a special attack ( 25/50/75/100% ).
*******************************************************************************}
Function DoSpec(PowerNeed: Integer):Boolean;
begin
DebugThis('DoSpec Started.');
If Not Players[CurrentPlayer].Booleans[3] then Exit;
If CountSpecial >= PowerNeed then
begin
MouseBox(574, 417, 710, 426, 1);
Result := True;
end;
end;
{*******************************************************************************
Function ChangeWorld: Boolean;
by: N1ke!
Description: Changes world.
Leave WorldNumber to 0 for random world. If so choose Members/Pvp booleans.
*******************************************************************************}
Function CountPeople: Integer;
var
CDS : Array of Tplayer;
begin
DebugThis('CountPeople Started.');
CDS := GetPlayers;
Result := Length(CDS);
DebugThis('CountPeople Ended : ' + IntToStr(Result));
end;
Function Crowded: Boolean;
Begin
Result := CountPeople >= 4;
end;
Procedure Gained;
var
MyStuff : TMe;
begin
DebugThis('Gained Started.');
MyStuff := GetMe;
If not Players[CurrentPlayer].Booleans[5] then
begin
ProgressPlayer[CurrentPlayer].StartExp[1] := MyStuff.Experience[3];
ProgressPlayer[CurrentPlayer].StartExp[2] := MyStuff.Experience[4];
ProgressPlayer[CurrentPlayer].StartLevels[1] := SmartGetFieldArrayInt(0, MaxLevels, 3);
ProgressPlayer[CurrentPlayer].StartLevels[2] := SmartGetFieldArrayInt(0, MaxLevels, 4);
Players[CurrentPlayer].Booleans[5] := True;
Exit;
end;
ProgressPlayer[CurrentPlayer].ExpGain[1] := MyStuff.Experience[3] - ProgressPlayer[CurrentPlayer].StartExp[1];
ProgressPlayer[CurrentPlayer].ExpGain[2] := MyStuff.Experience[4] - ProgressPlayer[CurrentPlayer].StartExp[2];
ProgressPlayer[CurrentPlayer].LevelsGain[1] := SmartGetFieldArrayInt(0, MaxLevels, 3) - ProgressPlayer[CurrentPlayer].StartLevels[1];
ProgressPlayer[CurrentPlayer].LevelsGain[2] := SmartGetFieldArrayInt(0, MaxLevels, 4) - ProgressPlayer[CurrentPlayer].StartLevels[2];
end;
Function Lost: Boolean;
begin
Result := True;
If TileOnMS(Point(2528, 3372), 0)then
begin
Result := False;
Exit;
end else WalkToTile(Point(2528, 3372), 2, 0);
If TileOnMM(Point(2528, 3372))then
begin
Result := False;
Exit;
end;
Writeln('Lost!, can''t find the cage.');
end;
Procedure NewPlayer;
begin
SetAngle(True);
SetAllChats('on', 'off', '', 'off', 'off');
MarkTime(ProgressPlayer[CurrentPlayer].Time);
GetAllLevels;
Gained;
GetWeapon;
end;
Function NChangePlayer: Boolean;
begin
If PlayersActive > 2 then
begin
Writeln('LoggedOut. Cuase: Changing player.');
NextPlayer(True);
NewPlayer;
Result := True;
end;
end;
Procedure MaybeSleep;
var
v, h, Time: integer;
begin
Case Random(100) of
1..10:begin
If PlayersActive = 1 then
begin
If Not Players[CurrentPlayer].Booleans[1] Then
Exit;
LogOut;
v := RandomRange(4, 13);
h := v;
MarkTime(Time);
Repeat
Writeln('Sleeping for ' + IntToStr(v) + ' minutes');
Wait(1000*60*1);
v := v - 1;
Until(TimeFromMark(Time) > 1000*60*h);
end;
end;
11,12:begin
If PlayersActive = 1 then
begin
LogOut;
If Not Players[CurrentPlayer].Booleans[2] Then
Exit;
v := RandomRange(30, 120);
h := v;
MarkTime(Time);
Repeat
Writeln('Sleeping for ' + IntToStr(v) + ' minutes');
Wait(1000*60*1);
v := v - 1;
Until(TimeFromMark(Time) > 1000*60*h);
end;
end;
end;
end;
Function GetHp: Integer;
begin
Result := GetMe.Levels[3];
end;
Function CheckEat: Boolean;
var
CHp, i : Integer;
Begin
DebugThis('CheckEat Started.');
CHp := Round(Players[currentPlayer].Level[8] / 100 * RandomRange(40, 50));
If GetHp < CHp then
begin
Writeln('Low hp eating');
For i := 1 to 28 do
begin
If ExistsItem(i)then
begin
MMouseItem(i);
Wait(50);
If IsUpText('Eat')then
begin
MouseItem(i, True);
Result := True;
Exit;
end else
If i = 28 then
begin
RunAway('s', True, 2, 0);
LogOut;
Exit;
end;
end;
end;
end;
end;
Procedure TimeOuts;
begin
If Not LoggedIn then
begin
NextPlayer(False);
NewPlayer;
end;
If TimeFromMark(ProgressPlayer[CurrentPlayer].Time) > 60000*RandomRange(7, 20)then
begin
If Players[CurrentPlayer].Booleans[0] then
Logout;
MaybeSleep;
NChangePlayer;
LoginPlayer;
MarkTime(ProgressPlayer[CurrentPlayer].Time);
end;
end;
Procedure AntiRandoms;
Var
InFight: Tme;
begin
FindNormalRandoms;
InFight := GetMe;
If InFight.InFight then
RunAway('w', true, 1, RandomRange(2000, 5000));
end;
Procedure AntiBan;
Begin
Case Random(150) of
1: HoverSkill('random', False);
2: BoredHuman;
3: MouseBox(59, 31, 647, 264, 3);
5, 6: CheckEat;
7..11 : Dospec(75);
16..19: GameTab(RandomRange(1, 13));
end;
end;
Function N_Ranging: Boolean;
var
i, x : integer;
begin
FTWait(1);
repeat
x := SmartGetFieldObject(0, MyPlayer)
Result := SmartGetFieldInt(x, CharAnim) > -1;
SmartFreeObject(x);
Inc(i);
Wait(200+Random(100));
until(i > 7)or(result)or(Not(IsInteractingWithMeIndex(OgreIndex)));
end;
Function FindOgre: Boolean;
var
Ogres : Array of TNPCEx;
i, x, y : integer;
begin
If Not LoggedIn Then Exit;
Ogres := SortNPCsEx(GetNPCsByIDEx(2801));
If GetArrayLength(Ogres) = 0 then Exit;
For i:= 0 to High(Ogres) do
begin
If Ogres[i].InFight then Continue;
If Not TileOnMSEx(Ogres[i].Tile, 0)then
If Not WalkToTileMS(Point(2528, 3372), 0, 2)then
WalkToTile(Point(2528, 3372), 0, 2);
MMouse(Round(Ogres[i].MS.X), Round(Ogres[i].MS.Y), 10, 15);
Wait(150+Random(125));
If Players[CurrentPlayer].Booleans[4] then
begin
GetMousePos(x, y);
Mouse(x, y, 0, 0, False);
Wait(150+Random(100));
If ChooseOption('ttack')then
begin
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end else Exit;
end;
If Pos('gre', rs_GetUpText) > 0 then
begin
GetMousePos(x, y);
case Random(5) of
0 : begin
Mouse(x, y, 0, 0, False);
Wait(150+Random(100));
If ChooseOption('ttack')then
begin
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end;
end;
1..4: Begin
If Not Pos('gre', rs_GetUpText) > 0 then Exit;
Mouse(x, y, 0, 0, True);
Result := True;
OgreIndex := Ogres[i].Index;
Exit;
end;
end;
end else
begin
Result := FindOgre;
Exit;
end;
end;
end;
Procedure FightWait;
Begin
DebugThis('FightWait Started.');
FTwait(RandomRange(2, 4));
CheckEat;
WantOptions;
Inc(TotalAttacks);
Repeat
Wait(200);
WantOptions;
AntiRandoms;
AntiBan;
Until(Not(N_Ranging));
end;
procedure SaveDebug; //Thanks to whoever made this...
var
FileNum: integer;
begin
FileNum := RewriteFile(ScriptPath + 'Ogres.txt', True);
if (FileNum < 0) then
WriteLn('@@@ Error with save: File Error.');
WriteFileString(FileNum, GetDebugText);
CloseFile(FileNum);
end;
Function GetPaintBitmap(Color, sX, sY: Integer; Text: TStringArray; Dist: Integer): Integer;
Var
TPA: TPointArray;
H, Q, B: Integer;
Begin
Result := BitmapFromString(sX, sY, '');
For B := 0 To High(Text) Do
Begin
TPA := LoadTextTPA(Text[b], SmallChars, H);
For Q := 0 To High(TPA) Do
FastSetPixel(Result, TPA[q].x, TPA[q].y + B * Dist, Color);
End;
End;
Procedure ClearSMARTCanvas;
Var
BMP: Integer;
SMARTCanvas, Canvas: TCanvas;
Begin
BMP := BitmapFromString(765, 503, '')
SMARTCanvas := GetBitmapCanvas(BMP);
Canvas := GetBitmapCanvas(BMP);
SMARTCanvas.handle := SmartGetDebugDC;
CopyCanvas(Canvas, SMARTCanvas, 0, 0, 765, 503, -1000, -1000, 1000, 1000);
FreeBitmap(BMP);
End;
Procedure ProgressReportCanvas(X, Y: Integer);
Var
SCanvas, Canvas: TCanvas;
BMP, Sec : Integer;
AR, BR, AH, BH: Extended;
Text: TStringArray;
Mystuff: TMe;
Begin
Sec := GetTimeRunning Div 1000 + 1;
ClearSMARTCanvas;
BMP := BitmapFromString(765, 503, '');
SCanvas := GetBitmapCanvas(BMP);
SCanvas.handle := SmartGetDebugDC;
MyStuff := GetMe;
AR := MyStuff.Experience[4] - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)-1);
BR := ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)) - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 4)-1);
AR := Round((AR / BR) * 100);
Round(AR*100);
AH := MyStuff.Experience[3] - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)-1);
BH := ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)) - ConvertLvlToXP(SmartGetFieldArrayInt(0, MaxLevels, 3)-1);
AH := Round((AH / BH) * 100);
Round(AH*100);
Text := [
'Has been running for : ' + TimeRunning,
'Tried to attack a total of ' + IntToStr(TotalAttacks) + ' Ogres.',
'Range exp until level(' + IntToStr(SmartGetFieldArrayInt(0, MaxLevels, 4)+1) + ') : ' + IntToStr(R_XpTillNextLevel(4)),
FloatToStr(AR) + '/100% to next Range level.',
'HP exp until level(' + IntToStr(SmartGetFieldArrayInt(0, MaxLevels, 3)+1) + ') : ' + IntToStr(R_XpTillNextLevel(3)),
FloatToStr(AH) + '/100% to next HP level.'];
Canvas := GetBitmapCanvas(GetPaintBitmap(255, 765, 503, Text, 25));
CopyCanvas(Canvas, SCanvas, 0, 0, 765, 503, X, Y, X + 765, Y + 503);
FreeBitmap(BMP);
End;
Procedure ProgressReport;
var
i, ii : integer;
s : string;
begin
If Not DebugMode then ClearDebug;
Gained;
TotalExp := 0;
TotalLevels := 0;
For i:= 0 to HowManyPlayers - 1 do
For ii:=1 to 2 do
begin
TotalExp := TotalExp + ProgressPlayer[i].ExpGain[ii]
TotalLevels := TotalLevels + ProgressPlayer[i].LevelsGain[ii]
end;
Writeln(' {-[]-¤ Multi Progress Report ¤-[]-}');
Writeln('[-{-[>] By N1ke! the genius. [<]-}-]');
Writeln('[-]');
Writeln('[-{-[>] Time running: ' + TimeRunning);
Writeln('[-{-[>] Total Exp: ' + IntToStr(TotalExp));
If ResponsesMade > 0 then Writeln('[-{-[>] Responses made: ' + IntToStr(ResponsesMade));
If TotalLevels > 0 then Writeln('[-{-[>] Total Levels: ' + IntToStr(TotalLevels));
For i:= 0 to HowManyPlayers - 1 do
begin
Writeln('[-]');
s := '[>] [' + BoolToStr(Players[i].Active) + '] Player: ' + SplitName(Players[i].Name) + ' / ';
If ProgressPlayer[i].ExpGain[1] > 0 then
s := s + 'HP Exp Gained: ' + IntToStr(ProgressPlayer[i].ExpGain[1]) + ' / ';
s := s + 'HP Exp/h: ' + IntToStr(Round(ProgressPlayer[i].ExpGain[1] / (GetTimeRunning / 3600000.0))) + ' / ';
If ProgressPlayer[i].ExpGain[2] > 0 then
s := s + 'Range Exp Gained: ' + IntToStr(ProgressPlayer[i].ExpGain[2]) + ' / ';
s := s + 'Range Exp/h: ' + IntToStr(Round(ProgressPlayer[i].ExpGain[2] / (GetTimeRunning / 3600000.0))) + ' / ';
If ProgressPlayer[i].LevelsGain[1] > 0 then
s := s + 'HP Level(s) Gained: ' + IntToStr(ProgressPlayer[i].LevelsGain[1]) + ' / ';
If ProgressPlayer[i].LevelsGain[2] > 0 then
s := s + 'Range Level(s) Gained: ' + IntToStr(ProgressPlayer[i].LevelsGain[2]) + ' / ';
Writeln(s);
end;
SaveDebug;
end;
Procedure Checker;
begin
CheckAmmo;
ProgressReport;
Counter := 0;
end;
Procedure WantOptions;
begin
Case Action Of
1: Begin
CloseQC;
TypeSend(TypeThis);
End;
2: DoSpec(75);
3: Begin
NextPlayer(True);
NewPlayer;
end;
4: Begin
NextPlayer(False);
NewPlayer;
end;
5: ProgressReport;
6: begin
ChangeWorld(0, True, False);
LoginPlayer;
end;
end;
Action := 0;
If IsFKeyDown(FKeyForOptions)then
OpenForm;
end;
Procedure MainLoop;
Begin
LogInPlayer;
NewPlayer;
Repeat
ProgressReportCanvas(XCordForSMARTProggie, YCordForSMARTProggie);
WantOptions;
DealWithCannon;
If Lost Then
begin
Logout;
TerminateScript;
end;
Inc(Counter);
DebugThis('-A-');
TimeOuts;
DebugThis('-B-');
If Crowded then
begin
DebugThis('-C-');
LogOut;
ChangeWorld(0, True, False);
LoginPlayer;
end;
WantOptions;
DebugThis('-D-');
If Counter > RandomRange(7,15) then Checker;
DebugThis('-G-');
If(Not(LoggedIn))Then
begin
DebugThis('-H-');
FTwait(8);
If(Not(LoggedIn))Then
begin
NextPlayer(False);
DebugThis('-I-');
NewPlayer;
end;
end;
DebugThis('-J-');
WantOptions;
If Not FindOgre then
begin
If Lost Then LogOut;
AntiRandoms;
end else FightWait;
DebugThis('-L-');
WantOptions;
Case Random(20) of
0,1,3: AntiBan;
2: CheckEat;
end;
DebugThis('-M-');
Until(False);
DebugThis('-N-');
end;
begin
SetupSRL;
SmartSetupEx(65, False, True, False);
Wait(5000);
SetTargetDC(SmartGetDC);
while not SmartActive do wait(100);
SetupReflection;
DeclarePlayers;
SetupAutoResponder(90, True);
Case Random(3) of
0: If Not LoggedIn then ChangeWorld(0, True, False);
end;
MainLoop;
end.