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.

New scripter says hello to OSBOT ;)

Featured Replies

Hello everyone,

 

As you've read the title, I'm a new scripter in town wink.png.

I'm probably going to create a few scripts to understand the world of OSBOT API.

 

Few things about myself:

I'm 19 years old, live in Belgium and WILL take coding classes (Which will include Java, ...). This might also explain why my English isn't top-notch, so please take that in mind wink.png.

At the moment I'm taking an ICT-related course, which is honesly way to easy for me. Whitout really trying I get 80/100 average.Too bad that's the only coding-related course there is in Belgium. Next year i'll try and get my grade in coding(in Louvain if some people have heard of it).

I play RuneScape since... about 2007 - 2008, and I've botted a couple 99's. I started playing 07 about a couple months ago, but my bought main got banned (Barrows bot... :/). I always loved the concept of a 'bot', and dreamt of making one.

Now this dream has already came true. I've written my first script (very basic, no Antiban) which shears sheep in Lumbrigde and banks.

I already knew the basics of C and Visual Basic, and thought it would've been easyer. The script itself probably has alot of coding mistakes... If you see one, PLEASE tell me what to do, and most importantly WHY it must be changed. I'm here to lean after all.

 

My goals:

To be one of the premium scriptwriters! I'd love the idea that my creatings will be usefull one day. I've got a long way ahead of me, and I think i'll like it smile.png. I'll try to focus alot on 'User Friendly'-ness (Nice GUI's, informative paints, ...) and keeping in touch with the people who review my scripts.

 

 

Cheers!

 

Edit: I'd love to be able to talk to an active scripter (on Skype or ...) to ask coding-related questions. This would help me ALOT smile.png.

Edit2: I'm working atm on a Lumbrigde Swamp (Giant Rat, Giant & Big & Normal Frog) killer with deathwalk/food/bank/hometele/mage/ranged/Draynor bank/Bones/... support. Also looking into a GUI and decent paint smile.png.

 

My first script (*proud*):

(If you know something about how to code: please give a quick review wink.png )

Todo:

• Some kind of antiban

• Paint improvements: Profit/hr, wool/hr

• ...?

(• Making an useless GUI to get the hang of it.)


package Shearer;
import org.osbot.rs07.api.map.Position;
import org.osbot.rs07.api.model.Entity;
import org.osbot.rs07.api.model.NPC;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import org.osbot.rs07.utility.Area;
import java.awt.*;
import java.util.Arrays;

@ScriptManifest(name = "Sheep Shearer", author = "Appelflap", version = 1.0, info = "Shears sheep in Lumbridge.", logo = "") 
public class Main extends Script {

	State Current;
	long startTime ;
	private enum State {TOBANK, SHEAR, TOTHESHEEP, CLOSEBANK, IDLE, DEPOSIT };
	
	
	Position[] BANK_TO_STAIRS = {new Position(3208, 3220, 2), new Position(3206, 3224, 2), new Position(3206, 3229, 2)};
	Position[] STAIRS_TO_BANK = {new Position(3206, 3229, 2), new Position(3206, 3224, 2), new Position(3208, 3220, 2)};
	Position[] INTO_PEN = {new Position (3210, 3261, 0), new Position (3206, 3261, 0),};
	Position[] TO_GATE = {new Position (3206, 3261, 0), new Position( 3212, 3261, 0)};
	Position[] STAIRS_TO_SHEEP = {new Position(3205, 3228, 0), new Position(3214, 3227, 0),
			 new Position(3221, 3218, 0), new Position(3232, 3219, 0), new Position(3232, 3228, 0), new Position(3225, 3235, 0),
			 new Position(3219, 3246, 0), new Position(3216, 3257, 0), new Position(3213, 3262, 0)};
	Position[] SHEEP_TO_STAIRS = {new Position(3213, 3262, 0), new Position(3216, 3257, 0),
			new Position(3219, 3246, 0), new Position(3225, 3235, 0), new Position(3232, 3228, 0), new Position(3232, 3219, 0),
			new Position(3221, 3218, 0), new Position(3214, 3227, 0), new Position(3205, 3228, 0)};
	
	
    public void onStart() {
    	log("Let's shear some sheep!");
    	startTime = System.currentTimeMillis();
    	combat.toggleAutoRetaliate(true); //Safety Purposes
    	mouse.setSpeed(150);
    }
    
    public void onExit() {
        log("We stopped shearing the sheep.");
    }

    public int onLoop() throws InterruptedException {
    	Current = getState();
    	log(Current.toString());
    	switch (Current){
 
    	case CLOSEBANK: 
    		while (bank.isOpen()){
    			bank.close();
    			sleep(gRandom(500,1700));
    		}
    		break;
    	
    	case SHEAR:
    		Shear();
    		break;
    	
    	case TOBANK: 
    		WalkToBank();
    		break;
        	
    	case TOTHESHEEP: 
    		WalkToSheep();
    		break;
    	case DEPOSIT: 
    		Deposit();
    		break;
    		
    	case IDLE: 
    		log("This should never happen...");
    		break;
    	
    	}
    	
        return gRandom(100, 800);
 }
   	  	
    public void WalkToSheep() throws IllegalArgumentException, InterruptedException {

			if (myPlayer().getZ() == 2) {
				localWalker.walkPath(BANK_TO_STAIRS);
				sleep(gRandom(1500,2000));
				Entity stairs = objects.closest("Staircase");
				if (stairs != null && stairs.exists()&& Arrays.asList(stairs.getDefinition().getActions()).contains("Climb-down"))
					stairs.interact("Climb-down");
				sleep(gRandom(3000, 4200));
			}
			
			if (myPlayer().getZ() == 1) {
				Entity stairs = objects.closest("Staircase");
				if (stairs != null && stairs.exists()&& Arrays.asList(stairs.getDefinition().getActions()).contains("Climb-down"))
					stairs.interact("Climb-down");
				sleep(gRandom(1000, 1200));
			}
			
			if (myPlayer().getZ() == 0){
				localWalker.walkPath(STAIRS_TO_SHEEP);
				sleep (gRandom(1000,2000));
				Entity Gate = objects.closest("Gate");
				if (Gate != null && Gate.exists()&& Arrays.asList(Gate.getDefinition().getActions()).contains("Open")&& (Gate.getId()== 12987 || Gate.getId()== 12989))
					Gate.interact("Open");
				localWalker.walkPath(INTO_PEN);
				sleep (gRandom(1500,3000));
			}
			
    }
	
    public void WalkToBank() throws IllegalArgumentException, InterruptedException{
    	
    	if (myPlayer().getZ() == 0){
			localWalker.walkPath(TO_GATE);
			sleep (gRandom(1000,2000));
			Entity Gate = objects.closest("Gate");
			if (Gate != null && Gate.exists()&& Arrays.asList(Gate.getDefinition().getActions()).contains("Open"))
				Gate.interact("Open");
			localWalker.walkPath(SHEEP_TO_STAIRS);
			sleep (gRandom(1500,3000));
			Entity stairs = objects.closest("Staircase");
			if (stairs != null && stairs.exists()&& Arrays.asList(stairs.getDefinition().getActions()).contains("Climb-up"))
				stairs.interact("Climb-up");
			sleep (gRandom(2000,5200));
		}
    	
    	if (myPlayer().getZ() == 1) {
			Entity stairs = objects.closest("Staircase");
			if (stairs != null && stairs.exists()&& Arrays.asList(stairs.getDefinition().getActions()).contains("Climb-up"))
				stairs.interact("Climb-up");
			sleep(gRandom(1000, 1200));
		}
    	
    	if (myPlayer().getZ() == 2) {
			localWalker.walkPath(STAIRS_TO_BANK);
			sleep(random(1500,2000));
			Entity Bank = objects.closest ("Bank booth");
			if (Bank != null && Bank.exists()&& Arrays.asList(Bank.getDefinition().getActions()).contains("Bank"))
				Bank.interact("Bank");
			sleep(gRandom(1000, 1200));
					
		}
    }
    
	public void Deposit() throws IllegalArgumentException, InterruptedException {

		if (bank.isOpen()){
				bank.depositAllExcept("Shears");
				if (!inventory.contains("Shears")){
						if (bank.contains("Shears")){
							bank.withdraw("Shears", 1);
							if (inventory.isEmptyExcept("Shears")){
								return;
							}
						}
						else {
							log("ERROR: You do not have shears!");
							stop();
						}
					}		
				
			}
			
		else {
			if (objects.closest("Bank booth") != null) {
				objects.closest("Bank booth").interact("Bank");
				sleep (gRandom(300,800));
			}
			else{
				log("No bank booth found");
			}
		}
		
	}

	public void Shear() throws IllegalArgumentException, InterruptedException{
    	NPC Sheep = getNpcs().closest("Sheep");	
    	Area SHEEP_PEN = new Area(3193, 3257, 3211, 3276);
    	
		if (Sheep != null) {
			if (Sheep.hasAction("Shear")){
				if (myPlayer().getAnimation()!= 893){
					if (Sheep.isVisible()&&Sheep.isOnScreen()){
						if (!Sheep.hasAction("Talk-to")){
							if (Sheep.hasAction("Shear")){
								if (SHEEP_PEN.contains(Sheep)){
										Sheep.interact("Shear");
										sleep (gRandom(1124,2335));
								}						
							}
								
						}
    				}
    				else {
    					camera.toEntity(Sheep);
    					sleep (gRandom(600,800));
					
    				}
				}
			}
		}
    }

    public State getState(){
    	NPC Sheep = getNpcs().closest("Sheep");	
   
    	if (inventory.isEmptyExcept("Shears")&& bank.isOpen())
    		return State.CLOSEBANK; 
    	
    	if (bank.isOpen()|| myPlayer().getPosition() == new Position(3208,3220,2))
    		return State.DEPOSIT;
    	
    	if (!inventory.contains(1735) || inventory.isFull())
    		return State.TOBANK;
    	
    	if (inventory.contains("Shears")&& !inventory.isFull() && Sheep != null)
    		return State.SHEAR;
    	
    	if (inventory.isEmptyExcept("Shears")&& Sheep == null)
    		return State.TOTHESHEEP;
    	
    	if (inventory.isFull())
    		if (!bank.isOpen())
    			return State.TOBANK;
 
    	return State.IDLE;
    	}
 
	public void onPaint(Graphics2D g) {
		
		g.setColor(Color.GREEN);
		g.drawString("Script is running!", 400, 300);
		long elapsed = System.currentTimeMillis() - startTime;
		g.drawString((new StringBuilder("Time: ")).append(format(elapsed)).toString(), 400, 270); //look below
	}

    public String format(long time) { //this is 100% copied from someone of the forums, 0% mine.

        	StringBuilder string = new StringBuilder();
        	long totalSeconds = time / 1000L;
        	long totalMinutes = totalSeconds / 60L;
        	long totalHours = totalMinutes / 60L;
        	int seconds = (int) totalSeconds % 60;
        	int minutes = (int) totalMinutes % 60;
        	int hours = (int) totalHours % 24;
        	if (hours > 0) {
        		string.append((new StringBuilder(String.valueOf(hours))).append(
        				":").toString());
        	}
        	if (minutes > 0) {
        		string.append((new StringBuilder(String.valueOf(minutes))).append(
        				":").toString());
        	}
        	string.append((new StringBuilder(String.valueOf(seconds))).append(":")
        			.toString());
        	return string.toString();
        	}
    
 }
 
 

Edited by Appelflapjes

Welcome!

Enjoy your stay

Great to have a freshly new Scripter!

 

Goodluck!!

 

BTW i´m a dutchy :P

  • Author

Welcome!

Enjoy your stay

 

Wow such quick reactions! ;)

Thanks man!

 

 

 

Welcome to OSbot

 

Thank you :D

Great to have a freshly new Scripter!

 

Goodluck!!

 

BTW i´m a dutchy tongue.png

It it that uncommon ;)?

Thanks mede-Nl-spreker!

  • Author

Welcome to osbot! Interested to see what you can write smile.png.

 

Thanks!

And I am aswell interested what I'm capable of happy.png

heyyyyyyyy

 

Any chance you could play around with the code a little? it's kinda white and i cant seem to read it xd (just interested in what and how you've written)

 

apa c:

 

ps feel free to pm me with any scripting-related questions.

Thanks!

And I am aswell interested what I'm capable of happy.png

 

Once you get the api down you can pretty much write anything. Only exceptions would be things like Frost Barrows.

  • Author

Once you get the api down you can pretty much write anything. Only exceptions would be things like Frost Barrows.

 

Thats the hardest part...

I copied so much from other people... And the API-page seems a bit ... filled with words :D.

  • Author

Welcome

 

Tyvm! :)

 

welcome to the party! smile.png

 

WHAT PARTY? WHERE? WHEN?

I need to be there.

 

Thanks ;)

Hi welcome and good luck!
Your first script looks promising :)

Alright, I briefly checked your script ;)

First of all when you script it's important to use an IDE such as eclipse or IntelliJ IDEA. Using IntelliJ you can jump to the (decompiled) implementation of an API method, so you can actually see what it does. There's this line in your script: while (bank.isOpen()){ bank.close(); ...  if we check the implementation, bank.close() already checks if the bank is open. I use this very often, perhaps it's useful for you as well to understand what exactly the api methods do.

Arrays.asList(stairs.getDefinition().getActions()).contains("Climb-down") could be simplified into stairs.hasAction("Climb-down")

You could also check out the doorHandler api, it most likely support gates. You specify what position you want to walk to and the doorhandler opens any doors/gates between the player and the target position.

There are a lot of nested if statements :p I remember I did the same thing when I first started scripting. It's very difficult to debug, so you might want to avoid it ;)

 

Guest
This topic is now closed to further replies.

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.