import java.util.ArrayList;
import java.util.List;
/**
* A script for Ranging npcs with a walkback radius.
* Start script near the npc to be ranged.
*
* Parameters:
* -n ...
* -r (Default 2)
*
*
* @Author Chomp
*/
public class AA_Ranged extends AA_Script {
private static final int MAXIMUM_FATIGUE = 100;
private Coordinate startCoord;
private double initialRangedXp;
private long startTime;
private long currentTick;
private long nextTick;
private int[] npcIds;
private int radius = 2;
private boolean idle;
private boolean wait;
public AA_Ranged(final Extension ex) {
super(ex);
}
@Override
public void init(final String parameters) {
if (parameters.isEmpty()) printInstructions();
if (!hasInventoryItem(ITEM_ID_SLEEPING_BAG)) {
throw new IllegalStateException("Sleeping bag missing from inventory.");
}
final String[] args = parameters.split(" ");
final List npcIds = new ArrayList<>();
for (int i = 0; i < args.length; i++) {
switch (args[i].toLowerCase()) {
case "-n":
case "--npc":
do {
npcIds.add(Integer.parseInt(args[++i]));
} while ((i + 1 < args.length) && !args[i + 1].startsWith("-"));
break;
case "-r":
case "--radius":
radius = Integer.parseInt(args[++i]);
break;
default:
throw new IllegalArgumentException("Malformed parameters. Try again ...");
}
}
this.npcIds = npcIds.stream().distinct().mapToInt(i -> i).toArray();
startCoord = new Coordinate(getPlayerX(), getPlayerY());
initialRangedXp = getSkillExperience(Skill.RANGED.getIndex());
startTime = System.currentTimeMillis();
}
@Override
public int main() {
if (idle) {
if (isAtCoordinate(startCoord)) {
final Coordinate coordinate = getWalkableCoordinate();
if (coordinate != null) {
walkTo(coordinate.getX(), coordinate.getY());
return SLEEP_ONE_TICK;
}
}
idle = false;
}
if (getFatiguePercent() >= MAXIMUM_FATIGUE) return sleep();
if (distanceTo(startCoord.getX(), startCoord.getY()) > radius) {
walkTo(startCoord.getX(), startCoord.getY());
return SLEEP_ONE_TICK;
}
if (wait) {
if (nextTick > currentTick) return 0;
wait = false;
walkTo(getPlayerX(), getPlayerY());
return SLEEP_ONE_TICK;
}
final Object npc = getNearestNpc(npcIds, false, false);
if (npc == null) return 0;
wait = true;
nextTick = currentTick + 1;
attackNpc(npc);
return 0;
}
@Override
public void onServerMessage(final String message) {
if (message.endsWith("area")) {
idle = true;
} else if (message.endsWith("ammo!")) {
exit("Out of ammo.");
} else {
super.onServerMessage(message);
}
}
@Override
public void paint() {
int y = PAINT_OFFSET_Y;
bot.drawString("@yel@Ranged", PAINT_OFFSET_X, y, 1, 0);
bot.drawString(String.format("@yel@Runtime: @whi@%s", toDuration(startTime)),
PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT, 1, 0);
final double xpGained = getSkillExperience(Skill.RANGED.getIndex()) - initialRangedXp;
bot.drawString(String.format("@gre@Ranged Xp: @whi@%s @gre@(@whi@%s xp@gre@/@whi@hr@gre@)",
DECIMAL_FORMAT.format(xpGained), toUnitsPerHour((int) xpGained, startTime)),
PAINT_OFFSET_X, y + PAINT_OFFSET_Y_INCREMENT * 2, 1, 0);
}
@Override
public void onPlayerCoord(final int x, final int y) {
currentTick++;
}
}