SCAR Code:
program AntiCrabs;
{.include SRL/SRL/Misc/SMART.scar}
{.include SRL/SRL.scar}
{.include SRL/SRL/misc/Users.Scar}
{.Include SRL/SRL/Skill/Magic.scar}
{.include srl/srl/misc/worldswitcher.scar}
{.include SRL/SRL/Reflection/Reflection.scar}
var
i, Hp, HpEx, time, CrabsKill, ExpGain, HowManyResponds, Responded, Cannon: integer;
NPCs, NPCs2: array of TNPC;
C0l: string;
TheQuestion, TheRespond: array of array of string;
PickUpIDS : TintegerArray;
PickUpText : TStringArray;
{[-]-> Setup Start <-[-]}
const
SmartWorld = 'world132';
YourSRLID = '';
YourSRLPassword = '';
ChangeWorldIfCannon = True;
ShortSleep = True;
procedure SetupResponds; //MADE BY MASTERKILL! ALL CREDIT TO HIM!
begin
HowManyResponds := 3;
SetArrayLength(TheQuestion, HowManyResponds); SetArrayLength(TheRespond, HowManyResponds);
TheQuestion[0] := ['evel', 'vl', 'tats', 'ange', 'age', 'trength'];
TheRespond[0] := ['Look me up', 'I don''t wanna tell you', 'I don''t feel like talking', 'idk', 'zzz', 'zzzzzz'];
TheQuestion[1] := ['espond', 'utoer'];
TheRespond[1] := ['i don''t wanna talk at all', 'i dont have anything to say', 'no im busy'];
TheQuestion[2] := [Players[CurrentPlayer].nick];
TheRespond[2] := ['no', 'get lost', 'im busy', 'go away', 'let me kill my crabs alone'];
end; //MADE BY MASTERKILL! ALL CREDIT TO HIM!
Procedure PickUpSetup;
begin
PickUpIDS := ([402, 806, 807, 808, 809, 810, 403, 863,
864, 865, 866, 867, 868, 869, 882, 884,
886, 888, 890, 892, 7552, 877, 9140, 9141,
9142, 9143, 9144, 8882]);
PickUpText := (['dible', 'art', 'rrow', 'olt', 'nife',
'croll, eaw']);
end;
{[-]-> Setup end. <-[-]}
function TheResponder: boolean; //MADE BY MASTERKILL! ALL CREDIT TO HIM!
var
I, II, Rand: Integer;
Text, Name: string;
begin
if not GetLastChatText(Text) then
Exit;
for I := 0 to HowManyResponds - 1 do
begin
for II := 0 to High(TheQuestion[i]) do
begin
if (Pos(TheQuestion[i][II], Text) <> 0) then
begin
Status('$Making Respond');
Name := GetBlackChatMessage;
if (Pos(Players[CurrentPlayer].nick, Name) <> 0) then
break;
WriteLn('Respond:');
WriteLn('/ ' + Name + ' ' + Text);
Rand := Random(High(TheRespond[i]));
TypeSend(TheRespond[i][Rand]);
WriteLn('/ ' + Players[CurrentPlayer].Name + ': ' + TheRespond[i][Rand]);
Result := True;
Responded := Responded + 1;
exit;
end;
end;
end;
end; //MADE BY MASTERKILL! ALL CREDIT TO HIM!
function NLoggedIn: Boolean;
var
t, cx, cy: Integer;
begin
Result := FindColor(cx, cy, 16777215, 439, 491, 440, 492);
if (not Result) then
begin
T := GetSystemTime;
while (GetSystemTime - T < 500) and (not FindColor(cx, cy, 16777215, 439, 491, 440, 492)) do
Wait(100);
Result := FindColor(cx, cy, 16777215, 439, 491, 440, 492);
end;
end;
function ChooseOptionMulti(Text: TStringArray): Boolean;
var
B: TBox;
TPA: TPointArray;
X, Y, I, C: Integer;
P: TPoint;
begin
Result := False;
GetClientDimensions(B.X2, B.Y2);
B.X1 := 0;
B.Y1 := 0;
FindColorsTolerance(TPA, 4674653, B.X1, B.Y1, B.X2, B.Y2, 0);
if Length(TPA) < 10 then
Exit;
B.X2 := 0;
B.Y2 := 0;
P := TPA[0];
for I := 0 to High(TPA) - 1 do
if TPA[i].X = TPA[I + 1].X - 1 then
begin
if C > 5 then
begin
B.X1 := P.X;
B.Y1 := P.Y;
Break;
end
else
C := C + 1;
end
else
begin
P := TPA[I + 1];
C := 0;
end;
if I = Length(TPA) then
begin
WriteLn('Choose Option Menu Getting Failed');
Exit;
end;
InvertTPA(TPA);
C := 0;
P := TPA[0];
for I := 0 to High(TPA) - 1 do
if TPA[i].X = TPA[I + 1].X + 1 then
begin
if C > 5 then
begin
B.X2 := P.X;
B.Y2 := P.Y;
Break;
end
else
C := C + 1;
end
else
begin
P := TPA[I + 1];
C := 0;
end;
if I = Length(TPA) then
begin
WriteLn('Choose Option Menu Getting Failed');
Exit;
end;
for i := 0 to High(Text) do
begin
if FindText(X, Y, Text[i], upchars, B.X1, B.Y1, B.X2, B.Y2) then
begin
Result := True;
Mouse(B.X1 + 5, y + 1, B.X2 - B.X1 - 5, 13, True);
Exit;
end;
end;
MMouse(B.X1 - 50, B.Y1 - 50, 40, B.Y2 - B.Y1);
Wait(200 + Random(100));
end;
procedure PickUp;
var
Iteems: array of TGroundItem;
a: integer;
begin
Exit;
if Not Players[CurrentPlayer].Booleans[2] then Exit;
if InvFull then
Exit;
if not FindGroundItems(Iteems, [PickUpIDS], 3) then
Exit;
for a := 0 to High(Iteems) do
begin
Mouse(Iteems[a].MS.x, Iteems[a].MS.y, 2, 2, False);
ChooseOptionMulti([PickUpText]) Wait(RandomRange(300, 1250));
end;
if Players[CurrentPlayer].Booleans[3] then
begin
for i := 1 to 28 do
begin
if ExistsItem(i) then
begin
MMouseItem(i);
Wait(RandomRange(50, 340));
if IsUpTextMultiCustom(['art', 'rrow', 'olt', 'nife']) then
begin
MouseItem(i, True);
Exit;
end;
end;
end;
end;
end;
function WalkToMainPoint: Boolean;
var
T1l: Tpoint;
begin
T1l.X := 2708 + RandomRange(0, 3) - RandomRange(0, 3);
T1l.Y := 3717 + RandomRange(0, 3) - RandomRange(0, 3);
if not WalkToTile(T1l, 0, 0) then
Exit
else
Result := True;
end;
function CheckEat: Boolean; forward;
function DoSpec: Boolean;
var
lox, loy: integer;
begin
if Players[CurrentPlayer].Booleans[0] then
begin
GameTab(1);
if FindColorTolerance(lox, loy, 4360769, 702, 419, 713, 428, 6) then
begin
MouseBox(570, 413, 714, 431, 1);
Writeln('Toggled special attack');
Result := True;
end;
end;
end;
procedure MightRun;
begin
if GetMMLevels('run', C0l) > RandomRange(40, 100) then
SetRun(True);
end;
procedure DrinkPotion;
var
Vial, xxx, yyy, Time: Integer;
begin
Exit;
if Players[CurrentPlayer].Booleans[1] = False then
Exit;
If TimeFromMark(Time) < 1000*60*7 then Exit;
GameTab(4);
Vial := DTMFromString('78DA636C646460F804C448C064C50586FF401' +
'A24FA1F0818EB81ACFBA86A20B23012483711A1A60DC87A42849A' +
'6704D4B400592F08A8E900B23E1350D305647D25A0A61BC8FA4E4' +
'04D3B90F58B88F0F943404D2D90F59B809A4A22ECAAC48C53AC76' +
'BD26A0A68688B8A803B21E1150534E380C01C01120DE');
if FindDTM(Vial, xxx, yyy, MIX1, MIY1, MIX2, MIY2) then
begin
FreeDTM(Vial);
MMouse(xxx, yyy, 2, 2);
if IsUpText('ial') then
begin
GetMousePos(xxx, yyy);
Mouse(xxx, yyy, 0, 0, False);
if not ChooseOption('rop') then
Exit;
DrinkPotion;
Exit;
end;
if IsUpText('rink') then
begin
GetMousePos(xxx, yyy);
Mouse(xxx, yyy, 0, 0, True);
MarkTime(Time);
end;
end;
end;
procedure AntiBan;
begin
case Random(200) of
1: HoverSkill('random', False);
2: BoredHuman;
3: MouseBox(59, 31, 647, 264, 3);
4: MouseSpeed := MouseSpeed + Random(2) - Random(2);
5, 6: CheckEat;
7, 8, 9, 10, 11: Dospec;
12, 13: MightRun;
16, 17, 18, 19: GameTab(RandomRange(1, 13));
20, 21: DrinkPotion;
end;
end;
procedure GetLevel;
var
Me3: TMe;
Ci: Integer;
begin
if Players[CurrentPlayer].Integers[16] = 0 then
begin
Me3 := GetMe;
Players[CurrentPlayer].Integers[16] := Me3.Levels[3];
Players[CurrentPlayer].Integers[17] := Me3.Levels[0];
Players[CurrentPlayer].Integers[18] := Me3.Levels[2];
Players[CurrentPlayer].Integers[19] := Me3.Levels[1];
Players[CurrentPlayer].Integers[20] := Me3.Levels[4];
Players[CurrentPlayer].Integers[21] := Me3.Levels[6];
Exit;
end;
Players[CurrentPlayer].Integers[28] := 0;
Me3 := GetMe;
Players[CurrentPlayer].Integers[22] := Me3.Levels[3];
Players[CurrentPlayer].Integers[23] := Me3.Levels[0];
Players[CurrentPlayer].Integers[24] := Me3.Levels[2];
Players[CurrentPlayer].Integers[25] := Me3.Levels[1];
Players[CurrentPlayer].Integers[26] := Me3.Levels[4];
Players[CurrentPlayer].Integers[27] := Me3.Levels[6];
for ci := 22 to 27 do
begin
Players[CurrentPlayer].Integers[ci] := Players[CurrentPlayer].Integers[ci] - Players[CurrentPlayer].Integers[ci - 6];
Players[CurrentPlayer].Integers[28] := Players[CurrentPlayer].Integers[28] + Players[CurrentPlayer].Integers[ci];
end;
end;
procedure GetCBLevel;
var
Me4: TMe;
begin
if Players[CurrentPlayer].Integers[29] = 0 then
begin
Me4 := GetMe;
Players[CurrentPlayer].Integers[29] := Me4.Combat;
end;
Me4 := GetMe;
Players[CurrentPlayer].Integers[30] := Me4.Combat;
Players[CurrentPlayer].Integers[31] := Players[CurrentPlayer].Integers[30] - Players[CurrentPlayer].Integers[29];
end;
procedure GetExp;
var
Me2: TMe;
Ci: Integer;
begin
if Players[CurrentPlayer].Integers[4] = 0 then
begin
Me2 := GetMe;
Players[CurrentPlayer].Integers[4] := Me2.Experience[3];
Players[CurrentPlayer].Integers[5] := Me2.Experience[0];
Players[CurrentPlayer].Integers[6] := Me2.Experience[2];
Players[CurrentPlayer].Integers[7] := Me2.Experience[1];
Players[CurrentPlayer].Integers[8] := Me2.Experience[4];
Players[CurrentPlayer].Integers[9] := Me2.Experience[6];
Exit;
end;
Players[CurrentPlayer].Integers[3] := 0;
Me2 := GetMe;
Players[CurrentPlayer].Integers[10] := Me2.Experience[3];
Players[CurrentPlayer].Integers[11] := Me2.Experience[0];
Players[CurrentPlayer].Integers[12] := Me2.Experience[2];
Players[CurrentPlayer].Integers[13] := Me2.Experience[1];
Players[CurrentPlayer].Integers[14] := Me2.Experience[4];
Players[CurrentPlayer].Integers[15] := Me2.Experience[6];
for ci := 10 to 15 do
begin
Players[CurrentPlayer].Integers[ci] := Players[CurrentPlayer].Integers[ci] - Players[CurrentPlayer].Integers[ci - 6];
Players[CurrentPlayer].Integers[3] := Players[CurrentPlayer].Integers[3] + Players[CurrentPlayer].Integers[ci];
end;
GetLevel;
GetCbLevel;
end;
function GetTotalHp: Integer;
begin
Result := GetSkillLevel('hp');
end;
function CheckEat: Boolean;
begin
i := GetMMLevels('hp', C0l);
if Hp = 0 then
Hp := GetTotalHp;
Hpex := Round(hp / 100 * RandomRange(40, 50));
if I < Hpex 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 MyNextPlayer(Activ3: Boolean);
begin
NextPlayer(Activ3);
SetAllChats('on', 'off', '', '', '');
GetExp;
Retaliate(True);
end;
function Inside: Boolean;
var
TileMe: Tpoint;
begin
TileMe := GetMyPos;
Writeln('[|-] Standing at ' + IntToStr(TileMe.X) + ', ' + IntToStr(TileMe.Y));
Result := IntInBox(TileMe.X, TileMe.Y, IntToBox(2683, 3699, 2730, 3742));
end;
function ChangeWorld(P2p: boolean): Boolean;
var
x, y, i: Integer;
begin
Result := False;
i := i + 1;
if (LoggedIn) then
LogOut;
if (not (WorldScreen)) then
OpenWorldScreen;
Wait(RandomRange(300, 1000));
if (not (WorldScreen)) then
Exit;
case P2p of
True:
if not SimilarColors(GetColor(630, 12), 2851375, 10) then
MouseBox(625, 6, 634, 15, 1);
False:
if not SimilarColors(GetColor(644, 14), 2851375, 10) then
MouseBox(640, 7, 649, 15, 1);
end;
x := 97 + RandomRange(0, 2) * 93;
y := 42 + RandomRange(0, 21) * 21;
Mouse(x, y, 4, 4, True);
Wait(RandomRange(700, 2000));
if i > 10 then
begin
i := 0;
Writeln('[|-] Failed changing world!');
Exit;
end;
if (WorldScreen) then
ChangeWorld(P2p);
Result := True;
Writeln('[|-] Changed world!');
end;
function FindCannon: Boolean;
var
TempT: TPoint;
begin
if ChangeWorldIfCannon then
begin
Result := FindObject(TempT, 6);
if Result then
Writeln('[|-] Cannon found, Changing world!');
end;
end;
function DealWithCannon: Boolean;
begin
if FindCannon then
begin
LogOut;
ChangeWorld(True);
Wait(RandomRange(1500, 10000));
LoginPlayer;
Result := True;
end;
end;
function FindCrabs: Boolean;
begin
NPCs := SortNPCs(GetNPCsByName('Rocks'));
if GetArrayLength(NPCs) = 0 then
NPCs := SortNPCs(GetNPCsByName('Rock Crab'));
if GetArrayLength(NPCs) = 0 then
Exit;
if NPCs[0].MS.X and NPCs[0].MS.Y = 0 then
begin
if NPCs[0].Tile.X < 2693 then
begin
WalkToMainPoint;
FindCrabs;
exit;
end;
if not WalkToTile(NPCs[0].Tile, 0, 0) then
Exit
else
begin
FFlag(0);
Result := True;
Exit;
end;
end;
if NPCs[0].Name = 'Rocks' then
Mouse(NPCs[0].MS.X, NPCs[0].MS.Y, 40, 40, True)
else
Mouse(NPCs[0].MS.X, NPCs[0].MS.Y, 7, 7, True);
Result := True;
FFlag(0);
end;
procedure MaybeSleep;
var
v, h, Time: integer;
begin
case Random(20) of
1:
begin
if not ShortSleep then
Exit;
if PlayersActive = 1 then
begin
v := RandomRange(4, 13);
h := v;
Status('Sleeping');
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 NChangePlayer: Boolean;
begin
if PlayersActive > 2 then
begin
MyNextPlayer(True);
SetupResponds;
SetAllChats('on', 'off', '', 'off', 'off');
Retaliate(True);
Writeln('Changed player');
MightRun;
Result := True;
end;
end;
function UnAggresiv: Boolean;
var
G: Tpoint;
begin
if (not (LoggedIn)) then
Exit;
for i := 0 to 2 do
begin
G := GetMyPos;
G.X := G.X + RandomRange(0, 3) - RandomRange(0, 3);
G.Y := G.Y - RandomRange(10, 15);
if not WalkToTile(G, 0, 0) then
Exit;
end;
GetExp;
LogOut;
MaybeSleep;
if NChangePlayer then
GetExp;
LogInPlayer;
SetupResponds;
SetAllChats('on', 'off', '', 'off', 'off');
MightRun;
Repeat
G := GetMyPos;
G.Y := G.Y + RandomRange(10, 15);
if not WalkToTile(G, 3, 0) then
Exit;
If Inside Then
begin
Result := True;
exit;
end;
Inc(i);
Until(i > 5);
Result := False;
end;
function IsFightRock: Boolean;
var
p: TPoint;
Me: TMe;
begin
Me := GetMe;
if Me.InFight then
begin
NPCs2 := SortNPCs(GetNPCsByName('Rock Crab'));
p := GetMyPos;
for i := 0 to High(NPCs2) do
begin
if PointInBox(NPCs2[i].Tile, IntToBox(p.x - 1, p.y - 1, p.x + 1, p.y + 1)) then
begin
Result := True;
FTwait(1);
Wait(50);
Exit;
end;
end;
end;
end;
function Fighting: Boolean; forward;
function FightWait: Boolean;
begin
Result := False;
FTwait(RandomRange(1, 4));
if not IsFightRock then
Exit;
repeat
CheckEat;
FTWait(RandomRange(1, 3));
Wait(50);
FindNormalRandoms;
AntiBan;
Wait(50);
until (not (IsFightRock)) Result := True;
end;
function Fighting: Boolean;
begin
if (not (LoggedIn)) then
Exit;
if FindCrabs then
begin
MarkTime(Time);
Wait(200 + Random(700));
Result := FightWait;
if Result then
begin
Players[CurrentPlayer].Integers[0] := Players[CurrentPlayer].Integers[0] + 1;
CrabsKill := CrabsKill + 1;
ReportVars[0] := ReportVars[0] + 1;
end;
end;
end;
function Convert(i: Integer): string;
begin
case i of
10, 22: Result := ' Hitpoints';
11, 23: Result := ' Attack';
12, 24: Result := ' Strength';
13, 25: Result := ' Defence';
14, 26: Result := ' Range';
15, 27: Result := ' Mage';
end;
end;
procedure SaveDebug; //MADE BY HY71194! ALL CREDIT TO HIM!
var
FileNum: integer;
begin
FileNum := RewriteFile(ScriptPath + 'Anti-Crabs.txt', True);
if (FileNum < 0) then
WriteLn('@@@ Error with save: File Error.');
WriteFileString(FileNum, GetDebugText);
CloseFile(FileNum);
end;
procedure ProgressReport;
var
t, b, CB, LevelsGain: integer;
begin
ClearDebug;
LevelsGain := 0;
CB := 0;
ExpGain := 0;
for t := 0 to HowManyPlayers - 1 do
begin
ExpGain := ExpGain + Players[t].Integers[3];
CB := CB + Players[CurrentPlayer].Integers[31];
LevelsGain := LevelsGain + Players[CurrentPlayer].Integers[28];
end;
ReportVars[1] := ExpGain;
SrlRandomsReport;
Writeln('[/][|][^][.][-] AntiCrabs [-][.][^][|][\]');
Writeln('[|\]');
Writeln('[|-] Ran : ' + TimeRunning);
Writeln('[|-] HowManyPlayers : ' + IntToStr(HowManyPlayers) + ' players, ' + IntToStr(PlayersActive) + '/' + IntToStr(HowManyPlayers) + ' Players is still active!');
Writeln('[|-] Rock Crabs killed : ' + IntToStr(CrabsKill) + ' in total.');
if Cannon > 1 then
Writeln('[|-] Changed world : ' + IntToStr(Cannon) + ' times becuase of cannons!');
if Responded > 1 then
Writeln('[|-] Responds made : ' + IntToStr(Responded) + ' times.');
if CB > 1 then
Writeln('[|-] Gained : ' + IntToStr(CB) + ' Combat level(s) in total.');
if LevelsGain > 1 then
Writeln('[|-] Gained : ' + IntToStr(LevelsGain) + ' Level(s) in total.');
Writeln('[|-] Gained : ' + IntToStr(ExpGain) + ' Total exp.');
Writeln('[|/]');
Writeln('[|-][|][^][.] More detailed report [.][^][|][-]');
Writeln('[|\]');
for t := 0 to HowManyPlayers - 1 do
begin
Writeln('[|-] Player #' + IntToStr(t) + ',');
Writeln('[|-] Killed : ' + IntToStr(Players[t].Integers[0]) + ' Crabs.');
Writeln('[|-] Gained : ' + IntToStr(Players[CurrentPlayer].Integers[31]) + ' Combat levels.');
Writeln('[|-] Made : ' + IntToStr(Players[t].Integers[3]) + ' Total exp.');
if Players[CurrentPlayer].Integers[31] > 0 then
Writeln('[|-] ' + IntToStr(Players[CurrentPlayer].Integers[31]) + ' Combat levels');
for b := 23 to 27 do
if Players[CurrentPlayer].Integers[b] > 0 then
Writeln('[|-] ' + IntToStr(Players[CurrentPlayer].Integers[b]) + Convert(b) + ' levels!');
for b := 10 to 15 do
if Players[CurrentPlayer].Integers[b] > 0 then
Writeln('[|-] ' + IntToStr(Players[CurrentPlayer].Integers[b]) + Convert(b) + ' Exp!');
Writeln('[|/]');
end;
SaveDebug;
end;
procedure ScriptTerminate;
begin
Writeln('[|]');
Writeln('[\][_] Thank you for using Anti crabs! [_][-]');
end;
procedure MainLoop;
begin
PickUpSetup;
if (not (NLoggedIn)) then
ChangeWorld(True);
SetAudioOff;
LoginPlayer;
Wait(RandomRange(200, 3000));
if not InSide then
begin
Writeln('[|/] Your not at Rock crabs, NextPlayer.');
MyNextPlayer(False);
end;
SetAllChats('on', 'off', '', '', '');
GetExp;
Retaliate(True);
case Random(5) of
1: MightRun;
end;
repeat
if DealWithCannon then
Cannon := Cannon + 1;
if not InSide then
begin
Writeln('[|/] Your not at Rock crabs, NextPlayer.');
MyNextPlayer(False);
end;
SetAngle(True);
TheResponder;
if not Fighting then
begin
SetRun(True);
if not Inside then
LogOut;
if LoggedIn then
begin
if not Fighting then
if not Fighting then
UnAggresiv;
end;
end;
PickUp;
TheResponder;
case Random(20) of
0, 1, 3: AntiBan;
2: CheckEat;
4: MightRun;
end;
DrinkPotion;
GetExp;
ProgressReport;
until (False);
end;
begin
SetupSRL;
ScriptID := '953';
SRLID := YourSRLID;
SRLPassword := YourSRLPassword;
if SRLID = '' then
SRLID := '5963';
if SRLPassword = '' then
SRLPassword := 'srlpwnsall';
SmartSetup(SmartWorld, True, True, False);
SetTargetDC(SMARTGetDC);
while not RSReady do
Wait(1000);
SRLPlayerForm(True, ['Use Special?', 'DrinkPotions?', 'PickUpItems?', 'EquipArrows?'], [], [], []);
MainLoop;
end.