I'll post this in the snippet section a little later, but here's something I just whipped up which should cover everything you need for progress bars
Class:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.script.Script;
public class ProgressBar {
/**
* @author © Apaec
* @since 17 Jun 2016
* @file ProgressBar.java
*/
Script s;
Graphics g;
String name;
Skill skill;
boolean frame;
int x, y, width, height;
Color red = new Color(255, 0, 0, 150);
Color green = new Color(0, 255, 0, 150);
Font font;
int[] XP = { 0, 83, 174, 276, 388, 512, 650, 801, 969, 1154, 1358, 1584,
1833, 2107, 2411, 2746, 3115, 3523, 3973, 4470, 5018, 5624, 6291,
7028, 7842, 8740, 9730, 10824, 12031, 13363, 14833, 16456, 18247,
20224, 22406, 24815, 27473, 30408, 33648, 37224, 41171, 45529,
50339, 55649, 61512, 67983, 75127, 83014, 91721, 101333, 111945,
123660, 136594, 150872, 166636, 184040, 203254, 224466, 247886,
273742, 302288, 333804, 368599, 407015, 449428, 496254, 547953,
605032, 668051, 737627, 814445, 899257, 992895, 1096278, 1210421,
1336443, 1475581, 1629200, 1798808, 1986068, 2192818, 2421087,
2673114, 2951373, 3258594, 3597792, 3972294, 4385776, 4842295,
5346332, 5902831, 6517253, 7195629, 7944614, 8771558, 9684577,
10692629, 11805606, 13034431, 200000000 };
public ProgressBar(Script script, Graphics graphics, String name,
Skill skill, boolean frame, int transparency, Font font, int x,
int y, int width, int height) {
this.s = script;
this.g = graphics;
this.name = name;
this.skill = skill;
this.frame = frame;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.red = new Color(255, 0, 0, transparency);
this.green = new Color(0, 255, 0, transparency);
this.font = font;
}
public int getCurrentExperience() {
return s.getSkills().getExperience(skill)
- XP[s.getSkills().getStatic(skill) - 1];
}
public int getTargetExperience() {
return XP[s.getSkills().getStatic(skill)]
- XP[s.getSkills().getStatic(skill) - 1];
}
public int getRemainingExperience() {
return XP[s.getSkills().getStatic(skill) + 1]
- s.getSkills().getExperience(skill);
}
public int getPercentage(int current, int total) {
return current * 100 / total;
}
public int getWidth(int percentage, int totalWidth) {
return percentage * totalWidth / 100;
}
public void draw() {
// Current percentage
g.setColor(green);
g.fillRect(x, y, getWidth(getPercentage(getCurrentExperience(),getTargetExperience()), width), height);
// Remaining percentage
g.setColor(red);
g.fillRect(x + getWidth(getPercentage(getCurrentExperience(), getTargetExperience()), width), y, width
- getWidth(getPercentage(getCurrentExperience(), getTargetExperience()), width), height);
// Frame
if (frame) {
g.setColor(Color.BLACK);
g.drawRect(x, y, width, height);
}
// Setting text font and colour
g.setColor(Color.WHITE);
g.setFont(font);
// The text which we want to show on the progress bar
String text = name + " (" + s.getSkills().getStatic(skill) + "): "
+ getPercentage(getCurrentExperience(), getTargetExperience())
+ "%";
// Create a bounding box around the text
FontMetrics metrics = g.getFontMetrics(font);
Rectangle2D rect = metrics.getStringBounds(text, g);
int textHeight = (int) (rect.getHeight());
int textWidth = (int) (rect.getWidth());
// Get the text x and y co-ordinates relative to the progress bar
int xText = (width - textWidth) / 2;
int yText = (height - textHeight) / 2 + metrics.getAscent();
// Draw text over progress bar
g.drawString(text, x + xText, y + yText);
}
}
Implementation (in onPaint class):
ProgressBar bar = new ProgressBar(this, g, "Ranged", Skill.RANGED,
true, 150, new Font("Gulim", 0, 14), 10, 200, 200, 25);
bar.draw();
Examples:
Hope that helps,
~apa
Edit: I didn't see skills has experienceToLevel, so you can always tidy the code in that respect.