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.

Novice Software Developer - Script Help

Featured Replies

So this is my first attempt at making a script for Runescape and wanted to know where I was going wrong. It's a basic woodcutter for the woodcutting guild. I've been having trouble trying to motivate myself to practice my java programming skills and figured this might be one way to do that. I would appreciate any tips and help the community has for me, thanks!

 

UPDATE on 2/17/17 - I'm still having issues with getting the script to run, however, i think the logic is getting better. My main issue is getting used to the OSBot API but in due time, right!? I included an doAntiBan() feature and I also plan to use this script as an educational open source project for future script developers!

package meatball.woodcuttingMod;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

import org.osbot.rs07.api.Bank;
import org.osbot.rs07.api.Inventory;
import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.model.Entity;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.api.ui.Tab;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;

@ScriptManifest(author = "M3ATB4LL", info = "", logo = "", name = "Woodcutting Bot", version = 0.1)

public class WoodcuttingMod extends Script {

    final static String MAGIC_NAME = "Magic tree";
    final static int BANK_BOOTH_ID = 28861;

    final static Area BANK_AREA = new Area(7936, 5632, 8320, 6144);
    final static Area MAGIC_AREA = new Area(6144, 6272, 6912, 7040);

    int logsChopped = 0;
    int startXP = 0;
    static Timer runTime;

    public void onStart() {
        log("Starting M3ATB4LLs Woodcutting Bot");

        runTime = new Timer(0);
        startXP = getSkills().getExperience(Skill.WOODCUTTING);
    }

    public void onExit() {
        log("Exiting M3ATB4LLs Woodcutting Bot");
    }

    public int onLoop() throws InterruptedException {

        Entity magicLog = objects.closest(MAGIC_NAME);
        Bank bank = getBank();
        Inventory inventory = getInventory();

        if (!inventory.isFull() && MAGIC_AREA.contains(myPlayer()) && magicLog != null) {
            if (!magicLog.isVisible()) {
                walking.webWalk(MAGIC_AREA);
                log("Chopping Logs");
                doAntiBan();
            } else if (!myPlayer().isAnimating() || !myPlayer().isMoving()) {
                magicLog.interact("Chop down");
                sleep(random(700, 900));
            }
        }

        if (BANK_AREA.contains(myPlayer())) {

            Entity bankbooth = objects.closest(BANK_BOOTH_ID);

            if (bank.isOpen()) {
                sleep(random(200, 300));
                bank.depositAll();
                sleep(random(300, 500));
            } else {
                if (bankbooth != null) {
                    if (bankbooth.isVisible()) {
                        log("Banking Inventory");
                        sleep(random(200, 300));
                        bankbooth.interact("Bank");
                        sleep(random(300, 500));
                    }
                }
            }
        } else {
            log("Walking to Bank");
            walking.webWalk(BANK_AREA);
            sleep(random(200, 300));
            bank.depositAll();
            doAntiBan();
        }
        return random(100, 125);
    }

    public void onMessage(String message) {
        if (message.contains("You get some magic logs.")) {
            logsChopped++;
        }
    }

    private void doAntiBan() throws InterruptedException {
        switch (random(350, 3000)) {
        case 1:
            getTabs().open(Tab.SKILLS);
            sleep(random(500, 5000));
            log("Antiban Case 1");
            break;
        case 2:
            getTabs().open(Tab.SKILLS);
            sleep(random(500, 5000));
            getSkills().hoverSkill(Skill.RANGED);
            sleep(random(100, 8000));
            getMouse().moveRandomly();
            log("Antiban Case 2");
            break;
        case 3:
            getTabs().open(Tab.SKILLS);
            sleep(random(500, 5000));
            getSkills().hoverSkill(Skill.HUNTER);
            sleep(random(600, 8000));
            getMouse().moveRandomly();
            log("Antiban Case 3");
            break;
        case 4:
            getMouse().moveRandomly();
            log("Antiban Case 4");
            break;
        case 5:
            this.camera.movePitch(random(50, 360));
            this.camera.moveYaw(random(30, 360));
            log("Antiban Case 5");
            break;
        case 6:
            this.camera.moveYaw(random(150, 360));
            this.camera.movePitch(random(120, 360));
            log("Antiban Case 6");
            break;
        case 7:
            this.camera.movePitch(random(30, 360));
            log("Antiban Case 7");
            break;
        case 8:
            this.camera.moveYaw(random(50, 400));
            log("Antiban Case 8");
            break;
        case 9:
            getTabs().open(Tab.SKILLS);
            sleep(random(1000, 6000));
            getSkills().hoverSkill(Skill.WOODCUTTING);
            sleep(random(1400, 8000));
            getMouse().moveRandomly();
            log("Antiban Case 9");
            break;
        }
        sleep(random(700, 1800));
        getTabs().open(Tab.INVENTORY);
        sleep(random(175, 300));
    }

    public void onPaint(Graphics g) {

        Graphics2D graphics = (Graphics2D) g;

        Font normal = new Font("SANS_SERIF", Font.BOLD, 14);
        Font italic = new Font("SANS_SERIF", Font.ITALIC, 12);

        graphics.setColor(Color.WHITE);
        graphics.setFont(normal);

        graphics.drawString("-- M3ATBALLs Woodcutter --", 25, 15);

        graphics.setFont(italic);

        graphics.drawString("Logs Chopped: " + logsChopped, 25, 30);
        graphics.drawString("Logs Chopped/hr: " + getPerHour(logsChopped), 25, 45);
        graphics.drawString("XP Gained: " + (getSkills().getExperience(Skill.WOODCUTTING) - startXP), 25, 60);
        graphics.drawString("XP Gained/hr: " + getPerHour(getSkills().getExperience(Skill.WOODCUTTING) - startXP), 25,
                85);
    }

    public static int getPerHour(int value) {
        if (runTime != null && runTime.getElapsed() > 0) {
            return (int) (value * 3600000d / runTime.getElapsed());
        } else {
            return 0;
        }
    }

    public static long getPerHour(long value) {
        if (runTime != null && runTime.getElapsed() > 0) {
            return (long) (value * 3600000d / runTime.getElapsed());
        } else {
            return 0;
        }
    }
}
 

Edited by M3ATB4LL
Updated code and details

Why is this method recursive? it doesn't look like it does anything.

     private void walkMagic(Area area, boolean x) {

        walkMagic(MAGIC_AREA, true);

    } 

Also, you don't need a method to walk somewhere, you just need to call the walking.webWalk(position) or walking.webWalk(area) methods

I'm not exactly a Java expert but I skimmed through it and added some notes. It really looks good so far.

package meatball.woodcuttingMod;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

import org.osbot.rs07.api.Bank;
import org.osbot.rs07.api.Inventory;
import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.model.Entity;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;

@ScriptManifest(author = "M3ATB4LL", info = "", logo = "", name = "Woodcutting Bot", version = 0.1)

public class WoodcuttingMod extends Script {

  	//these should probable all be private static final since they are constants
    final static String MAGIC_NAME = "Magic tree";
    final int BANK_BOOTH_ID = 28861;

    final Area BANK_AREA = new Area(7936, 5632, 8320, 6144);
    final Area MAGIC_AREA = new Area(6144, 6272, 6912, 7040);
    
    int logsChopped = 0;
    int startXP = 0;
	
	//no need for this to be static
    static Timer runTime;
    
    public void onStart() {
        log("Starting Woodcutting Bot");

        runTime = new Timer(0);
        startXP = getSkills().getExperience(Skill.WOODCUTTING);
    }

    public int onLoop() throws InterruptedException {

        Entity magicLog = objects.closest(MAGIC_NAME);
        Bank bank = getBank();
        Inventory inventory = getInventory();

		//there's no need for so many nested if statements, they can be combined
		//e.g. this should be logically equivalent
		/*
		*if (!inventory.isFull() && MAGIC_AREA.contains(myPlayer()) && magicLog != null) {
        *    if (!magicLog.isVisible()) {
		*		walkMagic(MAGIC_AREA, true);
        *    } else if (!myPlayer().isAnimating()&& !myPlayer().isMoving()) {
        *            magicLog.interact("Chop down");
        *            sleep(random(700, 900));
        *        }
        *        
        *    }
        *}
		*/
		
        if (!inventory.isFull()) {

            if (MAGIC_AREA.contains(myPlayer())) {

                if (magicLog != null) {

                    if (magicLog.isVisible()) {

                        if (!myPlayer().isAnimating()) {

                            if (!myPlayer().isMoving()) {

                                magicLog.interact("Chop down");
                                sleep(random(700, 900));
                            }
                        }
                    } else {
                        walkMagic(MAGIC_AREA, true);
                    }
                }
            }
        } else {

            if (BANK_AREA.contains(myPlayer())) {

                Entity bankbooth = objects.closest(BANK_BOOTH_ID);

                if (bank.isOpen()) {

                    bank.depositAll();
					//add a sleep here
                } else {

                    if (bankbooth != null) {

                        if (bankbooth.isVisible()) {

                            bankbooth.interact("Bank");
                            sleep(random(700, 900));
                        }
                    }
                }
            } else {

                walkBank(BANK_AREA, true);
            }
        }

        return 50;
    }
    

    public void onExit() {
        log("Exiting Woodcutting Bot");
    }

	//theres no point in this method
    private void walkBank(Area area, boolean x) {

        walkBank(BANK_AREA, true);

    }

	//theres no point in this method
    private void walkMagic(Area area, boolean x) {

        walkMagic(MAGIC_AREA, true);

    }

    public void onMessage(String message) {
        if (message.contains("You get some magic logs.")) {
            logsChopped++;
        }
    }

    public void onPaint(Graphics g) {

        Graphics2D graphics = (Graphics2D) g;

        graphics.setColor(Color.WHITE);
        graphics.setFont(new Font("Arial", Font.PLAIN, 10));

        graphics.drawString("Logs Chopped: " + logsChopped, 25, 30);
        graphics.drawString("Logs Chopped/hr: " + getPerHour(logsChopped), 25, 45);

        graphics.drawString("XP Gained: " + (getSkills().getExperience(Skill.WOODCUTTING) - startXP), 25, 60);
        graphics.drawString("XP Gained/hr: " + getPerHour(getSkills().getExperience(Skill.WOODCUTTING) - startXP), 25,
                85);
    }

    public static int getPerHour(int value) {

        if (runTime != null && runTime.getElapsed() > 0) {
            return (int) (value * 3600000d / runTime.getElapsed());
        } else {
            return 0;
        }
    }

    public static long getPerHour(long value) {

        if (runTime != null && runTime.getElapsed() > 0) {
            return (long) (value * 3600000d / runTime.getElapsed());
        } else {
            return 0;
        }
    }
}

 

Edited by Diclonius

There are a lot of things incorrect here.

As mentioned by @wwwat you have two functions that achieve nothing, and are also infinitely recursive, which will just break.

It also looks like you have some of your conditions in the wrong place.

 

  • Author

Thanks for the replies, Ill work on this more tonight. I wasn't able to find the walk class hence why I created my own walk class which does absolutely nothing ha. I'll see what i can fix, the help is really appreciated!

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.