Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Point;
- import java.awt.Polygon;
- import java.util.ArrayList;
- import java.util.List;
- import org.rsbot.event.listeners.PaintListener;
- import org.rsbot.script.Script;
- import org.rsbot.script.ScriptManifest;
- 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 org.rsbot.script.wrappers.RSTile;
- import org.rsbot.util.StringUtil;
- @ScriptManifest(authors = { "Equinox_" }, name = "Equinox Vinesweeper")
- public class EquinoxVinesweeper extends Script implements PaintListener {
- private static final int FLAGS_GNOME_ID = 7131;
- private static final int FURROWS_ID = 29479;
- private static final int STILE_ID = 29460;
- private static final int[] RABBIT_ID = { 7125, 7126 };
- private static final int FLAGS_ID = 12625;
- private static final int OGLEROOT_ID = 12624;
- private static final int DIG_ANIM = 8709;
- private static final int FLAG_ANIM = 8711;
- private static final int CLIMB_ANIM = 1560;
- private enum Flags {
- N_A,
- ZERO(29447),
- ONE(29448),
- TWO(29449),
- THREE(29450),
- FOUR(29451),
- FIVE(29452),
- SIX(29453),
- SEVEN(29454),
- EIGHT(29455),
- FLAG(29457),
- UNKNOWN(29476, 29477, 29478),
- SEED(29456);
- private int[] ids;
- private Flags(int... ids) {
- this.ids = ids;
- }
- public byte getVal() {
- return (byte) (ordinal() - 1);
- }
- public int[] getIDs() {
- return ids;
- }
- }
- private enum State {
- BUY_ROOTS,
- BUY_FLAGS,
- TRANS_STILE,
- FLAG_SEED,
- DIG_HOLE,
- MURDER_RABBIT,
- EXIT_CENTRAL
- }
- private int map_size = 15;
- private State state = State.DIG_HOLE;
- private MapHandler mapHandler = new MapHandler();
- private RSTile centralTile = null;
- private Point worldToMap(RSTile t) {
- RSTile cent = getCentralTile();
- return new Point(t.getX() - cent.getX() + (map_size / 2), t.getY()
- - cent.getY() + (map_size / 2));
- }
- public RSTile getCentralTile() {
- RSObject stile = objects.getNearest(STILE_ID);
- if (centralTile == null && !isCentralArea(getMyPlayer().getLocation())
- && stile != null && calc.distanceTo(stile) > map_size / 2) {
- return centralTile = getMyPlayer().getLocation();
- }
- return centralTile != null ? centralTile : getMyPlayer().getLocation();
- }
- private RSTile mapToWorld(Point p) {
- RSTile cent = getCentralTile();
- return new RSTile(p.x - (map_size / 2) + cent.getX(), p.y
- - (map_size / 2) + cent.getY());
- }
- public State getState() {
- if (inventory.getCount(true, OGLEROOT_ID) < 10) {
- if (!isCentral(getMyPlayer().getLocation())) {
- return State.TRANS_STILE;
- } else {
- return State.BUY_ROOTS;
- }
- }
- if (!inventory.contains(FLAGS_ID)) {
- if (!isCentral(getMyPlayer().getLocation())) {
- return State.TRANS_STILE;
- } else {
- return State.BUY_FLAGS;
- }
- }
- if ((getChatComponent("Yes, please") != null || interfaces
- .canContinue())
- && inventory.getCount(true, FLAGS_ID) < 10
- && isCentral(getMyPlayer().getLocation())) {
- return State.BUY_FLAGS;
- }
- if (!isCentralArea(getMyPlayer().getLocation())) {
- if (getKillRabbit() != null)
- return State.MURDER_RABBIT;
- if (mapHandler.seeds.size() > 0) {
- return State.FLAG_SEED;
- }
- return State.DIG_HOLE;
- }
- return State.EXIT_CENTRAL;
- }
- private boolean isCentral(RSTile t) {
- if (t.getX() == 1632 && (t.getY() == 4697 || t.getY() == 4711))
- return false;
- if (t.getY() == 4704 && (t.getX() == 1622 || t.getX() == 1642))
- return false;
- return t.getX() >= 1622 && t.getY() >= 4697 && t.getX() <= 1642
- && t.getY() <= 4711;
- }
- private boolean isCentralArea(RSTile t) {
- return t.getX() >= 1622 && t.getY() >= 4697 && t.getX() <= 1642
- && t.getY() <= 4711;
- }
- private RSNPC getKillRabbit() {
- RSNPC rabbit = npcs.getNearest(RABBIT_ID);
- if (rabbit != null) {
- Point p = worldToMap(rabbit.getLocation());
- if (p.x < 0 || p.y < 0 || p.x >= map_size || p.y >= map_size)
- rabbit = null;
- }
- return rabbit;
- }
- private RSObject getRSObjectAt(RSTile t) {
- RSObject[] objs = objects.getAllAt(t);
- for (RSObject o : objs) {
- for (Flags flag : Flags.values()) {
- for (int id : flag.getIDs()) {
- if (o.getID() == id) {
- return o;
- }
- }
- }
- }
- return null;
- }
- private RSObject getDig() {
- RSObject bst = null;
- double bDist = Double.MAX_VALUE;
- for (RSTile p : mapHandler.crtDig) {
- RSObject o = getRSObjectAt(p);
- if (o != null) {
- double dist = calc.distanceTo(o);
- if (dist < bDist) {
- bDist = dist;
- bst = o;
- }
- }
- }
- if (bst != null)
- return bst;
- for (RSTile p : mapHandler.likeDig) {
- RSObject o = getRSObjectAt(p);
- if (o != null) {
- double dist = calc.distanceTo(o);
- if (dist < bDist) {
- bDist = dist;
- bst = o;
- }
- }
- }
- return bst != null ? bst : objects.getNearest(Flags.UNKNOWN.getIDs());
- }
- private RSObject getSeed() {
- RSObject bst = null;
- double bDist = Double.MAX_VALUE;
- for (RSTile p : mapHandler.seeds) {
- RSObject o = getRSObjectAt(p);
- if (o != null) {
- double dist = calc.distanceTo(o);
- if (dist < bDist) {
- bDist = dist;
- bst = o;
- }
- }
- }
- return bst;
- }
- @Override
- public int loop() {
- RSObject furrows = objects.getNearest(FURROWS_ID);
- if (furrows == null) {
- log.severe("Unable to find furrows object. Are you in vinesweeper?");
- stopScript();
- }
- if (isCentralArea(getMyPlayer().getLocation())) {
- centralTile = null;
- }
- switch (state = getState()) {
- case DIG_HOLE:
- RSObject hole = getDig();
- if (hole != null) {
- if (hole.isOnScreen()) {
- hole.interact("Dig");
- for (byte b = 0; b < 50
- && getMyPlayer().getAnimation() != DIG_ANIM; b++)
- sleep(100);
- if (getMyPlayer().getAnimation() == DIG_ANIM)
- sleep(2000);
- } else {
- step(hole.getLocation());
- }
- }
- break;
- case FLAG_SEED:
- RSObject seed = getSeed();
- if (seed != null) {
- if (seed.isOnScreen()) {
- seed.interact("Flag");
- for (byte b = 0; b < 50
- && getMyPlayer().getAnimation() != FLAG_ANIM; b++)
- sleep(100);
- if (getMyPlayer().getAnimation() == FLAG_ANIM)
- sleep(2000);
- } else {
- step(seed.getLocation());
- }
- }
- break;
- case MURDER_RABBIT:
- RSNPC rabbit = getKillRabbit();
- if (rabbit != null) {
- if (rabbit.isOnScreen()) {
- if (rabbit.interact("Feed"))
- for (byte b = 0; b < 50 && rabbit.isMoving(); b++)
- sleep(100);
- } else {
- step(rabbit.getLocation());
- }
- }
- break;
- case TRANS_STILE:
- if (!isCentral(getMyPlayer().getLocation())) {
- RSObject stile = objects.getNearest(STILE_ID);
- if (stile != null) {
- if (stile.isOnScreen()) {
- if (stile.interact("Climb-over"))
- sleep(1000);
- } else {
- step(stile.getLocation());
- }
- }
- }
- break;
- case EXIT_CENTRAL:
- if (isCentral(getMyPlayer().getLocation())) {
- RSObject stile = objects.getNearest(STILE_ID);
- if (stile != null) {
- if (stile.isOnScreen()) {
- if (stile.interact("Climb-over"))
- sleep(1000);
- } else {
- step(stile.getLocation());
- }
- }
- } else {
- if (furrows != null) {
- step(furrows.getLocation());
- }
- }
- break;
- case BUY_FLAGS:
- RSComponent chatCom;
- if (interfaces.canContinue()) {
- interfaces.clickContinue();
- } else if ((chatCom = getChatComponent("Yes, please")) != null) {
- chatCom.doClick();
- } else if (isCentral(getMyPlayer().getLocation())) {
- RSNPC gnome = npcs.getNearest(FLAGS_GNOME_ID);
- if (gnome != null) {
- if (gnome.isOnScreen()) {
- if (gnome.interact("Buy-flags"))
- sleep(1000);
- } else {
- step(gnome.getLocation());
- }
- }
- }
- }
- return 250;
- }
- public Polygon getMinimapPolygon(final RSTile t) {
- if (t != null) {
- Polygon poly = new Polygon();
- Point pt = calc.tileToMinimap(t);
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToMinimap(new RSTile(t.getX(), t.getY() + 1));
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToMinimap(new RSTile(t.getX() + 1, t.getY() + 1));
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToMinimap(new RSTile(t.getX() + 1, t.getY()));
- poly.addPoint(pt.x, pt.y);
- for (int i = 0; i < poly.npoints; i++)
- if (poly.xpoints[i] < 0 || poly.ypoints[i] < 0)
- return null;
- return poly;
- }
- return null;
- }
- public RSComponent getChatComponent(String inner) {
- inner = inner.toLowerCase();
- final RSInterface[] valid = interfaces.getAll();
- for (final RSInterface iface : valid) {
- if (iface.getIndex() != 137 && iface.getIndex() != 752) {
- final int len = iface.getChildCount();
- for (int i = 0; i < len; i++) {
- final RSComponent child = iface.getComponent(i);
- if (child.getText() != null
- && child.getText().toLowerCase().contains(inner)
- && child.isValid() && child.getAbsoluteX() > 10
- && child.getAbsoluteY() > 300) {
- return child;
- }
- }
- }
- }
- return null;
- }
- public void step(RSTile t) {
- RSTile walk = getTileOnMinimap(t);
- if (walking.getDestination() == null
- || calc.distanceBetween(walking.getDestination(), walk) > 4) {
- walking.walkTileMM(walk);
- sleep(1000, 2000);
- }
- }
- public RSTile getTileOnMinimap(RSTile base) {
- if (calc.tileOnMap(base))
- return base;
- RSTile me = getMyPlayer().getLocation();
- int deltaX = base.getX() - me.getX();
- int deltaY = base.getY() - me.getY();
- double dist = calc.distanceBetween(base, me);
- double eX = deltaX / dist, eY = deltaY / dist;
- return new RSTile(me.getX() + (int) (eX * 15), me.getY()
- + (int) (eY * 15));
- }
- public Polygon getScreenPolygon(final RSTile t) {
- if (t != null) {
- Polygon poly = new Polygon();
- Point pt = calc.tileToScreen(t, 0, 0, 0);
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToScreen(t, 0, 1, 0);
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToScreen(t, 1, 1, 0);
- poly.addPoint(pt.x, pt.y);
- pt = calc.tileToScreen(t, 1, 0, 0);
- poly.addPoint(pt.x, pt.y);
- for (int i = 0; i < poly.npoints; i++)
- if (poly.xpoints[i] < 0 || poly.ypoints[i] < 0)
- return null;
- return poly;
- }
- return null;
- }
- @Override
- public void onRepaint(Graphics render) {
- for (RSTile tile : mapHandler.seeds) {
- render.setColor(new Color(1f, 0f, 0f, 0.5f));
- Polygon p = getMinimapPolygon(tile);
- if (p != null)
- render.fillPolygon(p);
- render.setColor(new Color(1f, 0f, 0f, 0.25f));
- p = getScreenPolygon(tile);
- if (p != null)
- render.fillPolygon(p);
- }
- for (RSTile tile : mapHandler.crtDig) {
- render.setColor(new Color(0f, 1f, 0f, 0.5f));
- Polygon p = getMinimapPolygon(tile);
- if (p != null)
- render.fillPolygon(p);
- render.setColor(new Color(0f, 1f, 0f, 0.25f));
- p = getScreenPolygon(tile);
- if (p != null)
- render.fillPolygon(p);
- }
- RSNPC rabbit = getKillRabbit();
- if (rabbit != null) {
- RSTile rLoc = rabbit.getLocation();
- render.setColor(Color.BLUE);
- Polygon p = getMinimapPolygon(rLoc);
- if (p != null)
- render.fillPolygon(p);
- p = getScreenPolygon(rLoc);
- render.setColor(new Color(0f, 0f, 1f, 0.5f));
- if (p != null)
- render.fillPolygon(p);
- }
- if (centralTile != null) {
- render.setColor(Color.BLACK);
- Polygon p = getMinimapPolygon(centralTile);
- if (p != null)
- render.fillPolygon(p);
- }
- StringUtil.drawLine(render, 2, "State: " + state.name());
- }
- private class MapHandler extends Thread {
- private byte[][] map = new byte[map_size][map_size];
- private List<RSTile> crtDig = new ArrayList<RSTile>();
- private List<RSTile> likeDig = new ArrayList<RSTile>();
- private List<RSTile> seeds = new ArrayList<RSTile>();
- private List<RSTile> getSeeds(byte[][] map, int x, int y) {
- if (x > 0 && y > 0 && x < map_size - 1 && y < map_size - 1) {
- int cnt = 0;
- List<RSTile> successors = new ArrayList<RSTile>();
- for (int xD = -1; xD <= 1; xD++)
- for (int yD = -1; yD <= 1; yD++) {
- byte val = map[x + xD][y + yD];
- if (val == Flags.UNKNOWN.getVal()) {
- successors
- .add(mapToWorld(new Point(x + xD, y + yD)));
- cnt++;
- } else if (val == Flags.FLAG.getVal()
- || val == Flags.SEED.getVal()) {
- cnt++;
- }
- }
- if (cnt == map[x][y]) {
- return successors;
- }
- }
- return new ArrayList<RSTile>();
- }
- private List<RSTile> getMapSeeds(byte[][] map) {
- List<RSTile> pts = new ArrayList<RSTile>();
- for (int x = 0; x < map_size; x++) {
- out: for (int y = 0; y < map_size; y++) {
- Point p = new Point(x, y);
- byte dVal = map[p.x][p.y];
- if (dVal >= Flags.ONE.getVal()
- && dVal <= Flags.EIGHT.getVal()) {
- List<RSTile> successors = getSeeds(map, p.x, p.y);
- for (RSTile pt : successors) {
- if (!pts.contains(pt))
- pts.add(pt);
- }
- } else if (dVal == Flags.UNKNOWN.getVal()) {
- if (!pts.contains(p)) {
- for (int xD = p.x - 1; xD <= p.x + 1; xD++) {
- for (int yD = p.y - 1; yD <= p.y + 1; yD++) {
- List<RSTile> successors = getSeeds(map, xD,
- yD);
- for (RSTile pt : successors) {
- if (!pts.contains(pt))
- pts.add(pt);
- }
- if (pts.contains(p)) {
- continue out;
- }
- }
- }
- }
- }
- }
- }
- return pts;
- }
- private List<RSTile> getMapLikelyDig(byte[][] map, List<RSTile> crtDig) {
- List<RSTile> pts = new ArrayList<RSTile>();
- for (int x = 1; x < map_size - 1; x++)
- out: for (int y = 1; y < map_size - 1; y++) {
- if (map[x][y] == Flags.UNKNOWN.getVal()) {
- for (int xD = -1; xD <= 1; xD++)
- for (int yD = -1; yD <= 1; yD++) {
- byte val = map[x + xD][y + yD];
- if (val != Flags.UNKNOWN.getVal()) {
- continue out;
- }
- }
- RSTile p = mapToWorld(new Point(x, y));
- if (!pts.contains(p) && !crtDig.contains(p))
- pts.add(p);
- }
- }
- return pts;
- }
- private List<RSTile> getMapCertainDig(byte[][] map, List<RSTile> seeds) {
- List<RSTile> pts = new ArrayList<RSTile>();
- for (int x = 0; x < map_size; x++) {
- for (int y = 0; y < map_size; y++) {
- Point p = new Point(x, y);
- byte dVal = map[p.x][p.y];
- if (dVal >= Flags.ZERO.getVal()
- && dVal < Flags.EIGHT.getVal()) {
- for (int xD = p.x - 1; xD <= p.x + 1; xD++) {
- for (int yD = p.y - 1; yD <= p.y + 1; yD++) {
- if (seeds.contains(new Point(xD, yD))) {
- dVal--;
- }
- }
- }
- }
- if (dVal <= 0) {
- for (int xD = p.x - 1; xD <= p.x + 1; xD++) {
- for (int yD = p.y - 1; yD <= p.y + 1; yD++) {
- if (xD >= 0 && yD >= 0 && xD < map_size
- && yD < map_size) {
- byte val = map[xD][yD];
- Point pt = new Point(xD, yD);
- if (val == Flags.UNKNOWN.getVal()
- && !seeds.contains(pt)) {
- if (!pts.contains(pt))
- pts.add(mapToWorld(pt));
- }
- }
- }
- }
- }
- }
- }
- return pts;
- }
- private byte[][] updateMap() {
- byte[][] map = new byte[map_size][map_size];
- List<RSTile> update = new ArrayList<RSTile>();
- for (int x = 0; x < map_size; x++) {
- main: for (int y = 0; y < map_size; y++) {
- RSTile tile = mapToWorld(new Point(x, y));
- RSObject[] objs = objects.getAllAt(tile);
- for (RSObject o : objs) {
- for (Flags flag : Flags.values()) {
- for (int id : flag.getIDs()) {
- if (o.getID() == id) {
- if (map[x][y] != flag.getVal())
- update.add(mapToWorld(new Point(x, y)));
- map[x][y] = flag.getVal();
- continue main;
- }
- }
- }
- }
- if (map[x][y] != Flags.N_A.getVal())
- update.add(mapToWorld(new Point(x, y)));
- map[x][y] = Flags.N_A.getVal();
- }
- }
- return update.size() > 0 ? map : null;
- }
- @Override
- public void run() {
- while (isRunning()) {
- if (!isPaused()) {
- byte[][] n_map = updateMap();
- if (n_map != null) {
- List<RSTile> seeds = getMapSeeds(n_map);
- List<RSTile> crtDig = getMapCertainDig(n_map, seeds);
- List<RSTile> likeDig = getMapLikelyDig(n_map, crtDig);
- this.map = n_map;
- this.seeds = seeds;
- this.crtDig = crtDig;
- this.likeDig = likeDig;
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment