Jump to content

Lumby fisher & cooker [Open source]


Slakan

Recommended Posts

Lumbridge fishing & cooking [Open source], Version 1.00

image.png.63ab573693ed2e97ad6e9e9a8c2427a0.png

 

Version: 1.00

Description:

The script will fish for shrimps & anchovies (depending on level) in Lumbridge fishing area and cook them in the range place in Lumbridge.

This is the first script I've made and learning process was from reading tutorials on the forum & googlin' like crazy!

Preparations:

This is version 1.00 and there isn't any logic for detecting if we should bank all the inventory items yet. Please bank the inventory you want to save, and either start from the bank or at the fishing area.

Planning for improvement:

  • Implement detection if inventory is full of stuff(Starting stuff), and bank them in Lumbridge.
  • Re-write code for easier understanding, now its "all-over the place" (Need help with ideas on how to structure the code)
  • Reduce the amount of repetitive coding (like object filtering)
  • Make more functions for things to reduce the amount of code in main loop and make maintenance easier.
  • Implement in future option to select "Progressive" and continue in Barbarian village for fly fishing
    • Maybe implement GE stocking of rod & feathers
      • Else just buy the stuff?
  • Better detection for how to handle the door into building.
  • Make better paint (i know, its horrible).
  • Better detection of widgets (fail safes, null detection etc)
  • Better detection of objects (position where we should use it)

 

Bugs:

  • Few times after clicking door, it will go into house and out and back in.
  • Spam click door if player isn't moving.
  • If enabling g.draw rectangle, i cant get g.draw text above it. Its hidden behind it.
  • Will be more i guess.

I do appreciate all constructive feedback to improve my scripting knowledge.

 

 

You can get access to it: https://pastebin.com/ZYz1szg5

import org.osbot.rs07.api.filter.Filter;
import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.map.Position;
import org.osbot.rs07.api.model.NPC;
import org.osbot.rs07.api.model.RS2Object;
import org.osbot.rs07.api.ui.RS2Widget;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import org.osbot.rs07.utility.ConditionalSleep;

import java.awt.*;
import java.util.concurrent.TimeUnit;

@ScriptManifest(author = "Slakan", name = "LumbyFisher", info = "Will fish as stated.", version = 1.00, logo = "")
public final class LumbyFisher extends Script {

    // PAINT VARIABLE DECLARATIONS
    private long timeBegan;
    private int FishbeginningLevel;
    private int CookbeginningLevel;

    // ONSTART() METHOD
    public final void onStart() {
        timeBegan = System.currentTimeMillis();
        FishbeginningLevel = skills.getStatic(Skill.FISHING);
        CookbeginningLevel = skills.getStatic(Skill.COOKING);
    }

    private RS2Widget getMyWidget() {
        //Replace ids with your ids
        RS2Widget storedWidget = getWidgets().get(270, 14);
        return storedWidget;
    }

    private RS2Object range() {
        RS2Object range = getObjects().closest("Range");
        return range;
    }

    @Override
    public final int onLoop() throws InterruptedException {
        Area fishingArea = new Area(3250, 3143, 3239, 3157);
        Area rangeArea = new Area(3233, 3195, 3230, 3198);
        Area outsideBuilding = new Area(3237, 3202, 3233, 3199);
        Position doorPosition = new Position(3235, 3198, 0);
        NPC fishingSpot = getNpcs().closest("Fishing spot");

        if (dialogues.isPendingContinuation()) {
            dialogues.clickContinue();
        } else {
            if (!inventory.isFull()) {
                // inventory is not full
                log("Inventory not full");
                if (fishingArea.contains(myPlayer().getPosition())) {
                    // We are at fishing area
                    log("We are at fishing area!");
                    if (myPlayer().isAnimating()) {
                        log("We are animating for fishing!!");
                        new ConditionalSleep(5000) {
                            @Override
                            public boolean condition() {
                                return inventory.isFull();
                            }
                        }.sleep();
                    } else {
                        if (fishingSpot.interact("Net")) {
                            mouse.moveOutsideScreen();
                            log("Interact with spot!");
                            new ConditionalSleep(1000) {
                                @Override
                                public boolean condition() {
                                    return myPlayer().isAnimating() || dialogues.clickContinue();
                                }
                            }.sleep();
                        }
                    }
                } else {
                    // We arent at fishing area
                    log("We aint at fishing area!");
                    // can we see the fishing spot? - We should click it, then we are in area.
                    walking.webWalk(fishingArea);
                }

            } else {
                //inventory full
                if (inventory.contains("Raw anchovies", "Raw shrimps")) {
                    if (rangeArea.contains(myPlayer())) {
                        log("We are in range area");
                        // We are at range area!
                        if (myPlayer().isAnimating()) {
                            log("We are animating cooking!");
                            new ConditionalSleep(1000) {
                                @Override
                                public boolean condition() {
                                    return !myPlayer().isAnimating() || !inventory.contains("Raw anchovies", "Raw shrimps");
                                }
                            }.sleep();
                        } else {
                            log("We are in range area, not animating and ready to cook!");
                            // We are inside the range area, we are not animating! We should click range and start cook!
                            if (getMyWidget() == null) {
                                // We see menu
                                log("We can't see menu!");
                                if (range().isVisible() && range() != null) {
                                    if (range().interact()) {
                                        sleep(random(2000, 3000));
                                        log("We can click range!");
                                        new ConditionalSleep(5000) {
                                            @Override
                                            public boolean condition() {
                                                return getMyWidget().isVisible();
                                            }
                                        }.sleep();
                                    }

                                }

                            } else {
                                log("menu open!");
                                if (getMyWidget().interact("Cook")) {
                                    sleep(random(500, 1000));
                                    new ConditionalSleep(5000) {
                                        @Override
                                        public boolean condition() {
                                            return !myPlayer().isAnimating();
                                        }
                                    }.sleep();
                                }
                            }

                        }
                    } else {
                        // We aint at range area!
                        log("We are not in range area!");
                        if (inventory.isFull() && inventory.contains("Raw shrimps", "Raw anchovies")) {
                            // We are not outside building & We can walk.
                            log("inventory is full and its either shrimps, anchovies or both.");
                            if (!outsideBuilding.contains(myPlayer()) && walking.walk(outsideBuilding)) {
                                log("Walking to outside area!");
                                new ConditionalSleep(5000) {
                                    @Override
                                    public boolean condition() {
                                        return outsideBuilding.contains(myPlayer());
                                    }
                                }.sleep();
                            } else {
                                RS2Object isDoorOpen1 = getObjects().closest(new Filter<RS2Object>() {
                                    @Override
                                    public boolean match(RS2Object o) {
                                        if (o != null && o.hasAction("Open") && o.getPosition().equals(doorPosition))
                                            return true;
                                        return false;
                                    }
                                });
                                if (isDoorOpen1 == null) {
                                    log("Door open!");
                                    if (!rangeArea.contains(myPlayer())) {
                                        walking.walk(rangeArea);
                                    }
                                }
                                log("We are outside. Now how about the door?");
                                if (getDoorHandler().canReachOrOpen(doorPosition)) {
                                    // We can handle door!
                                    log("We can handle the door??");
                                    // Get the door in position
                                    RS2Object doorAtPosition = getObjects().closest(new Filter<RS2Object>() {
                                        @Override
                                        public boolean match(RS2Object o) {
                                            if (o != null && o.getName().equals("Door") && o.getPosition().equals(doorPosition))
                                                return true;
                                            return false;
                                        }
                                    });
                                    if (doorAtPosition != null && doorAtPosition.isVisible()) {
                                        RS2Object isDoorOpen = getObjects().closest(new Filter<RS2Object>() {
                                            @Override
                                            public boolean match(RS2Object o) {
                                                if (o != null && o.hasAction("Open") && o.getPosition().equals(doorPosition))
                                                    return true;
                                                return false;
                                            }
                                        });
                                        if (isDoorOpen != null && outsideBuilding.contains(myPlayer())) {
                                            log("We need to open door");
                                            // This really needs to be checked again, works for now..
                                            isDoorOpen.interact("Open");
                                        } else {
                                            log("Door is opened!");
                                        }
                                    } else {
                                        log("Door is most probably opened. Need failsafes!");

                                    }
                                } else {
                                    // Cant handle door.
                                }
                            }

                        } else {
                            // We have full inv, but nothing in there is fishes.
                        }
                    }
                } else {
                    inventory.dropAllExcept("Small fishing net");
                }

            }
        }
        return 300;
    }

    // ONPAINT() METHOD
    public void onPaint(Graphics2D g) {
        //Levels
        int FishcurrentLevel = skills.getStatic(Skill.FISHING);
        int CookcurrentLevel = skills.getStatic(Skill.COOKING);
        int FishlevelsGained = FishcurrentLevel - FishbeginningLevel;
        int CooklevelsGained = CookcurrentLevel - CookbeginningLevel;
        long timeRan = System.currentTimeMillis() - this.timeBegan;

        g.drawString("Version: 1.00", 6, 185);
        g.drawString("Runtime: " + ft(timeRan), 6, 200);
        g.drawString("Fishing start lvl: " + FishbeginningLevel + " + " + FishlevelsGained, 6, 215);
        g.drawString("Cooking start lvl: " + CookbeginningLevel + " + " + CooklevelsGained, 6, 230);
        //Color rscolor = new Color(200, 180, 150);
        //g.setColor(rscolor);
        //g.fillRect(6,344, 506, 130);
    }

    // FORMAT TIME METHOD
    private String ft(long duration) {
        String res = "";
        long days = TimeUnit.MILLISECONDS.toDays(duration);
        long hours = TimeUnit.MILLISECONDS.toHours(duration) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
        long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
        long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
        if (days == 0) {
            res = ("Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
        } else {
            res = ("Days: " + days + "Hours: " + hours + "Minutes: " + minutes + "Seconds: " + seconds);
        }
        return res;
    }

}

 

Link to comment
Share on other sites

4 hours ago, Khaleesi said:

Looking good! 
For the Widget you can use somehting like this to get it without ID's

getWidgets().getWidgetContainingText()

Thank you for the feedback :) I will implement some changes for that in the later release, so i don't have to depend on the ID's in case they change.

 

  • Like 1
Link to comment
Share on other sites

@Khaleesii have some questions if you are able to point me in the right direction.

There is one thing i need help with, and its checking if door is actually open in conditional sleep.

I start by selecting the closest object based on filter and using position to find the correct door.

RS2Object isDoorOpen = getObjects().closest(new Filter<RS2Object>() {
                    /*
                    * This RS2Object is filtering door by position and if it has action open.
                    * Return null if door is open
                    * */

                    @Override
                    public boolean match(RS2Object door) {
                        if (door != null && door.hasAction("Open") && door.getPosition().equals(doorPosition))
                            return true;
                        return false;
                    }
                });

I check the to see if the door is null:

if(isDoorOpen == null) { Working, i can continue code }
  

But when it comes to the parts where i want to use conditional sleep for when i have interacted with the door the problem comes:

else {
                    /*Door is closed
                    * Lets open it?
                    * */
                    sleep(random(500,850));
                    if(isDoorOpen.interact("Open")) {
                        new ConditionalSleep(2000) {
                            @Override
                            public boolean condition() {
                                /*
                                * Need better return logic.
                                * This is always false
                                * Will wait x-seconds insted
                                * */
                                return isDoorOpen ==null;
                            }
                        }.sleep();
                    }

There is probably a smarter way to detect if the door is closed, and how we should interact with it. But this is what i came up with, but i just cant get my head around the conditional sleep. It will sometimes spam click door, even if we have clicked it and it opens.

Would be much appreciated for feedback on this part. I have the version 1.01 working pretty smooth now, and I've eliminated tons of bugs, re-written it to be understandable and added more logic for checking.

 

Link to comment
Share on other sites

18 hours ago, Slakan said:

@Khaleesii have some questions if you are able to point me in the right direction.

There is one thing i need help with, and its checking if door is actually open in conditional sleep.

I start by selecting the closest object based on filter and using position to find the correct door.

RS2Object isDoorOpen = getObjects().closest(new Filter<RS2Object>() {
                    /*
                    * This RS2Object is filtering door by position and if it has action open.
                    * Return null if door is open
                    * */

                    @Override
                    public boolean match(RS2Object door) {
                        if (door != null && door.hasAction("Open") && door.getPosition().equals(doorPosition))
                            return true;
                        return false;
                    }
                });

I check the to see if the door is null:

if(isDoorOpen == null) { Working, i can continue code }
  

But when it comes to the parts where i want to use conditional sleep for when i have interacted with the door the problem comes:

else {
                    /*Door is closed
                    * Lets open it?
                    * */
                    sleep(random(500,850));
                    if(isDoorOpen.interact("Open")) {
                        new ConditionalSleep(2000) {
                            @Override
                            public boolean condition() {
                                /*
                                * Need better return logic.
                                * This is always false
                                * Will wait x-seconds insted
                                * */
                                return isDoorOpen ==null;
                            }
                        }.sleep();
                    }

There is probably a smarter way to detect if the door is closed, and how we should interact with it. But this is what i came up with, but i just cant get my head around the conditional sleep. It will sometimes spam click door, even if we have clicked it and it opens.

Would be much appreciated for feedback on this part. I have the version 1.01 working pretty smooth now, and I've eliminated tons of bugs, re-written it to be understandable and added more logic for checking.

 

What I usually do is check if you can reach a position behind the door.
getmap().canreach(), if so, walk inside, if not get the door object and interact with it :)

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...