import com.aposbot.Constants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Withdraws items from bank and drops them.
* Start script at Shantay Bank Chest.
* If no parameters are passed, all items will be dropped.
*
* Parameters (Optional)
* id1,id2,id3...
*
*
* @Author Chomp
*/
public class AA_BankItemDropper extends AA_Script {
private static final Coordinate COORDINATE_BANK_CHEST = new Coordinate(58, 731);
private Iterator itemIds;
private long startTime;
private long bankOpenTimeout;
private int itemId;
private int remaining;
private int dropped;
private int prevY;
private boolean idle;
private boolean initialized;
public AA_BankItemDropper(final Extension ex) {
super(ex);
}
@Override
public void init(final String parameters) {
if (!parameters.isEmpty()) {
itemIds = Arrays.stream(parameters.split(",")).mapToInt(Integer::parseInt).iterator();
itemId = itemIds.next();
initialized = true;
}
startTime = System.currentTimeMillis();
}
@Override
public int main() {
if (isInventoryEmpty()) return bank();
if (idle) return idle();
return 0;
}
@Override
public void paint() {
int y = PAINT_OFFSET_Y;
bot.drawString("@yel@Bank Item Dropper", 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);
bot.drawString(String.format("@yel@Item: @whi@%s", getItemName(itemId)),
PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT * 2, 1, 0);
if (remaining <= 0) return;
bot.drawString(String.format("@yel@Remaining: @whi@%d", remaining),
PAINT_OFFSET_X, y + PAINT_OFFSET_Y_INCREMENT * 2, 1, 0);
}
@Override
public void onServerMessage(final String message) {
if (message.endsWith("men.") || message.endsWith("you.")) {
bankOpenTimeout = System.currentTimeMillis() + TIMEOUT_FIVE_SECONDS;
} else if (message.endsWith("area")) {
idle = true;
prevY = getPlayerY();
} else {
super.onServerMessage(message);
}
}
@Override
public void onPlayerCoord(final int x, final int y) {
if (isInventoryEmpty() || idle) return;
dropItem(0);
}
private int bank() {
if (!isBankOpen()) return openShantayBank();
if (!initialized) parseBank();
remaining = getBankItemIdCount(itemId);
if (remaining == 0) {
if (!itemIds.hasNext()) return exit("Out of items to drop.");
itemId = itemIds.next();
return 0;
}
final int withdrawAmount = Math.min(remaining, MAX_INVENTORY_SIZE);
withdraw(itemId, withdrawAmount);
closeBank();
dropped += withdrawAmount;
return SLEEP_THREE_SECONDS;
}
private int openShantayBank() {
if (System.currentTimeMillis() <= bankOpenTimeout) return 0;
if (getPlayerX() - COORDINATE_BANK_CHEST.getX() > 1) {
walkTo(COORDINATE_BANK_CHEST.getX() + 1, COORDINATE_BANK_CHEST.getY());
return SLEEP_ONE_TICK;
}
bot.createPacket(Constants.OP_OBJECT_ACTION1);
bot.put2(COORDINATE_BANK_CHEST.getX());
bot.put2(COORDINATE_BANK_CHEST.getY());
bot.finishPacket();
bankOpenTimeout = System.currentTimeMillis() + TIMEOUT_TWO_SECONDS;
return 0;
}
private void parseBank() {
if (bot.getBankSize() == 0) {
exit("Bank is empty!");
return;
}
final List itemIds = new ArrayList<>();
for (int i = 0; i < bot.getBankSize(); i++) {
itemIds.add(bot.getBankId(i));
}
this.itemIds = itemIds.iterator();
itemId = this.itemIds.next();
initialized = true;
}
private int idle() {
if (getPlayerY() != prevY) {
idle = false;
return 0;
}
if (prevY == COORDINATE_BANK_CHEST.getY()) {
walkTo(COORDINATE_BANK_CHEST.getX() + 1, COORDINATE_BANK_CHEST.getY() + 1);
} else {
walkTo(COORDINATE_BANK_CHEST.getX() + 1, COORDINATE_BANK_CHEST.getY());
}
return SLEEP_ONE_TICK;
}
}