package org.bjornkrols.lesserdemonkiller;
import java.awt.Color;
import java.awt.Graphics2D;
import org.osbot.rs07.api.model.NPC;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import org.osbot.rs07.utility.ConditionalSleep;
/**
* A simple combat script that kills lesser demons, perfect for the caged Lesser demon in the wizard tower.
* Does not eat.
* For educational purposes.
*
* @author Bjorn Krols (Botre)
*/
@ScriptManifest(author = "Botre", info = "Kills lesser demons", logo = "", name = "Lesser demon killer", version = 0)
public class LesserDemonKiller extends Script {
/**
* The name of the monster we will be looking for.
*/
private static final String NAME = "Lesser demon";
/**
* The current time in milliseconds, used to calculate the elapsed amount of seconds.
*/
private long startTime = System.currentTimeMillis();
/**
* The possible states of this script.
*/
private enum State {
DIALOGUE,
ATTACK,
IDLE;
}
/**
* The current state of this script.
*/
private State state = State.IDLE;
@Override
public int onLoop() throws InterruptedException {
/*
* Find the current state and react accordingly.
*/
switch (state = getState()) {
case DIALOGUE:
// Sleep for 600 - 6000 milliseconds (so it looks like we're reading the dialogue).
sleep(random.nextInt(6000) + 600);
// Click continue on any message with a continue option.
getDialogues().clickContinue();
break;
case ATTACK:
// Find the closest NPC with the name NAME.
NPC target = getNpcs().closest(NAME);
// Attack the target if it isn't null and exists.
if (target != null && target.exists() && target.interact("Attack")) {
// If the target was successfully attacked, sleep until player is animating or interacting.
new ConditionalSleep(5000, 100) {
@Override
public boolean condition() throws InterruptedException {
return myPlayer().isAnimating() || myPlayer().getInteracting() != null;
}
}.sleep(); // Don't forget the .sleep(); !
}
break;
case IDLE:
// Nothing is done here, you could add some random behavior though.
break;
}
//Sleep for 300 - 600 milliseconds every loop.
return random(300) + 300;
}
private State getState() {
// If a dialogue is pending continuation, go continue it!
if (getDialogues().isPendingContinuation()) return State.DIALOGUE;
// If we are currently attacking a monster, idle.
if (myPlayer().isAnimating() || myPlayer().getInteracting() != null) return State.IDLE;
// We are not attacking a monster, let's stop being lazy and get to work!
return State.ATTACK;
}
@Override
public void onPaint(Graphics2D g2d) {
super.onPaint(g2d);
// Set the drawing color to yellow.
g2d.setColor(Color.YELLOW);
// Draw the current state, useful for debugging.
g2d.drawString("State: " + state, 20, 250);
// Draw the elapsed amount of seconds since the script was started.
g2d.drawString("Elapsed seconds: " + (int) ((System.currentTimeMillis() - startTime) / 1000), 20, 265);
}
}