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.

ExperienceTable Class / snippet

Featured Replies

LAST UPDATE: MARCH 26, 2015

package org.bjornkrols.experience;
import java.util.Arrays;

/**
 * @author 		Bjorn Krols (Botre)
 * @version		0.1
 * @since		March 6, 2015
 */

public final class ExperienceTable {
	/**
	 * The maximum skill level in OSRS.
	 */
	private static final int MAXIMUM_LEVEL = 99;
	
	/**
	 * A table holding the experience amounts for a specific number of levels.
	 */
	private static final int[] TABLE = create(MAXIMUM_LEVEL);

	private ExperienceTable() { 
		// This class should never be instantiated.
		// Do not delete or make accessible.
	}
	
	/**
	 * @return The total amount of experience required for the level.
	 */
	public static int getXp(int level) {
		return level == 0 ? 0 : TABLE[level - 1];
	}

	/**
	 * @return The level acquired by the amount of experience.
	 */
	public static int getLevel(int experience) {
		return Math.abs(Arrays.binarySearch(TABLE, experience) + 1);
	}

	/**
	 * Creates the experience table.
	 */
	private static int[] create(int maximumLevel) {
		int[] table = new int[maximumLevel];
		int experience = 0;
		for (int i = 1; i < maximumLevel; i++) {
			experience += Math.floor(i + 300 * Math.pow(2, i / 7.0));
			table[i] = (int) Math.floor(experience / 4);
		}
		return table;
	}

}

Edited by Botre

  • Author

Oh sweet, Its cool that you're actually calculating the exp rather than using a static table biggrin.png

 

apa

 

It still uses table look-up (because it's cheaper).

 

I made it generate the table though, because otherwise certain people will cry about it not being flexible (I personally really doubt they'll ever implement levels > 126 but whatever).

It still uses table look-up (because it's cheaper).

 

I made it generate the table though, because otherwise certain people will cry about it not being flexible (I personally really doubt they'll ever implement levels > 126 but whatever).

 

i like your new old profile picture

Might be better 'cpu-wise' to use a static table. Since CPU is more precious then the few bytes the table would use. 

  • Author

Might be better 'cpu-wise' to use a static table. Since CPU is more precious then the few bytes the table would use. 

 

That's why I'm using table look-up :p

Might be better 'cpu-wise' to use a static table. Since CPU is more precious then the few bytes the table would use. 

Yeah but no. Ever heard of polymorphism? Enjoy updating all your scripts if Jagex decides to increase the max level from 99 - 500.

  • Author

Yeah but no. Ever heard of polymorphism? Enjoy updating all your scripts if Jagex decides to increase the max level from 99 - 500.

	public RSExperienceTable() {
		generateTable(126);
	}

to

	public RSExperienceTable() {
		generateTable(500);
	}

It would take 5 seconds. And it's unlikely I'll ever have to pay that time price :p

 

If they were to update it to 500 with the current formula it would take 536870911 xp.

Meaning you would have to calc a long every x seconds.

But why stop at 500?

Why not make the calculation return a BigDecimal, just to be safe, in case they add decimal levels?

  • Author

would've been better off making this all static kek

 

Yup.

I currently only have one script an account so I only ever create one instance of it :p

But yeah will probably make it static later on ^^

import java.util.Arrays;

/**
 * 
 * @author Bjorn Krols (Botre)
 *
 */

public final class RSExperienceTable {

	int[] table;

	public RSExperienceTable() {
		generateTable(126);
	}

	public RSExperienceTable(int maxLevel) {
		generateTable(maxLevel);
	}

	public int getXp(int level) {
		return level == 0 ? 0 : table[level - 1];
	}

	public int getLevel(int experience) {
		return Math.abs(Arrays.binarySearch(table, experience) + 1);
	}

	private void generateTable(int maxLevel) {
		int[] table = new int[maxLevel];
		int experience = 0;
		for (int i = 1; i < maxLevel; i++) {
			experience += Math.floor(i + 300 * Math.pow(2, i / 7.0));
			table[i] = Math.floorDiv(experience, 4);
		}
		this.table = table;
	}

} 
  

Why final :o

what swiz said. How you going to use an instances when is final.

what swiz said. How you going to use an instances when is final.

Lol what? Do you even know what final does?
  • Author

Why final ohmy.png

 

Because I decided that's where that inheritance branch should end ph34r.png

There's no need for it to been extendable.

 

  

what swiz said. How you going to use an instances when is final.

 

Making a class final really just makes it unextendable ^^

Because I decided that's where that inheritance branch should end :ph34r:

There's no need for it to been extendable.

Making a class final really just makes it unextendable ^^

Lol what? Do you even know what final does?

it was pretty late when I replied and I had it mixed up lol.

Edited by josedpay

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.