SRL Archive - Jr. Member OSRS Scripts

[SRL] Lipcots Sulphurous fertiliser


Lipcot

2019-02-17 13:12:25

Basic combiner to make Sulphurous fertiliser for hosidius favour.

Can EASILY be changed to combine any 2 items by changing only DTMS and uptext on setup.

Has a lot of old/unused code, badly optimized, etc. But it works as inteded so whatever.

Probably has some stolen functions or sth, dont know, made it ages ago to fletch bows but changed it for hosidius favour and releasing it to save people the pain of wasting 1 hour mixing this things.

Used the same script doing bows and wine for +100 hours and no bans…

Enjoy :spot:

Must be used in this spot on the GE:

[ATTACH=CONFIG]28619[/ATTACH]


program LSulphurous;

{$DEFINE SMART}
{$i SRL/OSR.simba}

const
{==============================================================================}
{******************************************************************************}
{*****************************Player Setup start*******************************}
{******************************************************************************}
{==============================================================================}

{======================= Script Last Edited 05/12 0:32 ========================}
P_USERNAME = '';
P_PASSWORD = '';
P_WORLD = 494;
DebugStuff = True; //True or false
DrawPaint = True;
ScreenPath = 'C:\Simba\Scripts\SulphurousDebug\';

// Break settings
cBREAK_IN = 45; // How long before we take a break? (minutes)
cBREAK_FOR = 10; // How long will we break for? (minutes)
R_BREAK_IN = 5; // Random minutes to add/subtract from how long until we break
R_BREAK_FOR = 2; // Random minutes to add/subjtract from break duraction
BREAKS_TILL_SLEEP = 11; //How many breaks until we sleep for 12 hours?
SLEEP_FOR = 12; // in Hours
SLEEP_FOR_RAND = 30; // In Minutes
{==============================================================================}
{******************************************************************************}
{*****************************Player Setup End*********************************}
{******************************************************************************}
{==============================================================================}

type
TItem = record
DTM, bankSlot: Int32;
UpText: TStringArray;
end;

var
startingXp, bowXP, margin, SaltpetreLeft, CompostLeft, coinsLeft,
DTM_PRODSCREEN, done : Integer;
firstRun : Boolean;
item_Saltpetre, item_Compost, item_Coins, item_Sulphurous : Titem;


{=================================Break Stuff==================================}
timer_break : TTimeMarker;
tmp_BI, tmp_BF, tmp_rBI, tmp_rBF, Break_In, Break_In_Ran,
Break_For, Break_For_Ran, break_RealTime, break_Count,
break_TotalTime, break_count_to_sleep : Integer;
procedure myDebug(debug: string);
begin

if DebugStuff then
begin
writeln('============================ Debug ===========================');
writeln('= = = = = = ' + debug + ' At: ' + DateTimeToStr(now));
end;

end;

procedure myDebug(debug: boolean; FunctionName: String); overload;
begin

if DebugStuff then
begin
writeln('============================ Debug ===========================');
writeln('= = = = = = ' + FunctionName + ' Was: ' + ToStr(debug) + ' At: ' + DateTimeToStr(now));
end;
end;

procedure uTerminate(Reason: String);
begin

if (not directoryExists(ScreenPath)) then
forceDirectories(ScreenPath);

writeln('Script Was Terminated because: ' + reason);
saveScreenshot(ScreenPath + reason + P_Username + srl.TimeRunning(Time_Short) + '.png');
logout.ClickLogout;
terminateScript;

end;

procedure DeclarePlayers();
begin
with Players.New()^ do
begin
LoginName := P_USERNAME;
Password := P_PASSWORD;
IsMember := True;
IsActive := True;
World := P_WORLD;
end;
end;

procedure setupPlayer();
begin
myDebug('Setting Up Player');
if (not srl.isLoggedIn()) then
begin
if not loginscreen.GetCurrentWorld() = P_WORLD then
worldSwitcher.SelectWorld(P_WORLD);
if Players.GetCurrent()^.Login then
MainScreen.SetAngle(True);
end;

if (srl.isLoggedIn()) then
begin
if (not xpbar.IsOpen(500)) then xpbar.Toggle(true);
if firstrun then
begin
startingXP := xpbar.Read;
end;
minimap.SetCompassAngle(90, false);
mainscreen.SetAngle(true);
end;
myDebug('Finished player Setup');
end;

procedure setupBreak(BreakIn, BreakFor, RanBreakIn, RanBreakFor: Integer);
begin
tmp_BI := BreakIn;
tmp_BF := BreakFor;
tmp_rBI := RanBreakIn;
tmp_rBF := RanBreakFor;
break_In := (BreakIn * 60000);
break_For := (BreakFor * 60000);
break_In_Ran := RandomRange(-RanBreakIn * 60000, RanBreakIn * 60000);
break_For_Ran := RandomRange(-RanBreakFor * 60000, RanBreakFor * 60000);
timer_Break.Start();
end;

procedure LoadStuff();
begin

mouse.Speed := randomrange(34,38);
writeln('mouseSpeed set at: ' + intToStr(mouse.speed));

item_Saltpetre := [DTMFromString('mQwAAAHicY2ZgYJBgZGBQAGJ+IF4D5K8H4nVAfO/WLYbdW7Yw5KSmMDAD+TDMiISBAABBdAhN'), 2, ['Saltpetre', 'altpetre']];
item_Sulphurous := [DTMFromString('mQwAAAHicY2ZgYPBgZGBwBWJvIF4O5G8A4o1AnJoayzCl0plhWbsvAzOQD8OMSBgIABktBuQ='), 1, ['Sulphurous', 'ulphurous', 'fertiliser']];
item_Compost := [DTMFromString('mQwAAAHicY2ZgYHgOxE+A+A0QLwfijVAc4qvH0FFgz7C41YeBGciHYUYkDAQAdgkISg=='), 3, ['Compost', 'ompost']];
item_Coins := [DTMFromString('mbQAAAHicY2VgYHBiYmDwBWJzILaDsp8xQPBzIH4AxO+B+OkuKYZd00UZLqyUYHh3SJZhdbcoAytQHB0zYsFgAACeDw3J'), 0, ['Coins', 'oins']];

DTM_PRODSCREEN := DTMFromString('mWAAAAHicY2FgYLjKyMDwEYg/APEVIE4B4mogTgPiGiDubCth8PW0YYiL9gHTrEA9yJgRDYMAAEa/CZw=');

BowXp := 200;

setupBreak(cBREAK_IN, cBREAK_FOR, R_BREAK_IN, R_BREAK_FOR);
gametabs.ToggleFKeys(true);
//xpBar._Setup;
srl.ToggleCloseInterfacesWithEscape(true);
firstRun := true;
AddOnTerminate('FreeVars');
setupPlayer();
end;

procedure FreeVars();
begin

if DTMExists(item_Saltpetre.DTM) then freeDtm(item_Saltpetre.DTM);
if DTMExists(item_Sulphurous.DTM) then freeDtm(item_Sulphurous.DTM);
if DTMExists(item_Compost.DTM) then freeDtm(item_Compost.DTM);
if DTMExists(item_Coins.DTM) then freeDtm(item_Coins.DTM);
if DTMExists(DTM_PRODSCREEN) then freeDtm(DTM_PRODSCREEN);

end;

Function breakHandler(): Boolean;
Var
T : TTimeMarker;
h,m,s : integer;
tmpAng : Extended;
label
slept;
begin
if not SRL.isLoggedIn() then Exit;
if (timer_Break.getTotalTime < (break_In + break_In_Ran)) then Exit;

Result := true;
break_RealTime := Round((break_For+break_For_Ran)/60000);
tmpAng := minimap.GetCompassAngle(true);
writeLn('Taking a break for about ' + intToStr(break_RealTime) + ' minutes.');
if not logout.ClickLogout(3, 5000) then uTerminate('cant Log out');
T.Start();

inc(break_count_to_sleep);

if break_count_to_sleep >= BREAKS_TILL_SLEEP then
begin
Break_For := ((SLEEP_FOR*60*60000)+ SLEEP_FOR_RAND);
repeat
Wait(60000);
convertTime((break_For+break_For_Ran)-T.getTotalTime, h, m, s);
clearDebug();
writeln('Breaktime left: '+IntToStr(h)+':'+IntToStr(m)+':'+IntToStr(s));
until (T.getTotalTime > (break_For+break_For_Ran));
break_For := tmp_BF*60000;
break_count_to_sleep := 0;
goto slept;
end;

repeat
Wait(21000);
convertTime((break_For+break_For_Ran)-T.getTotalTime, h, m, s);
clearDebug();
writeln('Breaktime left: '+IntToStr(h)+':'+IntToStr(m)+':'+IntToStr(s));
until (T.getTotalTime > (break_For+break_For_Ran));

slept:

writeln('Logging in...');

{if DoSwitch then
worldSwitcher.SelectWorld(P_WORLD)
else
Players.GetCurrent()^.Login;}

mainscreen.SetAngle(true);
wait(randomRange(1500,3000));
Result := srl.isLoggedIn();
minimap.SetCompassAngle(tmpang, false);

timer_break.Reset();
timer_Break.Start();
inc(break_Count);
incEx(break_TotalTime, break_For+break_For_Ran);

break_In := (tmp_BI * 60000);
break_For := (tmp_BF * 60000);
break_In_Ran := RandomRange(-tmp_rBI * 60000, tmp_rBI * 60000);
break_For_Ran := RandomRange(-tmp_rBF * 60000, tmp_rBF * 60000);
writeln('The next break will occur in '+srl.MsToTime((break_In+break_In_Ran),Time_Short));
end;

function getTimeUntilBreak(): Integer;
begin
result := ((break_In + break_In_Ran)-timer_Break.getTotalTime());
end;
procedure progress();
var
xpGained, tillbreak, doneHour, profit, profitPerHour, SulphurousMade: Integer;
begin

xpGained := ((xpbar.Read) - (startingXp));
tillbreak := Round(getTimeUntilBreak() / 60000);
SulphurousMade := done*14;
doneHour := Round((SulphurousMade) / (GetTimeRunning / 3600000.0));
profit := done*margin;
profitPerHour := Round((profit) / (GetTimeRunning / 3600000.0));

if DrawPaint then
begin
smart.Image.Clear;
smart.Image.DrawClippedText('Time Running: ' + srl.TimeRunning(Time_Formal_Long), Point(8, 36), 'UpChars07', false, clAqua);
smart.image.DrawClippedText('Time Til Break: ' + inttostr(tillbreak) +' Minutes ' + 'Done: ' + toStr(break_count), Point(8, 52), 'UpChars07', false, clAqua);
smart.image.DrawClippedText('Sulphurous made: ' + inttoStr(SulphurousMade) + ' (' + inttoStr(doneHour) + ' p/h)', Point(8, 68), 'UpChars07', false, clAqua);
//smart.image.DrawClippedText('Profit: ' + inttoStr(profit) + ' (' + inttoStr(ProfitPerHour) + ' p/h)', Point(8, 84), 'UpChars07', false, clAqua);
smart.image.DrawClippedText('Saltpetre Left: ' + inttoStr(SaltpetreLeft) + ' Compost Left: ' + inttoStr(CompostLeft), Point(8, 84), 'UpChars07', false, clAqua);
end else
begin
writeln('==========================================================');
writeln('=====================Progress Report======================');
writeln('==========================================================');
writeln('Time Running: ' + srl.TimeRunning(Time_Formal_Long));
writeln('Time Til Break: ' + inttostr(tillbreak) + ' Minutes ' + 'Done: ' + toStr(break_count));
writeln('Sulphurous Made: ' + inttoStr(done) + ' (' + inttoStr(doneHour) + ' p/h)');
writeln('Saltpetre Left: ' + inttoStr(SaltpetreLeft) + ' Compost Left: ' + inttoStr(CompostLeft));
end;
end;

function TRSBankScreen.OpenNow(): Boolean;
var
Text: String;
begin

if (MainScreen.IsUpText(['Bank', 'Bank booth', 'to Banker', 'nk booth'])) then
begin
Wait(Random(50, 80));
Text := Mainscreen.GetUpText();
if (Pos('booth', Text) > 0) and (Random(100) < 99) then
Result := Mouse.Click(ctRed)
if (not Result) then
Result := (ChooseOption.Open()) and (ChooseOption.Select(['Bank']));

if (Result) then
begin
Minimap.WaitFlag();
Result := Bankscreen.IsOpen(Random(4000, 5000));
end;
end;
end;

function findBank(): Boolean;
const
Booth : TCTS2Color = [2635325, 6, 0.27, 0.38];
var
TPA: TPointArray;
ATPA: T2DPointArray;
i: Integer;
b: TBox;
begin

srl.FindColors(TPA, Booth, mainscreen.GetBounds);

if (Length(TPA) > 0) then
begin
ATPA := ClusterTPAEx(TPA, 3, 3);
SortATPAFromMidPoint(ATPA, MiddleBox(mainscreen.GetBounds));

for i := 0 to High(ATPA) do
begin
b := GetTPABounds(ATPA[i]);
if (b.Width >= 12) and (b.Height >= 8) then
begin
mouse.move(MiddleTPA(ATPA[i]).Random(-4, -4));
if mainscreen.IsUpText(['Bank', 'Bank booth', 'to Banker', 'nk booth'], 1000) then
begin
result := True;
break;
end;
end;
end;
end;

myDebug(result, 'findBank');

end;

function openBank: boolean;
begin
result := false;

if bankscreen.IsOpen(100) then exit(true);

if mainscreen.IsUpText(['Bank', 'Bank booth', 'to Banker', 'nk booth'], 1000) then
result := bankscreen.OpenNow
else
if findbank then
result := bankscreen.OpenNow;

myDebug(result, 'openBank');

end;

Procedure bankManager();
var
tries: Integer;
T: TTimeMarker;
label
retry, a, b;
begin

retry:
inc(tries);

if (not srl.isloggedin()) then exit;

if bankscreen.IsOpen(100) then goto a;

myDebug('Looking for banker');

if mainscreen.IsUpText(['Use', '->'], 100) then
begin
mouse.Move(inventory.GetMiddle);
mouse.Click(MOUSE_LEFT);
end;

if openBank then
begin
a:
if (inventory.Count > 1) then bankscreen.DepositAll;
SaltpetreLeft:= srl.GetItemAmount(bankscreen.GetSlotBox(item_Saltpetre.bankSlot));
CompostLeft:= srl.GetItemAmount(bankscreen.GetSlotBox(item_Compost.bankSlot));
coinsLeft := srl.GetItemAmount(bankscreen.GetSlotBox(item_Coins.bankSlot));
if bankscreen.Withdraw(item_Saltpetre.bankSlot, 14) then
begin
if bankscreen.Withdraw(item_Compost.bankSlot, 14, item_Compost.UpText) then
begin
myDebug('Got items from bank Succesfully');
T.start;
while T.GetTime < 4000 do
begin
wait(randomrange(80,120));
myDebug('Waiting for full inventory');
if inventory.IsFull then break;
end;
if bankscreen.Close then exit;
end if tries < 3 then goto retry else uTerminate('Ran out of compost in Bank');
end if tries < 3 then goto retry else uTerminate('Ran out of Saltpetre in Bank');
end if tries < 3 then goto retry else uTerminate('Cant Open Bank');

end;

function getItemSlots(itemDTM: Integer): TIntegerArray;
var
i, x, y: Integer;
begin

gametabs.Open(tabInventory, 2);
for i:= 1 to 27 do
if FindDtm(itemDTM, x, y, inventory.GetSlotBox(I)) then
result.Append(i);

if result.Len <= 1 then exit();

quicksort(result);
if result[High(result)] >= 1 then myDebug(true, 'getItemSlots');

end;

function waitInventoryChange(maxWaitTime: integer): boolean;
var
a, b, c, d: Integer;
T: TTimeMarker;
begin

result := false;
T.Start;
while T.GetTotalTime < maxWaitTime do
begin
a := inventory.Count(item_Saltpetre.DTM);
b := inventory.Count(item_Compost.DTM);
wait(randomrange(1500, 2000));
c := inventory.Count(item_Saltpetre.DTM);
d := inventory.Count(item_Compost.DTM);
if a > c then
begin
result := true;
break;
end;
end;

myDebug(result, 'waitInventoryChange');

end;

procedure makeSulphurous();
var
tries, x, y: Integer;
pnt: Tpoint;
T: TTimeMarker;
SaltpetreSlots, CompostSlots: TintegerArray;
label
retry, a, b;
begin

retry:
inc(tries);

SaltpetreSlots := getItemSlots(item_Saltpetre.DTM);
CompostSlots := getItemSlots(item_Compost.DTM);

if bankscreen.IsOpen() then bankscreen.Close;

if (sumIntegerArray(SaltpetreSlots)) < 3 then exit;
if (sumIntegerArray(CompostSlots)) < 3 then exit;

inventory.MouseSlot((SaltpetreSlots[high(SaltpetreSlots)]), MOUSE_MOVE);
if mainscreen.IsUpText(item_Saltpetre.Uptext, 1000) then
begin
mouse.Click(MOUSE_LEFT);
inventory.MouseSlot(CompostSlots[low(CompostSlots)], MOUSE_MOVE)
if mainscreen.IsUpText(item_Compost.UpText, 1000) then
begin
mouse.Click(MOUSE_LEFT);
a:
if srl.WaitDTM(DTM_PRODSCREEN, pnt, chatbox.GetBounds, 3000) then // waitProdScreen
begin
sendkeys('1', 100, 50);
myDebug('Sent key 1');
b:
T.start;
case randomrange(0,100) of
0..90: findbank;
91..100: mouse.Move(point(1000, 1000));
end;
While T.GetTotalTime < 25000 do
begin
if (not findDTM(item_Saltpetre.DTM, x, y, Inventory.GetBounds))
or (not findDTM(item_Compost.DTM, x, y, Inventory.GetBounds)) then
break;
if (not waitInventoryChange(2500)) then
if tries < 3 then goto retry;
wait(randomrange(20,80));
end;
inc(done);
end else if tries < 6 then if waitInventoryChange(4000) then goto b else if tries < 6 then goto retry else uTerminate('Prod Screen');
end else if tries < 6 then if waitInventoryChange(6000) then goto b else if tries < 6 then goto retry else uTerminate('Bow String Uptext');
end else if tries < 6 then if waitInventoryChange(6000) then goto b else if tries < 6 then goto retry else uTerminate('Unf bow uptext');

end;

procedure checkStuff();
var
i, j, k, saltpetre_slot, Sulphurous_slot, Compost_slot, x, y, tries,
x2, y2 : Integer;
unf_bow_point, bow_point, string_point : Tpoint;
TPA : TPointArray;
ATPA : T2DPointArray;
label
retry;
begin

myDebug('Starting First run Setup');
options.SetZoom(100);
options.SetBrightness(3, 1000);
gametabs.Open(tabInventory, 3);

retry:
inc(tries);

if openBank then
begin

if FindDtms(item_Saltpetre.DTM, TPA, bankscreen.GetBounds) then
begin
ATPA := clusterTpa(TPA, 1);
for i:= 0 to high(ATPA) do
begin
mouse.Move(MiddleTPA(ATPA[i]));
wait(1000);
if bankscreen.IsUpText(item_Saltpetre.UpText, 2000) then
begin
myDebug('Found Saltpetre');
unf_bow_point := MiddleTPA(ATPA[i]);
for j:= 0 to 48 do
if unf_bow_point.InBox(bankscreen.GetSlotBox(J)) then
begin
saltpetre_slot := J;
myDebug('Saltpetre Slot is: ' + toStr(j));
break;
end;
end;
end;
end;

if findDTM(item_Sulphurous.DTM, x, y, bankscreen.GetBounds) then
begin
bow_point := point(x,y);
mouse.Move(bow_point);
wait(1000);
if bankscreen.IsUpText(item_Sulphurous.UpText, 1000) then
begin
myDebug('Found Sulphurous');
for k:= 0 to 48 do
begin
if bow_point.InBox(bankscreen.GetSlotBox(k)) then
begin
Sulphurous_slot := k;
myDebug('Sulphurous is slot: ' + toStr(Sulphurous_slot));
break;
end;
end;
end;
end;

if findDTM(item_Compost.DTM, x2, y2, bankscreen.GetBounds) then
begin
string_point := point(x2,y2);
mouse.Move(string_point);
wait(1000);
if bankscreen.IsUpText(item_Compost.UpText, 1000) then
begin
myDebug('Found Compost');
for k:= 0 to 48 do
begin
if String_point.InBox(bankscreen.GetSlotBox(k)) then
begin
Compost_slot := K;
myDebug('Compost Slot is: ' + toStr(Compost_slot));
break;
end;
end;
end;
end;

end else if tries < 5 then goto retry else uTerminate('Failed Making first run setup');

if debugStuff then
begin
writeln('== ITEM SLOTS ==');
writeln('Saltpetre: ' + toStr(saltpetre_slot));
writeln('Sulphurous: ' + toStr(Sulphurous_slot));
writeln('Compost: ' + toStr(Compost_slot));
end;

with item_Saltpetre do bankSlot := saltpetre_slot;
with item_Sulphurous do bankSlot := Sulphurous_slot;
with item_Compost do bankSlot := Compost_slot;

myDebug('Finished First run Setup');
firstRun := false;

end;

procedure mainLoop();
begin

if firstRun then
checkStuff;

repeat

if breakHandler then
setupPlayer;

if (not srl.isLoggedIn()) then
setupPlayer;

bankManager;
makeSulphurous;
progress;


until false;

end;

begin
DeclarePlayers();
Smart.EnableDrawing := true;
srl.Setup();
LoadStuff();
mainLoop;
end.

anth_

2019-02-17 15:26:11

Thanks for the release! Probably won't use this, but eh? :-)

Pastah

2019-02-17 21:22:21

Works great, extremely accurate and fast. Thanks for sharing this.

Made all the fertiliser I needed for 100% favour in one go.

Olly

2019-02-17 21:47:34

SRL, Woo!