Jump to content
View in the app

A better way to browse. Learn more.

OSBot :: 2007 OSRS Botting

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Open-Source] Simple Miner

Featured Replies

A simple mining script that was created for my needs, you can add in the position of the ores and what is the type of ore you want to mine, and it will hover over the next ore and drop when inventory is full.

To change the position of ores, you can edit the values in "positions" or add more positions.
To change the ore type, you can edit the value in "oreToMine" and set it to whatever rock you want to mine.

 

SimpleMiner.java

import org.osbot.rs07.api.map.Position;
import org.osbot.rs07.api.model.Entity;
import org.osbot.rs07.api.model.Item;
import org.osbot.rs07.api.model.RS2Object;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.event.InteractionEvent;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import org.osbot.rs07.utility.ConditionalSleep2;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.List;

@ScriptManifest(version = 0.0, logo = "", author = "Progamerz", name = "Simple Miner", info = "")
public class SimpleMiner extends Script {

    List<Position> positions = Arrays.asList(new Position(3183, 3376, 0), new Position(3181, 3376, 0));
    Rock oreToMine = Rock.TIN;
    RS2Object currentOre;
    RS2Object nextOre;

    long startTime;

    @Override
    public void onStart() {
        startTime = System.currentTimeMillis();
        getExperienceTracker().start(Skill.MINING);
    }

    @Override
    public int onLoop() throws InterruptedException {
        if (getDialogues().isPendingContinuation()) {
            getDialogues().clickContinue();
        } else if (getInventory().isFull()) {
            dropAll();
        } else {
            if (myPlayer().isAnimating()) {
                handleAnimating();
            } else {
                if (currentOre == null || !currentOre.exists()) {
                    getCurrentOre();
                } else if (customInteract(currentOre)) {
                    ConditionalSleep2.sleep(5_000, 250, () -> myPlayer().isAnimating()
                            || !currentOre.exists()
                            || getDialogues().isPendingContinuation());
                }
            }
        }
        return 250;
    }

    @Override
    public void onPaint(Graphics2D g) {
        int x = 10, y = 50;
        g.setFont(g.getFont().deriveFont(16.0f));
        g.setColor(Color.BLUE);
        if (startTime != 0) {
            long elapsedTime = System.currentTimeMillis() - startTime;
            g.drawString(String.format("Runtime: %s", formatTime(elapsedTime)), x, y += 25);
            g.drawString(String.format("XP(/HR): %d(%d)", getExperienceTracker().getGainedXP(Skill.MINING),
                    getExperienceTracker().getGainedXPPerHour(Skill.MINING)), x, y += 25);
        }
    }

    private void getCurrentOre() {
        if (nextOre != null) {
            // We finished mining currentOre, and we want to change it to nextOre and set nextOre to null
            currentOre = nextOre;
            nextOre = null;
        } else {
            // The script ran for the first time, we have to initialize currentOre
            currentOre = getClosestOre();
        }
    }

    private void handleAnimating() {
        if (nextOre != null && nextOre.exists()) {
            if (!entityBoundsHasMyMouse(nextOre))
                nextOre.hover();
        } else {
            // We should find nextOre when we are mining to hover over
            nextOre = getNextOre();
        }
    }

    private RS2Object getClosestOre() {
        return oreToMine.getClosestWithOre(this, rock -> positions.contains(rock.getPosition()));
    }

    private RS2Object getNextOre() {
        return oreToMine.getClosestWithOre(this, rock -> positions.contains(rock.getPosition())
                & !rock.getPosition().equals(currentOre.getPosition()));
    }

    private void dropAll() throws InterruptedException {
        if (getSettings().isShiftDropActive()) {
            getKeyboard().pressKey(KeyEvent.VK_SHIFT);
        }
        for (int i : new int[]{
                0, 4, 8, 12, 16, 20, 24, 25, 21, 17, 13, 9, 5, 1, 2, 6, 10, 14, 18, 22, 26, 27, 23, 19,
                15, 11, 7, 3
        }) {
            Item item = getInventory().getItemInSlot(i);
            if (item != null) {
                if (getSettings().isShiftDropActive()) {
                    getInventory().interact(i);
                } else {
                    getInventory().interact(i, "Drop");
                }
                sleep(random(50, 150));
            }
        }
        if (getSettings().isShiftDropActive()) {
            getKeyboard().releaseKey(KeyEvent.VK_SHIFT);
        }
    }

    private boolean entityBoundsHasMyMouse(Entity entity) {
        List<Polygon> polygonList = getDisplay().getModelMeshTriangles(entity.getGridX(), entity.getGridY(),
                entity.getZ(), entity.getModel());
        if (polygonList != null && !polygonList.isEmpty()) {
            return polygonList.stream().anyMatch(polygon -> polygon.contains(getMouse().getPosition()));
        }
        return false;
    }

    private boolean customInteract(Entity entity) {
        InteractionEvent interactionEvent = new InteractionEvent(entity, "Mine");
        interactionEvent.setWalkTo(false);
        interactionEvent.setOperateCamera(false);
        return execute(interactionEvent).hasFinished();
    }

    private String formatTime(long ms) {
        long sec = ms / 1000, d = sec / 86400, h = sec / 3600 % 24, m = sec / 60 % 60, s = sec % 60;
        return (d < 10 ? "0" + d : d) + ":" + (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":"
                + (s < 10 ? "0" + s : s);
    }
}

Rock.java

import org.osbot.rs07.api.filter.Filter;
import org.osbot.rs07.api.model.Entity;
import org.osbot.rs07.api.model.RS2Object;
import org.osbot.rs07.script.MethodProvider;

import java.util.stream.Stream;

//Author @Explv
public enum Rock {
    CLAY(new short[]{6705}),
    COPPER(new short[]{4645, 4510}),
    TIN(new short[]{53}),
    IRON(new short[]{2576}),
    SILVER(new short[]{74}),
    COAL(new short[]{10508}),
    GOLD(new short[]{8885}),
    MITHRIL(new short[]{-22239}),
    ADAMANTITE(new short[]{21662}),
    RUNITE(new short[]{-31437});

    private final short[] colours;

    Rock(final short[] colours) {
        this.colours = colours;
    }

    @SafeVarargs
    public final RS2Object getClosestWithOre(final MethodProvider methods, final Filter<RS2Object>... filters) {
        return methods.getObjects().closest(
                obj -> Stream.of(filters).allMatch(f -> f.match(obj))
                        && hasOre(obj)
        );
    }

    public boolean hasOre(final Entity rockEntity) {
        if (rockEntity.getDefinition() == null) {
            return false;
        }

        short[] colours = rockEntity.getDefinition().getModifiedModelColors();

        if (colours == null) {
            return false;
        }

        for (short rockColour : this.colours) {
            for (short entityColour : colours) {
                if (rockColour == entityColour) {
                    return true;
                }
            }
        }
        return false;
    }
}

 

Edited by progamerz

  • 1 year later...

Works perfectly, I changed the below to simply inventory.dropAll();

        for (int i : new int[]{
                0, 4, 8, 12, 16, 20, 24, 25, 21, 17, 13, 9, 5, 1, 2, 6, 10, 14, 18, 22, 26, 27, 23, 19,
                15, 11, 7, 3
if (myPlayer().isAnimating() && currentOre != null && currentOre.exists()) {
	handleAnimating();
}

Shouldn't this be better in case you're mining in a crowded place? When someone mines a rock you still continue to animate for a few seconds thus making you wait for the animation to finish to go to next rock

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.