SRL Archive - OSR Woodcutting

[SRL][RSWalker][WaspLib] Hardwood groove TeakPower Cutter


Aqua Shy Wasp

2020-10-27 16:52:32

This script requires my include: WaspLib.

I originally made this inspired on ollie's hardwood groove script but wanted to make some changes of my own.

You should set your account up on the northern teak trees and start the script.

program TeakCutter;
{$I SRL/OSR.simba}
{$I SRL/utils/rsclient.simba}
{$I RSWalker/Walker.simba}
{$I WaspLib/WaspLib.simba}
{$H-}
{$R+}
{$X+}

const
// Account Information
USER = '';
PASS = '';
PIN = '';
MEMBER = TRUE;

// Script Settings
RUN_TIME = (8 * ONE_HOUR) + (32 * ONE_MINUTE);
TRAINING_SKILL = SKILL_WOODCUTTING;

type
TState = (DROPPING, CUT_TREE, SPEC, WAIT_CUTTING, EQUIP_LUMBERJACK);
TWoodcutter = record
State: TState;
StatsDebugTick: Int64;
Action: String;
end;

var
Woodcutter: TWoodcutter;
RSW: TRSWalker;

LumberjackHatDTM := DTMFromString('mggAAAHicY2NgYGhmYmAoB+IeIK6F4k4gfgSUe8oAoV8D8T0gfgbEYWEBQJIRjkNCfBnU1BQYyAMA85kK1A==');
LumberjackTopDTM := DTMFromString('mwQAAAHic42RgYGhlYmBoBuIqIG4H4h4oXQPEFUBcAsSGjBBsDsSWQGzMiBAzgNJ7Z0kwtGooAU1kZEiQlWCoVpNlKFeRZejQUmIoBtIgcaoDAHYODEQ=');
LumberjackLegsDTM := DTMFromString('mwQAAAHic42RgYGhkYmCoBeJqKA3iNwNxGxC3AnE7EEcwMjCEAXEcECcDcSoUJwFxJBCHAzEDAyNDYKAXmPbz8wDTTk62YNrU1ABMUx0AADBNCyw=');
LumberjackBootsDTM := DTMFromString('mwQAAAHic42RgYGhkYmBoBeI2IG4C4iogLgXiLiDuA+JaIG5kZGBoAOIOIO4C4lYouxOIW4C4DYh1NJQY1EQZGEwNtBi8nK3AmIGBEY5B4lQHAA1DDMo=');

TeakLogDTM := DTMFromString('mbQAAAHicY2VgYHBiYmCwBGIfIDYBYjcgfg4Ufw3ED4H4FRC/A+I1ExMZLm4qB7IYGS5vqQHTJAEAJcELeQ==');
TeakTreeColor := CTS2(3699829, 27, 0.26, 0.30);
TeakTreeTiles := [Point(3110, 4100), Point(3102, 4096), Point(3118, 4096)];

procedure Woodcutter.DeclarePlayers();
begin
Players.Add([USER, PASS, PIN, MEMBER, True]);
Players.SetCurrent(0);
end;

function Woodcutter.IsCutting(): Boolean;
var
i: Int32
begin
for i := 0 to 10 do
begin
if SRL.GetPixelShift(MainScreen.GetPlayerBox(), 50) > 400 then
Exit(True);
end
Result := False;
end;

function Woodcutter.DropLogs(): Boolean;
var
Pattern, Slots: TIntArray;
Index: Int32;
begin

Slots := Inventory.FindDTM(TeakLogDTM);

for Index in [DROP_PATTERN_TWO_ROW, DROP_PATTERN_TWO_ROW_R, DROP_PATTERN_SNAKE, DROP_PATTERN_SNAKE_R, DROP_PATTERN_TOPDOWN, DROP_PATTERN_TOPDOWN_R, DROP_PATTERN_REGULAR, DROP_PATTERN_TWO_ROW, DROP_PATTERN_TWO_ROW_R][Random(0, 8)] do
begin
if Slots.Find(Index) <> -1 then
Pattern += Index;
end

Inventory.DropItems(Inventory.ErrorPattern(Pattern, Random(4, 10)));

Result := not Inventory.Contains(TeakLogDTM);
end;

function Woodcutter.ClickTree(): Boolean;
begin
Result := Obj.Click(RSW, TeakTreeTiles, TeakTreeColor, ['Chop', 'Blister', 'wood', 'Tree'], False, 2, False);
if Result then
Wait(3000, 3500);
end;

function Woodcutter.LumberjackUnequipped(): Boolean;
begin
Result := Inventory.Contains(LumberjackHatDTM) or Inventory.Contains(LumberjackTopDTM)
or Inventory.Contains(LumberjackLegsDTM) or Inventory.Contains(LumberjackBootsDTM);
end;

procedure Woodcutter.LumberjackEquip();
var
LumberjackOutfit: TIntArray;
i: Int32;
begin
LumberjackOutfit := [LumberjackHatDTM, LumberjackTopDTM, LumberjackLegsDTM, LumberjackBootsDTM];

For i := 0 to High(LumberjackOutfit) do
begin
if Inventory.Contains(LumberjackOutfit[i]) then
Inventory.MouseSlot(Inventory.FindDTM(LumberjackOutfit[i])[0], Mouse_Left);
end;
Wait(300, 600);
end;


function Woodcutter.GetState(): TState;
begin

if Self.LumberjackUnequipped() then
begin
Action := 'We are not wearing lumberjack outfit. Going to wear it.';
Exit(EQUIP_LUMBERJACK);
end

else if Minimap.WeaponHasSpecialAttack() and (Minimap.GetSpecialAttack() = 100) then
begin
Action := 'Spec bar is full. Going to activate it.';
Exit(SPEC);
end

else if Inventory.IsFull() and Inventory.Contains(TeakLogDTM) then
begin
Action := 'Going to drop logs';
Exit(DROPPING);
end

else if Self.IsCutting() then
begin
Action := 'We are cutting the tree. Waiting';
Exit(WAIT_CUTTING);
end

else if not Inventory.IsFull() then
begin
Action := 'Going to cut the tree';
Exit(CUT_TREE);
end;
end;

procedure Woodcutter.ProcessWhileWaiting(DoAntiBan: Boolean = True);
begin
if GetTickCount() - Self.StatsDebugTick > 1000 then
begin
ClearDebug();
ClearDebug();
WriteLn('+---| STATS |----------------------------------------');
WriteLn('|- Script Runtime : ', SRL.MsToTime(GetTimeRunning, Time_Short));
WriteLn('|- Time Since Break : ', SRL.MsToTime(Wasp.Antiban.TimeSinceBreak(), Time_Short));
WriteLn('|- Action : ', Action);
WriteLn('+----------------------------------------------------');
Self.StatsDebugTick := GetTickCount();
end;
SRL.DismissRandom();
if (DoAntiban and Wasp.Antiban.DoAntiban()) then
Players.GetCurrent()^.Login();
end;


procedure Woodcutter.Init();
begin
{$ifdecl RSClient}
srl.SetupForClient([]);
RSClient.SetFocus();
{$else}
srl.Setup([]);
{$endif}
RSW.InitEx('world', [[5, 3], [5, 4]]);
Self.DeclarePlayers();
Wasp.SetupAntiban(TRAINING_SKILL, RUN_TIME);
Players.LoginCurrent();
Inventory.ShiftDrop := True;
end;

procedure Woodcutter.Run();
begin
MainScreen.SetAngle(True);
while Wasp.Antiban.TimeRunning < (RUN_TIME) do
begin
State := Self.GetState();
Self.ProcessWhileWaiting(True)

case State of
DROPPING: Self.DropLogs();
CUT_TREE: Self.ClickTree();
SPEC: Minimap.ToggleSpecialAttack(True);
WAIT_CUTTING: Wait(2000, 2500);
EQUIP_LUMBERJACK: Self.LumberjackEquip();
end;

if not srl.IsLoggedIn then
Break;
end;
end;

procedure Woodcutter.Free();
begin
RSW.Free();
FreeDTMs([LumberjackHatDTM, LumberjackTopDTM, LumberjackLegsDTM, LumberjackBootsDTM, TeakLogDTM]);
end;

begin
ClearDebug();
Woodcutter.Init();
AddOnTerminate(@Woodcutter.Free);
Woodcutter.Run();
end.