hi guys,
I made a chicken killer to try and familiarise myself with the API and learn how to do stuff and I think its just about done. It just ran for 2 hours no problem so im wanting to move on and make something else now. before I do I was wondering if anyone could have a really quick look at the code to see if theres anything I should do differently next time
import org.osbot.rs07.api.filter.Filter;
import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.model.NPC;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import java.awt.*;
import java.util.concurrent.TimeUnit;
@ScriptManifest(name = "EmpiresChickenKiller", author = "Empires", version = 1.0, info = "Basic Chicken Killer for Falador Farm", logo = "")
public class EmpiresChickenKiller extends Script {
private long timeBegan;
private long timeRan;
private int beginningXp;
private int currentXp;
private int xpGained;
private int currentLevel;
private int beginningLevel;
final Area CHICKEN_COOP = new Area(3014,3298,3020,3282);
@Override
public void onStart() {
log("Welcome to EmpiresChickenKiller.");
log("Lets get started...");
timeBegan = System.currentTimeMillis();
beginningXp = skills.getExperience(Skill.STRENGTH);
beginningLevel = skills.getStatic(Skill.STRENGTH);
}
private enum State {
ATTACK, WAIT
};
private State getState(){
if(myPlayer().isMoving() || combat.isFighting() || myPlayer().isUnderAttack())
return State.WAIT;
else
return State.ATTACK;
}
@SuppressWarnings("unchecked")
private NPC getTarget(){
NPC targetChicken = npcs.closest(new Filter<NPC>(){
public boolean match(NPC theChicken){
return theChicken != null && theChicken.getName().equals("Chicken") && theChicken.isAttackable() && (theChicken.getHealth() != 0) && CHICKEN_COOP.contains(theChicken);
}
});
return targetChicken;
}
@Override
public int onLoop() throws InterruptedException {
switch(getState()) {
case ATTACK:
NPC chickenToKill = getTarget();
if(!chickenToKill.isOnScreen())
camera.toEntity(chickenToKill);
chickenToKill.interact("Attack");
sleep(random(600,1000));
if(chickenToKill.isInteracting(myPlayer()))
sleep(random(1200,2100));
else
break;
case WAIT:
sleep(random(400,600));
break;
}
return 100;
}
@Override
public void onExit() {
log("Thanks for using my script!");
}
@Override
public void onPaint(Graphics2D g) {
timeRan = System.currentTimeMillis() - this.timeBegan;
g.drawString("Runtime: " + ft(timeRan), 561,221);
currentXp = skills.getExperience(Skill.STRENGTH);
xpGained = currentXp - beginningXp;
g.drawString("XP Gained: " + xpGained, 561,246);
currentLevel = skills.getStatic(Skill.STRENGTH);
g.drawString("Lvl Started: " + beginningLevel, 561,271);
g.drawString("Current Lvl: " + currentLevel, 561,296);
g.drawString("Lvls Gained: " + (beginningLevel - currentLevel), 561,321);
}
private String ft(long duration)
{
String res = "";
long days = TimeUnit.MILLISECONDS.toDays(duration);
long hours = TimeUnit.MILLISECONDS.toHours(duration)
- TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS
.toHours(duration));
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS
.toMinutes(duration));
if (days == 0) {
res = (hours + ":" + minutes + ":" + seconds);
} else {
res = (days + ":" + hours + ":" + minutes + ":" + seconds);
}
return res;
}
}
I basically copy/pasted the paint stuff from a different tutorial btw, but I understand it