package org.rsbot.script.randoms;
import org.rsbot.script.Random;
import org.rsbot.script.ScriptManifest;
import org.rsbot.script.util.Timer;
import org.rsbot.script.wrappers.RSComponent;
import org.rsbot.script.wrappers.RSInterface;
import org.rsbot.script.wrappers.RSNPC;
import org.rsbot.script.wrappers.RSObject;
import java.awt.*;
@ScriptManifest(authors = "endoskeleton", name = "CapnArnav", version = 1)
public class CapnArnav extends Random {
private static final int[] ARNAV_CHEST = {42337, 42338};
private static final int ARNAV_ID = 2308;
private static final int EXIT_PORTAL = 11369;
private static final int[][] INTERFACE_SOLVE_IDS = {{7, 14, 21}, // BOWL
{5, 12, 19}, // RING
{6, 13, 20}, // COIN
{8, 15, 22} // BAR
};
private static final int[][] ARROWS = {{2, 3}, {9, 10}, {16, 17}};
private static final int TALK_INTERFACE = 228;
private static final int CHEST_INTERFACE_PARENT = 185;
private static final int CHEST_INTERFACE_UNLOCK = 28;
private static final int CHEST_INTERFACE_CENTER = 23;
private static enum STATE {
OPEN_CHEST, SOLVE, TALK, EXIT
}
private int index = -1;
@Override
public boolean activateCondition() {
final RSNPC captain = npcs.getNearest(ARNAV_ID);
if (captain != null) {
sleep(random(1500, 1600));
final RSObject portal = objects.getNearest(EXIT_PORTAL);
return portal != null;
}
return false;
}
@Override
public void onFinish() {
index = -1;
}
private STATE getState() {
if (objects.getNearest(ARNAV_CHEST[1]) != null) {
return STATE.EXIT;
} else if (interfaces.canContinue()
|| interfaces.get(TALK_INTERFACE) != null
&& interfaces.get(TALK_INTERFACE).isValid()) {
return STATE.TALK;
} else if (interfaces.get(CHEST_INTERFACE_PARENT) == null
|| !interfaces.get(CHEST_INTERFACE_PARENT).isValid()) {
return STATE.OPEN_CHEST;
} else {
return STATE.SOLVE;
}
}
@Override
public int loop() {
if (bank.isDepositOpen() || bank.isOpen()) {
bank.close();
}
if (!activateCondition()) {
return -1;
}
if (getMyPlayer().isMoving()) {
return random(1000, 2000);
}
switch (getState()) {
case EXIT:
final RSObject portal = objects.getNearest(EXIT_PORTAL);
if (portal != null) {
if (!portal.isOnScreen()) {
camera.turnTo(portal);
}
if (portal.interact("Enter")) {
return random(3000, 3500);
}
}
break;
case OPEN_CHEST:
final RSObject chest = objects.getNearest(ARNAV_CHEST);
if (chest != null) {
if (chest.doClick()) {
return random(1000, 1300);
}
}
break;
case TALK:
if (interfaces.canContinue()) {
interfaces.clickContinue();
return random(1500, 2000);
}
final RSComponent okay = interfaces.getComponent(TALK_INTERFACE, 3);
if (okay != null && okay.isValid()) {
okay.doClick();
}
return random(1500, 2000);
case SOLVE:
final RSInterface solver = interfaces.get(CHEST_INTERFACE_PARENT);
if (solver != null && solver.isValid()) {
final String s = solver.getComponent(32).getText();
if (s.contains("Bowl")) {
index = 0;
} else if (s.contains("Ring")) {
index = 1;
} else if (s.contains("Coin")) {
index = 2;
} else if (s.contains("Bar")) {
index = 3;
}
if (solved()) {
solver.getComponent(CHEST_INTERFACE_UNLOCK).doClick();
return random(600, 900);
}
final RSComponent container = solver
.getComponent(CHEST_INTERFACE_CENTER);
for (int i = 0; i < 3; i++) {
int rand = random(0, 100);
if (rand < 50) {
rand = 0;
} else if (rand >= 50) {
rand = 1;
}
final RSComponent target = solver
.getComponent(INTERFACE_SOLVE_IDS[index][i]);
final RSComponent arrow = solver.getComponent(ARROWS[i][rand]);
while (container.isValid()
&& target.isValid()
&& !container.getArea().contains(
new Point(target.getCenter().x + 15, target
.getCenter().y)) && arrow.isValid()
&& new Timer(10000).isRunning()) {
arrow.doClick();
sleep(random(1000, 1200));
}
}
}
}
return random(500, 800);
}
private boolean solved() {
if (index == -1) {
return false;
}
final RSInterface solver = interfaces.get(CHEST_INTERFACE_PARENT);
if (solver != null && solver.isValid()) {
final RSComponent container = solver.getComponent(CHEST_INTERFACE_CENTER);
final Point p1 = solver.getComponent(INTERFACE_SOLVE_IDS[index][0])
.getCenter();
p1.setLocation(p1.x + 15, p1.y);
final Point p2 = solver.getComponent(INTERFACE_SOLVE_IDS[index][1])
.getCenter();
p2.setLocation(p2.x + 15, p1.y);
final Point p3 = solver.getComponent(INTERFACE_SOLVE_IDS[index][2])
.getCenter();
p3.setLocation(p3.x + 15, p1.y);
return container.getArea().contains(p1)
&& container.getArea().contains(p2) && container.getArea()
.contains(p3);
}
return false;
}
}