Skip to content

Instantly share code, notes, and snippets.

@xcvd
Created April 5, 2012 22:58
Show Gist options
  • Save xcvd/2314842 to your computer and use it in GitHub Desktop.
Save xcvd/2314842 to your computer and use it in GitHub Desktop.
Goat Horn Crusher
/* )............( /
/ / ___/| \ /
/ | /o \/| | /
/ | \_____/\| | /
/ \ -xcvd- / /
/ ')__________(' */
import org.powerbot.concurrent.Task;
import org.powerbot.concurrent.strategy.Strategy;
import org.powerbot.game.api.ActiveScript;
import org.powerbot.game.api.Manifest;
import org.powerbot.game.api.methods.Widgets;
import org.powerbot.game.api.methods.input.Mouse;
import org.powerbot.game.api.methods.interactive.NPCs;
import org.powerbot.game.api.methods.node.Menu;
import org.powerbot.game.api.methods.tab.Inventory;
import org.powerbot.game.api.methods.widget.Camera;
import org.powerbot.game.api.util.Filter;
import org.powerbot.game.api.util.Random;
import org.powerbot.game.api.util.Time;
import org.powerbot.game.api.wrappers.interactive.NPC;
import org.powerbot.game.api.wrappers.node.Item;
import org.powerbot.game.api.wrappers.widget.WidgetChild;
import org.powerbot.game.bot.event.listener.PaintListener;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
/*
* Grinds chocolate at the GE
* Start near any GE bank
*
* @author xcvd
*/
@Manifest(name = "Goat Horn Crusher", description = "Grinds goat horns. Start near a bank at the GE with pestle and mortar in toolbelt.", version = 1.1d, authors = {"xcvd"}, website="http://www.powerbot.org/community/topic/672724-xcvds-vial-filler-40-60k-an-hour/")
public class GoatHornCrusher extends ActiveScript implements PaintListener {
private static final int ITEM_ID_GOAT_HORN = 9735;
private static final int ITEM_ID_CRUSHED_GOAT_HORN = 9736;
private static int hornsGround = 0, profit = 0;
private static long startTime = System.currentTimeMillis();
private static BufferedImage paintBackground;
private static Font georgia = new Font("Georgia", Font.PLAIN, 18);
@Override
protected void setup() {
provide(new ClickBank());
provide(new DoBank());
provide(new GrindChocolate());
try {
paintBackground = ImageIO.read(new URL("http://localhostr.com/file/8XUiNiF/GoatHorn.png"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private final class ClickBank extends Strategy implements Task {
@Override
public boolean validate() {
for(Item i: Inventory.getItems())
{
if(i.getId() != ITEM_ID_GOAT_HORN)
return true;
}
return Inventory.getCount() != 28;
}
@Override
public void run() {
if(Camera.getYaw() > 50)
Camera.setNorth();
Bank.open();
Time.sleep(Random.nextInt(900, 1500));
while(!Bank.isOpen())
{
Bank.open();
Time.sleep(Random.nextInt(900, 1500));
}
}
}
private final class DoBank extends Strategy implements Task {
@Override
public boolean validate() {
return Bank.isOpen();
}
@Override
public void run() {
Time.sleep(Random.nextInt(900, 1500));
while(Inventory.getCount() > 0)
{
Bank.depositAll();
Time.sleep(Random.nextInt(900, 1500));
}
Bank.withdraw(ITEM_ID_GOAT_HORN, 0);
Bank.close();
Time.sleep(Random.nextInt(500, 1000));
while(Widgets.get(762, 1).isOnScreen())
{
Bank.close();
Time.sleep(Random.nextInt(500, 1000));
}
}
}
private final class GrindChocolate extends Strategy implements Task {
private static final int WIDGET_INTERACT = 905;
private static final int WIDGET_INTERACT_ITEM = 14;
@Override
public boolean validate() {
for(Item i:Inventory.getItems()) {
if(i.getId() != ITEM_ID_GOAT_HORN)
return false;
}
return true;
}
@Override
public void run() {
Time.sleep(Random.nextInt(100, 300));
Inventory.getItems()[0].getWidgetChild().interact("Grind");
Time.sleep(Random.nextInt(600, 1000));
while(!Widgets.get(WIDGET_INTERACT).getChild(WIDGET_INTERACT_ITEM).isOnScreen())
Time.sleep(40);
Widgets.get(WIDGET_INTERACT).getChild(WIDGET_INTERACT_ITEM).click(true);
int sleepTime = 0;
while(Inventory.getCount(new Filter<Item>() { public boolean accept(final Item n)
{
return n.getId() == ITEM_ID_CRUSHED_GOAT_HORN;
}}) < 28)
{
Time.sleep(500);
sleepTime += 500;
// crappy failsafe since Players.getLocal().getAnimation() seems to always return -1
if(sleepTime % 5000 == 0 && Inventory.getCount(ITEM_ID_CRUSHED_GOAT_HORN) == 0) {
Inventory.getItems()[0].getWidgetChild().interact("Grind");
Time.sleep(Random.nextInt(600, 1000));
Widgets.get(WIDGET_INTERACT).getChild(WIDGET_INTERACT_ITEM).click(true);
}
}
hornsGround += 28;
profit += (28 * 132);
}
}
public static class Bank {
private static final int[] NPC_ID_BANKERS = {3416, 3418, 3293, 2718, 3293, 3416, 2718, 3418};
private static final int WIDGET_BANK = 762;
private static final int WIDGET_BANK_INVENTORY = 95;
private static final int WIDGET_CHILD_DEPOSIT_ALL = 34;
private static final int WIDGET_CHILD_CLOSE = 45;
public static boolean isOpen() {
return Widgets.get(WIDGET_BANK, 1).isOnScreen();
}
public static boolean open() {
final NPC banker = NPCs.getNearest(new Filter<NPC>() {
public boolean accept(final NPC banker) {
return banker != null && Arrays.binarySearch(NPC_ID_BANKERS, banker.getId()) != -1;
}
});
return banker != null && banker.interact("Bank");
}
public static boolean depositAll() {
return isOpen() && Widgets.get(WIDGET_BANK).getChild(WIDGET_CHILD_DEPOSIT_ALL).click(true);
}
public static boolean withdraw(final int itemId, int amount) {
final WidgetChild item = getItemWidgetChild(itemId);
if(item != null) {
final int bankSlotX = Widgets.get(WIDGET_BANK).getChild(WIDGET_BANK_INVENTORY).getRelativeX() + item.getRelativeX();
final int bankSlotY = Widgets.get(WIDGET_BANK).getChild(WIDGET_BANK_INVENTORY).getRelativeY() + item.getRelativeY();
if(Mouse.click(bankSlotX + (item.getWidth() / 2), bankSlotY + (item.getHeight() / 2), false)) {
if(amount > 0)
return Menu.isOpen() && Menu.select("Withdraw-" + amount);
else
return Menu.isOpen() && Menu.select("Withdraw-All");
}
}
return false;
}
private static WidgetChild getItemWidgetChild(int id) {
WidgetChild item = null;
for(WidgetChild i:Widgets.get(WIDGET_BANK).getChild(WIDGET_BANK_INVENTORY).getChildren())
{
if(new Item(i).getId() == id)
{
item = i;
break;
}
}
return item;
}
private static boolean close() {
return Widgets.get(WIDGET_BANK).getChild(WIDGET_CHILD_CLOSE).click(true);
}
}
public void onRepaint(final Graphics render) {
Graphics2D g2 = (Graphics2D)render;
g2.drawImage(paintBackground, 8, 345, null);
g2.setFont(georgia);
g2.setColor(Color.getHSBColor(0.616666667f, 0.05f, 0.46f));
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g2.drawString("HORNS GROUND: " + hornsGround, 14, 410);
g2.drawString("TOTAL PROFIT: " + profit, 14, 442);
long timeNow = System.currentTimeMillis();
g2.drawString("TIME RUNNING: " + (int)(timeNow-startTime)/3600000 + ":" + (int)((timeNow-startTime)-(((timeNow-startTime)/3600000)*3600000))/60000 + ":" + (int)((timeNow-startTime)-(((timeNow-startTime)/3600000)*3600000)-(((timeNow-startTime)-(((timeNow-startTime)/3600000)*3600000))/60000)*60000)/1000, 220, 410);
g2.drawString("PROFIT/HOUR: " + (int)(((double)profit/(double)(timeNow-startTime))*3600000), 220, 442);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment