he has just re-written his power chopper. it is deserving of scripters in my opinion. i will cup him unless more 'no' votes come in.
{==============================================================================]
[ ___ ]
[ ____ /\__\ ]
[ /\___\ ____ \/ _/ ]
[ _____ \/_ / /\___\ \/ _____ ]
[ /\____\ _______/ / /___ _\/___ \_____ /\____\ ]
[ / / ___\/\______\/ /____\\____/ /_____\/ / ____\ ]
[ / / /__ / / ___ / ____ //___ / ____ \/ /___\ ]
[ / / /___\ / /__/ / / / / /____/ / / / / /____ / ]
[ \/_______//______/_/ /_/_/______/_/__/_/_/____/ / ]
[ \/___________________/ ]
[ ]
[==============================================================================]
[ Anywhere Powerchopper V.1.4! ]
[==============================================================================]
[ ]
[ Written By: Coh3n ]
[ Description: Cuts and drops any type of logs, anywhere! ]
[ Contact Info: Private message via VillaVu.com ]
[ ]
[ Many more scripts of various types can be found at VillaVu.com! ]
[ ]
[==============================================================================]
[ Instructions ]
[==============================================================================]
[ ]
[ 1. Have hatchet in first inventory slot or equipped. ]
[ 2. Start near the tree you want to cut. ]
[ 3. Setup player(s). Be sure to do this right. ]
[ 4. Hit run! ]
[ ]
[==============================================================================]
[ Features ]
[==============================================================================]
[ ]
[ * Multiplayer. * AntiRandoms. ]
[ * Progress report. * Efficient tree finding/dropping. ]
[ * Signature. * Breaking. ]
[ * S.M.A.R.T. * Detects and records levels gained. ]
[ * Antiban. * Dragon Hatchet compatibility. ]
[ ]
[==============================================================================]
[ Credits ]
[==============================================================================]
[ ]
[ * Nava2 * ZephyrsFury * ian. ]
[ * Everyone who helped me on the Forums/IRC. ]
[ * IceFire908 - Header Template. ]
[ ]
[==============================================================================]
[ Copyright ©2009 Coh3n @ SRL-Forums ]
[==============================================================================}
program PowerChopper;
{.Include SRL\SRL\Misc\SMART.SCAR}
{.include SRL\SRL.scar}
//{.include SRL\SRL\Misc\Debug.scar}
{ Players.Integers Index
Integers[9] - Loads.
Integers[10] - Logs.
Integers[11] - Levels.
Extendeds[12] - Exp gained.
Integers[13] - Breaks. }
const
ScriptVersion = 'V.1.4';
SMARTWorld = 152;
Members = False;
SignedClient = True;
var
Randoms, c : Integer;
TP : TPoint;
procedure DeclarePlayers;
begin
HowManyPlayers := 1;
NumberOfPlayers(HowManyPlayers);
CurrentPlayer := 0;
with Players[0] do
begin
Name := 'Username';
Pass := 'Password';
Nick := 'ser';//3-4 lowercase letters from username.
Active := True;//Use this player?
Strings[0] := 'WhichTree';//Which tree to cut?
Integers[0] := 000;//How many logs to cut?
Booleans[0] := True;//Is hatchet equiped?
Booleans[1] := True;//Take breaks?
BoxRewards := ['amp', 'mote', 'ostume', 'oins', 'unes', 're', 'ems'];
end;
{with Players[1] do
begin
Name := '';
Pass := '';
Nick := '';
Active := True;
Strings[0] := '';
Integers[0] := 000;
Booleans[0] := True;
Booleans[1] := True;
BoxRewards := ['amp', 'mote', 'ostume', 'oins', 'unes', 're', 'ems'];
end;
with Players[2] do
begin
Name := '';
Pass := '';
Nick := '';
Active := True;
Strings[0] := '';
Integers[0] := 000;
Booleans[0] := True;
Booleans[1] := True;
BoxRewards := ['amp', 'mote', 'ostume', 'oins', 'unes', 're', 'ems'];
end;
with Players[3] do
begin
Name := 'Username';
Pass := 'Password';
Nick := 'Nickname';
Active := True;
Strings[0] := '';
Integers[0] := 000;
Booleans[0] := True;
Booleans[1] := True;
BoxRewards := ['amp', 'mote', 'ostume', 'oins', 'unes', 're', 'ems'];
end;
with Players[4] do
begin
Name := 'Username';
Pass := 'Password';
Nick := 'Nickname';
Active := True;
Strings[0] := '';
Integers[0] := 000;
Booleans[0] := True;
Booleans[1] := True;
BoxRewards := ['amp', 'mote', 'ostume', 'oins', 'unes', 're', 'ems'];
end;}
end;
procedure S_Signature;
begin
ClearDebug;
Writeln(' ___ ');
Wait(250);
Writeln(' ____ /\__\ ');
Wait(250);
Writeln(' /\___\ ____ \/ _/ ');
Wait(250);
Writeln(' _____ \/_ / /\___\ \/ _____ ');
Wait(250);
Writeln(' /\____\ _______/ / /___ _\/___ \_____ /\____\ ');
Wait(250);
Writeln(' / / ___\/\______\/ /____\\____/ /_____\/ / ____\ ');
Wait(250);
Writeln(' / / /__ / / ___ / ____ //___ / ____ \/ /___\ ');
Wait(250);
Writeln(' / / /___\ / /__/ / / / / /____/ / / / / /____ / ');
Wait(250);
Writeln(' \/_______//______/_/ /_/_/______/_/__/_/_/____/ / ');
Wait(250);
Writeln(' \/___________________/ ');
Wait(250);
Writeln(PadR(' Anywhere Powerchopper ' + ScriptVersion +'!', 57));
end;
procedure S_FindRandoms;
begin
LampSkill := 'woodcutting';
if FindNormalRandoms then
begin
Writeln('Found a random event, attempting to solve...');
Inc(Randoms);
end;
end;
procedure S_MyAntiBan;
begin
if not LoggedIn then Exit;
case Random(120) of
0: RandomMovement;
1: BoredHuman;
2: HoverSkill('random', false);
3: RandomRClick;
4: begin
case Random(2) of
0: begin
MakeCompass(20 + Random(40));
MakeCompass(320 - Random(40));
end;
1: begin
MakeCompass(50 + Random(30));
MakeCompass(300 - Random(30));
end;
end;
end;
5: begin
MakeCompass(80 + Random(20));
MakeCompass(280 - Random(80));
end;
6: HoverSkill('woodcutting', false);
7: PickUpMouse;
end;
end;
procedure S_SwitchPlayer;
begin
Players[CurrentPlayer].Active := False;
Logout;
Exit;
end;
function Lv_GetLevel: Integer;
var
Req : Integer;
begin
if not LoggedIn then Exit;
Result := GetSkillLevel('woodcutting');
Writeln('Woodcutting level is ' + IntToStr(Result) + '.');
S_FindRandoms;
case Players[CurrentPlayer].Strings[0] of
'oak': Req := 15;
'willow': Req := 30;
'yew': Req := 60;
else
Writeln('Tree isn''t in DeclarePlayers.');
end;
if (Result < Req) then
begin
Writeln('Your woodcutting level isn''t high enough to cut '
+ Players[CurrentPlayer].Strings[0] + 's, logging out.');
S_SwitchPlayer;
end;
end;
function Lv_LevelUp: Boolean;
begin
if not LoggedIn then Exit;
Result := FindNPCChatText('ongrat', Nothing) or FindNPCChatText('dvanced', Nothing) or
FindNPCChatText('ulatio', Nothing) or FindNPCChatText('oodcuti', Nothing);
if Result then
begin
Writeln('Congratulations, you have gained a Woodcutting level!');
ClickToContinue;
Wait(80 + Random(100));
HoverSkill('woodcutting', True);
Players[CurrentPlayer].Integers[11] := Players[CurrentPlayer].Integers[11] + 1;
S_FindRandoms;
end;
end;
procedure Brk_TakeBreak;
var
BrkTime : Integer;
begin
if not LoggedIn then Exit;
BrkTime := 780000 + Random(240000);
if Players[CurrentPlayer].Booleans[1] then
begin
if (HowManyPlayers > 1) then
begin
Writeln('An hour has passed, switching players...');
NextPlayer(Players[CurrentPlayer].Active);
end else
begin
Writeln('Taking a 15 minute break.');
Logout;
Wait(BrkTime);
Writeln('Break over, logging back in.');
LoginPlayer;
end;
Players[CurrentPlayer].Integers[13] := Players[CurrentPlayer].Integers[13] + 1;
end;
end;
procedure Cut_FindHatchet;
var
x, y, i : Integer;
HatchetDTM : Array of Integer;
begin
if not LoggedIn then Exit;
SetArrayLength(HatchetDTM, 2);
//All except dragon.
HatchetDTM[0] := DTMFromString('78DA63CC6664605805C448A0354590811F488' +
'344FF0301631690B509550D44164602E934206B23013520739611' +
'50930F642D24A0A61CC85A44404D2990B51ABF1A00963F0CC9');
//Dragon.
HatchetDTM[1] := DTMFromString('78DA633CC2C8C0E0CAC4800C62424319F8813' +
'42394CF7810C8F24255039385ABD90164F91350730CC87222A0E6' +
'0A90E54840CD7920CB05BF1A00E9AD0784');
if Players[CurrentPlayer].Booleans[0] then
GameTab(tab_Equip)
else
GameTab(tab_Inv);
if FindDTM(HatchetDTM[i], x, y, MIX1, MIY1, MIX2, MIY2) then
Writeln('Found hatchet.')
else
begin
Writeln('Didn''t find hatchet, logging out...');
S_SwitchPlayer;
end;
S_FindRandoms;
FreeDTM(HatchetDTM[i]);
end;
function Col_Trees : Integer;
var
Colors : TStringArray;
i : Integer;
begin
if not LoggedIn then Exit;
Colors := ['tree', IntToStr(2450006), 'oak', IntToStr(3764069),
'maple', IntToStr(2440040), 'willow', IntToStr(4481105),
'yew', IntToStr(4162165), 'magic', IntToStr(11003627)];
if InStrArrEx(Lowercase(Players[CurrentPlayer].Strings[0]), Colors, i) then
Result := StrToInt(Colors[i + 1])
else
begin
Writeln('String not in DeclarePlayers.');
S_SwitchPlayer;
end;
end;
procedure Col_Modifiers;
begin
if not LoggedIn then Exit;
case Lowercase(Players[CurrentPlayer].Strings[0]) of
'tree' : SetColorSpeed2Modifiers(0.05, 1.37);
'oak' : SetColorSpeed2Modifiers(0.10, 1.63);
'willow' : SetColorSpeed2Modifiers(0.18, 0.28);
'maple' : SetColorSpeed2Modifiers(0.04, 0.20);
'yew' : SetColorSpeed2Modifiers(0.01, 0.76);
'magic' : SetColorSpeed2Modifiers(0.03, 2.39);
end;
end;
function Col_Tolerance: Integer;
begin
if not LoggedIn then Exit;
case Lowercase(Players[CurrentPlayer].Strings[0]) of
'tree', 'maple' : Result := 6;
'oak' : Result := 5;
'willow', 'yew' : Result := 14;
'magic' : Result := 11;
end;
end;
function Cut_TreeCutDown: Boolean;
var
TPA : TPointArray;
begin
if not LoggedIn then Exit;
ColorToleranceSpeed(2);
Col_Modifiers;
FindColorsTolerance(TPA, Col_Trees, TP.x - 15, TP.y - 15, TP.x + 15, TP.y + 15, Col_Tolerance);
if (Length(TPA) < 5) then
begin
//Writeln('Length inside box: ' + IntToStr(Length(TPA)));
Result := True;
end;
SetColorSpeed2Modifiers(0.2, 0.2);
ColorToleranceSpeed(1);
end;
procedure Cut_WhileChopping;
var
ClickTree, NCTime, LastCount : Integer;
begin
MarkTime(ClickTree);
NCTime := 15000 + Random(10000);
LastCount := InvCount;
while (InvCount < 28) and LoggedIn do
begin
if Cut_TreeCutDown then Break;
if TimeFromMark(ClickTree) > NCTime then
if (InvCount = LastCount) then Break;
S_MyAntiBan;
Wait(80 + Random(1000));
Lv_LevelUp;
S_FindRandoms;
end;
end;
procedure Cut_ChopTrees;
var
i, x, y: Integer;
t : String;
TPA : TPointArray;
ATPA : T2DPointArray;
begin
if not LoggedIn then Exit;
SetRun(True);
ColorToleranceSpeed(2);
Col_Modifiers;
repeat
FindColorsSpiralTolerance(MSCX, MSCY, TPA, Col_Trees, MSX1, MSY1, MSX2, MSY2, Col_Tolerance);
ATPA := SplitTPAEx(TPA, 5, 5);
//DebugATPA(ATPA, '');
t := Players[CurrentPlayer].Strings[0];
if (Length(ATPA) = 0) then
begin
if FindObj(x, y, Copy(t, 2, Length(t)), Col_Trees, Col_Tolerance) then
begin
Writeln('Color finding failed, found tree using FindObj...');
Mouse(x, y, 0, 0, True);
TP := IntToPoint(x, y);
Cut_WhileChopping;
end else
begin
Writeln('Couldn''t find trees, logging out.');
S_SwitchPlayer;
end;
end;
SortATPAFromFirstPoint(ATPA, Point(MSCX, MSCY));
for i := 0 to High(ATPA) do
begin
//Writeln('Length:' + IntToStr(Length(ATPA[i])));
if (Length(ATPA[i]) < 30) then Continue;
MiddleTPAEx(ATPA[i], x, y);
MMouse(x, y, 4, 4);
S_FindRandoms;
Wait(200 + Random(300));
t := Players[CurrentPlayer].Strings[0];
if WaitUpText(Copy(t, 2, Length(t)), 500) then
begin
GetMousePos(x, y);
Wait(80 + Random(100));
Mouse(x, y, 0, 0, True);
TP := IntToPoint(x, y);
Cut_WhileChopping;
end;
end;
until(InvFull or not LoggedIn);
if InvFull then
Writeln('Inventory full, dropping logs...');
SetColorSpeed2Modifiers(0.2, 0.2);
ColorToleranceSpeed(1);
end;
function Cut_DropLogs: Integer;
var
Logs, x, y, a : Integer;
begin
MakeCompass('n');
GameTab(tab_Inv);
Logs := DTMFromString('78DA630C6364607804C44820C84B96811F48C' +
'34419C381AC2BA86A60B270358940D675026AA280AC6704D4B803' +
'598FF1AB0100F99906E6');
if FindDTM(Logs, x, y, MIX1, MIY1, MIX2, MIY2) then
Result := CountItems('dtm', Logs, [])
else
begin
Writeln('Didn''t find log DTM, logging out.');
S_SwitchPlayer;
end;
if Players[CurrentPlayer].Booleans[0] then
begin
Wait(80 + Random(100));
for a := 1 to 28 do
begin
DropItem(a);
S_FindRandoms;
end;
end else
begin
Wait(80 + Random(100));
for a := 2 to 28 do
begin
DropItem(a);
S_FindRandoms;
end;
end;
Players[CurrentPlayer].Integers[10] := Players[CurrentPlayer].Integers[10] + Result;
Players[CurrentPlayer].Integers[9] := Players[CurrentPlayer].Integers[9] + 1;
if (Players[CurrentPlayer].Integers[10] >= Players[CurrentPlayer].Integers[0]) then
begin
Writeln('Cut desired number of logs, logging out.');
S_SwitchPlayer;
end;
FreeDTM(Logs);
end;
function Prg_PlayerActive(i : Integer): String;
begin
if Players[i].Active then Result := 'T' else Result := 'F';
end;
function Prg_ExpGained: Extended;
var
XpGain : TStringArray;
i : Integer;
begin
XpGain := ['tree', IntToStr(25), 'oak', FloatToStr(37.5),
'willow', FloatToStr(67.5), 'yew', IntToStr(175)];
if InStrArrEx(Lowercase(Players[CurrentPlayer].Strings[0]), XpGain, i) then
Result := StrToFloat(XpGain[i + 1])
else
begin
Writeln('String not in DeclarePlayers.');
S_SwitchPlayer;
end;
end;
procedure Prg_ProgReport;
var
i : Integer;
begin
Players[CurrentPlayer].Extendeds[12] := Players[CurrentPlayer].Integers[10] * Prg_ExpGained;
Writeln('[=================================================================]');
Writeln(PadR('[ Coh3n''s Anywhere PowerChopper', 66) + ']');
Writeln('[============================= ' + ScriptVersion + ' =============================]');
Writeln('[ ]');
if (HowManyPlayers <= 1) then
begin
Writeln(PadR('[ Ran For: ' + TimeRunning, 66) + ']');
Writeln(PadR('[ Loads Done: ' + IntToStr(Players[CurrentPlayer].Integers[9]), 66) + ']');
Writeln(PadR('[ Logs Chopped: ' + IntToStr(Players[CurrentPlayer].Integers[10]), 66) + ']');
Writeln(PadR('[ Levels Gained: ' + IntToStr(Players[CurrentPlayer].Integers[11]), 66) + ']');
Writeln(PadR('[ Exp Gained: ' + FloatToStr(Players[CurrentPlayer].Extendeds[12]), 66) + ']');
Writeln(PadR('[ Breaks: ' + IntToStr(Players[CurrentPlayer].Integers[13]), 66) + ']');
Writeln(PadR('[ Randoms Solved: ' + IntToStr(Randoms), 66) + ']');
end else
begin
Writeln(PadR('[ Ran For: ' + TimeRunning, 66) + ']');
Writeln('[ ]');
Writeln('[ Nick T/F Loads Logs Lvls Exp Brks ]');
Writeln('[ ¯¯¯¯ ¯¯¯ ¯¯¯¯¯ ¯¯¯¯ ¯¯¯¯ ¯¯¯ ¯¯¯¯ ]');
for i := 0 to High(Players) do
begin
Writeln('[ ' + PadR(Players[i].Nick, 9) + PadR(Prg_PlayerActive(i), 9)
+ PadR(IntToStr(Players[i].Integers[9]), 9)
+ PadR(IntToStr(Players[i].Integers[10]), 10)
+ PadR(IntToStr(Players[i].Integers[11]), 7)
+ PadR(FloatToStr(Players[i].Extendeds[12]), 10)
+ PadR(IntToStr(Players[i].Integers[13]), 7) + ']');
end;
end;
Writeln('[ ]');
Writeln('[=================================================================]');
Writeln('[ Thank-you for using Coh3n''s Anywhere Powerchopper! ]');
Writeln('[=================================================================]');
Writeln('[ Be sure to post your progress reports at VillaVu/SRL-Forums! ]');
Writeln('[=================================================================]');
for i := 9 to 13 do
begin
if (Players[CurrentPlayer].Integers[i] > 0) then
Players[CurrentPlayer].Integers[i] := Players[CurrentPlayer].Integers[i]
else
Players[CurrentPlayer].Integers[i] := 0;
end;
end;
procedure F_PlayerSetup;
begin
LoginPlayer;
SetAngle(True);
Cut_FindHatchet;
Lv_GetLevel;
end;
function F_KillScript: Boolean;
var
LoggedOut : Integer;
begin
if not LoggedIn then
begin
MarkTime(LoggedOut);
if (TimeFromMark(LoggedOut) > 1100000) then
begin
if LoggedIn then Exit;
Writeln('We have been logged out for too long, terminating script...');
Result := True;
end;
end;
end;
procedure F_ScriptSetup;
begin
ClearDebug;
Disguise('Coh3n''s PowerChopper');
S_Signature;
Smart_Server := SMARTWorld;
Smart_Members := Members;
Smart_Signed := SignedClient;
Smart_SuperDetail := False;
Writeln('Loading, please wait...');
SetupSRL;
DeclarePlayers;
end;
procedure F_MainLoop;
var
Start : Integer;
begin
F_ScriptSetup;
repeat
F_PlayerSetup;
MarkTime(Start);
repeat
Col_Trees;
repeat
Cut_ChopTrees;
until(InvFull);
Cut_DropLogs;
Prg_ProgReport;
Writeln('All logs dropped, starting to cut again...');
if F_KillScript then
TerminateScript;
if (TimeFromMark(Start) > 3600000) then
begin
Brk_TakeBreak;
MarkTime(Start);
end;
until((Players[CurrentPlayer].Integers[10] >= Players[CurrentPlayer].Integers[0]) or not LoggedIn);
if AllPlayersInactive then
begin
Writeln('All players are now inactive, terminating script...');
TerminateScript;
end;
NextPlayer(Players[CurrentPlayer].Active);
until(AllPlayersInactive);
end;
procedure ScriptTerminate;
begin
Prg_ProgReport;
end;
begin
F_MainLoop;
end.
~RM