Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.Point;
- import java.awt.Polygon;
- import java.awt.Rectangle;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.ArrayList;
- import javax.swing.GroupLayout;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.LayoutStyle;
- import org.rsbot.event.listeners.PaintListener;
- import org.rsbot.script.Script;
- import org.rsbot.script.ScriptManifest;
- import org.rsbot.script.methods.Bank;
- import org.rsbot.script.wrappers.RSComponent;
- import org.rsbot.script.wrappers.RSInterface;
- import org.rsbot.script.wrappers.RSModel;
- import org.rsbot.script.wrappers.RSNPC;
- import org.rsbot.script.wrappers.RSObject;
- import org.rsbot.script.wrappers.RSPlayer;
- import org.rsbot.script.wrappers.RSTile;
- @ScriptManifest(authors={"Marneus901"}, name="Runite Miner", version=0.2, description="")
- public class MarneusRunite extends Script
- implements PaintListener
- {
- public long runTime = 0L;
- public long millis;
- public long hours;
- public long minutes;
- public long seconds;
- public int currentLevel = -1;
- public int startXP = -1;
- public double currentXP = -1.0D;
- public int startLevel = -1;
- public RSObject objectToDisplay;
- public RSTile tileToWalkTo;
- public boolean shuttingDown = false;
- public boolean PAUSE = false;
- public long idleTime;
- public boolean stop = false;
- public TheWalker theWalker = new TheWalker();
- public LoginBot loginBot = new LoginBot();
- public GUI gui = new GUI();
- public boolean displayDebug = true;
- public int expTillLevel = 0;
- public static final int[] BankChests = { 27663, 4483, 12308, 21301, 42192 };
- public static final int[] validWorlds = { 2, 6, 9, 12, 15, 22, 23, 24, 27, 28,
- 31, 36, 39, 42, 44, 45, 46, 48, 51, 52,
- 53, 54, 58, 59, 60, 64, 66, 67, 68,
- 69, 70, 71, 76, 77, 78, 79, 82, 83, 84,
- 88, 89, 91, 92, 97, 98, 99, 100, 103, 104,
- 112, 115, 116, 117, 119, 129, 130, 131,
- 132, 138, 142, 143, 144, 145, 148, 151, 156,
- 157, 158, 159, 160, 164, 166 };
- public static final int[] allWorlds = { 1, 2, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32,
- 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48,
- 49, 50, 51, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 64, 65,
- 66, 67, 68, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 91, 92, 93, 96, 97, 98, 99,
- 100, 102, 103, 104, 105, 106, 108, 112,
- 113, 114, 115, 116, 117, 118, 119, 120,
- 121, 123, 124, 129, 130, 131, 132, 134,
- 135, 136, 137, 138, 139, 141, 142, 143,
- 144, 145, 148, 149, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 164,
- 165, 166, 167, 169 };
- public int worldToSwitchTo = -1;
- public static int welcomeScreenTabTextureID = 2629;
- public static int clickHereToPlayID = 145;
- public static int worldSelectTabID = 197;
- public static int worldInterfaceID = 76;
- public static int playersInterfaceID = 70;
- public static int scrollbarID = 85;
- public static int worldSwitchCheckID = 10;
- public static int faladorTabID = 8009;
- public static int runeOreID = 451;
- public static int sapphireID = 1623;
- public static int emeraldID = 1621;
- public static int rubyID = 1619;
- public static int diamondID = 1617;
- public static int runePickaxeID = 1275;
- public static int dragonPickaxeID = 15259;
- public int[] runeRockIDs = { 33078, 33079 };
- public int miningAnimation = 624;
- public int oresMined = 0;
- public RSTile[] bankToRunePath1 = { new RSTile(2946, 3373), new RSTile(2952, 3378), new RSTile(2958, 3383), new RSTile(2964, 3388),
- new RSTile(2965, 3394), new RSTile(2965, 3399), new RSTile(2964, 3404), new RSTile(2960, 3410), new RSTile(2958, 3416),
- new RSTile(2952, 3421), new RSTile(2948, 3426), new RSTile(2948, 3431), new RSTile(2948, 3436), new RSTile(2948, 3442),
- new RSTile(2945, 3447), new RSTile(2939, 3451) };
- public RSTile[] bankToRunePath2 = { new RSTile(2929, 3451), new RSTile(2922, 3454), new RSTile(2915, 3456), new RSTile(2909, 3456),
- new RSTile(2902, 3456), new RSTile(2897, 3462), new RSTile(2897, 3468), new RSTile(2898, 3473), new RSTile(2900, 3479),
- new RSTile(2903, 3484), new RSTile(2905, 3489), new RSTile(2905, 3495), new RSTile(2905, 3502), new RSTile(2904, 3507),
- new RSTile(2903, 3510) };
- public RSTile[] bankToRunePath3 = { new RSTile(2900, 9910), new RSTile(2910, 9913), new RSTile(2922, 9912), new RSTile(2933, 9910), new RSTile(2934, 9902), new RSTile(2935, 9893), new RSTile(2938, 9884) };
- public RSTile[] runeToBankPath = new RSTile[0];
- public String getName()
- {
- return "Runite Miner"; }
- public String getAuthor() { return "Marneus901"; }
- public double getVersion() { return 0.1D;
- }
- public int getMouseSpeed()
- {
- return 0;
- }
- public boolean open() {
- try {
- if (this.menu.isOpen()) {
- this.mouse.moveSlightly();
- wait(random(20, 30));
- }
- RSObject bankBooth = this.objects.getNearest(Bank.BANK_BOOTHS);
- RSNPC banker = this.npcs.getNearest(Bank.BANKERS);
- RSObject bankChest = this.objects.getNearest(BankChests);
- int lowestDist = this.calc.distanceTo(bankBooth);
- if ((banker != null) && (this.calc.distanceTo(banker) < lowestDist)) {
- lowestDist = this.calc.distanceTo(banker);
- bankBooth = null;
- }
- if ((bankChest != null) && (this.calc.distanceTo(bankChest) < lowestDist)) {
- bankBooth = null;
- banker = null;
- }
- if (((bankBooth != null) && (this.calc.distanceTo(bankBooth) < 8) &&
- (this.calc.tileOnMap(bankBooth.getLocation())) &&
- (this.calc.canReach(bankBooth.getLocation(), true))) || ((banker != null) &&
- (this.calc.distanceTo(banker) < 8) &&
- (this.calc.tileOnMap(banker.getLocation())) &&
- (this.calc.canReach(banker.getLocation(), true))) || (
- (bankChest != null) &&
- (this.calc.distanceTo(bankChest) < 8) &&
- (this.calc.tileOnMap(bankChest.getLocation())) &&
- (this.calc.canReach(bankChest.getLocation(), true)) && (!this.bank.isOpen()))) {
- if (bankBooth != null) {
- this.objectToDisplay = bankBooth;
- bankBooth.doAction("Use-Quickly");
- sleep(random(200, 400));
- } else if (banker != null) {
- banker.doAction("Bank ");
- sleep(random(200, 400));
- } else if (bankChest != null) {
- this.objectToDisplay = bankChest;
- bankChest.doAction("Use");
- sleep(random(200, 400));
- }
- } else {
- if (bankBooth != null) {
- this.walking.walkTileMM(bankBooth.getLocation(), 1, 1);
- while (this.calc.distanceTo(this.walking.getDestination()) > 8) {
- sleep(random(200, 400));
- }
- return open();
- }if (banker != null) {
- this.walking.walkTileMM(banker.getLocation(), 1, 1);
- while (this.calc.distanceTo(this.walking.getDestination()) > 8) {
- sleep(random(200, 400));
- }
- return open();
- }if (bankChest != null) {
- this.walking.walkTileMM(bankChest.getLocation(), 1, 1);
- while (this.calc.distanceTo(this.walking.getDestination()) > 8) {
- sleep(random(200, 400));
- }
- return open();
- }
- }
- return this.bank.isOpen();
- } catch (Exception e) {
- e.printStackTrace();
- }return false;
- }
- public boolean onStart() {
- this.mouse.setSpeed(getMouseSpeed());
- this.runTime = System.currentTimeMillis();
- this.gui.setVisible(true);
- return true;
- }
- public void onFinish() {
- this.gui.setVisible(false);
- }
- public Point[] getObjectModelPoints(RSTile t) {
- ArrayList pts = new ArrayList();
- for (RSObject o : this.objects.getAllAt(t)) {
- RSModel model = o.getModel();
- if (model != null) {
- for (Polygon polygon : model.getTriangles()) {
- for (int i = 0; i < polygon.npoints; i++)
- pts.add(new Point(polygon.xpoints[i], polygon.ypoints[i]));
- }
- }
- }
- if (pts.size() < 1) return new Point[0];
- Point[] rtnPts = new Point[pts.size()];
- for (int i = 0; i < pts.size(); i++)
- rtnPts[i] = ((Point)pts.get(i));
- return rtnPts;
- }
- public int loop() {
- String returnText = this.interfaces.get(906).getComponent(221).getText().toLowerCase();
- if (returnText.contains("full")) {
- log("World is full. Switching worlds.");
- this.worldToSwitchTo = -1;
- this.interfaces.get(906).getComponent(228).doClick();
- return 1000;
- }
- if (returnText.contains("logged out")) {
- log("Odd login glitch. Fixing then sleeping for 1-30min.");
- this.worldToSwitchTo = -1;
- for (int i = 0; i < 20; i++) {
- if (!this.interfaces.get(906).getComponent(221).isValid()) {
- break;
- }
- this.interfaces.get(906).getComponent(228).doClick();
- sleep(random(100, 250));
- }
- sleep(1000);
- this.game.logout(false);
- int sleepTime = random(60000, 1800000);
- log("Sleeping for " + sleepTime + " milliseconds");
- for (int i = sleepTime / 30000 + 30000; i > 60; i--) {
- log("Sleeping for about " + i * 30000 + " milliseconds");
- sleep(30000);
- }
- return 1000;
- }
- if (returnText.contains("members-only")) {
- log("Wrong world selected. Fixing.");
- this.worldToSwitchTo = -1;
- this.interfaces.get(906).getComponent(228).doClick();
- return 1000;
- }
- if (returnText.contains("transferred"))
- return 10;
- if (this.game.getClientState() == 7) {
- if (this.worldToSwitchTo == -1)
- this.worldToSwitchTo = random(0, validWorlds.length);
- switchToWorld(validWorlds[this.worldToSwitchTo]);
- return 10;
- }
- if (this.game.isLoggedIn()) {
- if (this.startLevel == -1) {
- this.startLevel = this.skills.getCurrentLevel(14);
- this.startXP = this.skills.getCurrentExp(14);
- }
- if (this.interfaces.getComponent(740, 3).isValid()) {
- this.interfaces.getComponent(740, 3).doClick();
- }
- if (this.inventory.isFull()) {
- if (this.inventory.contains(faladorTabID)) {
- bankUsingFallyTab();
- }
- }
- else
- {
- walkToHerosGuild();
- }
- return 10;
- }
- if (this.loginBot.activateCondition()) {
- int sleep = this.loginBot.loop();
- if (sleep == -1) return 10;
- return sleep;
- }
- return 10;
- }
- public boolean insideHeroGuild() {
- RSTile myPlayerLoc = this.players.getMyPlayer().getLocation();
- return ((myPlayerLoc.getX() < 2902) && (myPlayerLoc.getX() > 2898) &&
- (myPlayerLoc.getY() < 3513) && (myPlayerLoc.getY() > 3508)) || (
- (myPlayerLoc.getX() > 2891) && (myPlayerLoc.getX() < 2899) &&
- (myPlayerLoc.getY() > 3506) && (myPlayerLoc.getY() < 3515));
- }
- public void walkToHerosGuild() {
- if (this.players.getMyPlayer().getLocation().getY() > 9000) {
- if (this.calc.tileOnScreen(new RSTile(2939, 9883))) {
- RSObject runeRock = this.objects.getNearest(this.runeRockIDs);
- if (runeRock == null) {
- log("No runite on this world.");
- this.game.logout(true);
- for (int i = 0; i < 20; i++) {
- if (!this.game.isLoggedIn()) {
- this.worldToSwitchTo = -1;
- sleep(3000);
- return;
- }
- sleep(100, 200);
- }
- return;
- }
- this.objectToDisplay = runeRock;
- Point[] runePts = getObjectModelPoints(runeRock.getLocation());
- if (runePts.length == 0) return;
- this.mouse.move(runePts[random(0, runePts.length)]);
- sleep(random(50, 150));
- int invCount = this.inventory.getCount(new int[] { runeOreID });
- this.mouse.click(true);
- for (int i = 0; i < 20; i++) {
- if (!this.players.getMyPlayer().isIdle()) {
- log("Attempting to get the rune from the rock.");
- for (int k = 0; k < 20; k++) {
- if (this.objects.getNearest(new int[] { runeRock.getID() }) == null) {
- if (this.inventory.getCount(new int[] { runeOreID }) > invCount) {
- log("You mined some rune.");
- this.oresMined += 1;
- }
- else {
- log("Someone else got the rune ore.");
- }return;
- }
- if (!this.players.getMyPlayer().isIdle())
- k = 0;
- sleep(300, 500);
- }
- return;
- }
- sleep(75, 150);
- }
- return;
- }
- walkPath(this.bankToRunePath3);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().isMoving()) {
- log("Walking to next tile on path to runite.");
- return;
- }
- sleep(100, 250);
- }
- return;
- }
- if (insideHeroGuild()) {
- if (this.objects.getNearest(new int[] { 1754 }) != null) if (this.objects.getNearest(new int[] { 1754 }).isOnScreen()) {
- this.objectToDisplay = this.objects.getTopAt(new RSTile(2892, 3507));
- Point[] ladderPts = getObjectModelPoints(new RSTile(2892, 3507));
- if (ladderPts.length == 0) return;
- this.mouse.move(ladderPts[random(0, ladderPts.length)]);
- if ((this.menu.getActions() == null) || (!this.menu.getActions()[0].contains("Climb"))) return;
- sleep(random(50, 150));
- this.mouse.click(true);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().getLocation().getY() > 9000) {
- log("Climbed down ladder.");
- return;
- }
- sleep(75, 150);
- }
- return;
- }
- this.walking.walkTileMM(new RSTile(2894, 3509));
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().isMoving()) {
- log("Walked to ladder.");
- return;
- }
- sleep(150, 300);
- }
- return;
- }
- if (this.objects.getNearest(new int[] { 2624 }) != null)
- if (this.objects.getNearest(new int[] { 2624 }).isOnScreen()) {
- this.objectToDisplay = this.objects.getNearest(new int[] { 2624 });
- Point[] doorPts = getObjectModelPoints(new RSTile(2902, 3510));
- if (doorPts.length == 0) return;
- this.mouse.move(doorPts[random(0, doorPts.length)]);
- if ((this.menu.getActions() == null) || (!this.menu.getActions()[0].contains("Open"))) return;
- sleep(random(50, 150));
- this.mouse.click(true);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().getLocation().equals(new RSTile(2901, 3510))) {
- log("Heros Guild Door opened.");
- return;
- }
- sleep(75, 150);
- }
- }
- if ((this.players.getMyPlayer().getLocation().getX() < 2945) &&
- (this.players.getMyPlayer().getLocation().getY() > 3445)) {
- if (this.objects.getNearest(new int[] { 28690, 28691 }) == null) {
- walkPath(this.bankToRunePath2);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().isMoving()) {
- log("Walking to next tile on path to runite.");
- return;
- }
- sleep(100, 250);
- }
- return;
- }
- }
- this.objectToDisplay = this.objects.getTopAt(new RSTile(2936, 3451));
- Point[] doorPts = getObjectModelPoints(new RSTile(2936, 3451));
- if (doorPts.length > 0) {
- this.mouse.move(doorPts[random(0, doorPts.length)]);
- if ((this.menu.getActions() == null) || (!this.menu.getActions()[0].contains("Open"))) return;
- sleep(random(50, 150));
- this.mouse.click(true);
- for (int i = 0; i < 20; i++) {
- if (this.objects.getNearest(new int[] { 28690, 28691 }) == null) {
- log("Taverly door opened.");
- return;
- }
- sleep(75, 150);
- }
- }
- walkPath(this.bankToRunePath1);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().isMoving()) {
- log("Walking to next tile on path to runite.");
- return;
- }
- sleep(100, 250);
- }
- }
- public void bankUsingFallyTab()
- {
- if (this.bank.isOpen()) {
- for (int i = 0; i < 20; i++) {
- this.bank.depositAllExcept(new int[] { faladorTabID, runePickaxeID, dragonPickaxeID });
- sleep(250, 500);
- if (this.inventory.getCountExcept(new int[] { faladorTabID, runePickaxeID, dragonPickaxeID }) == 0)
- return;
- }
- return;
- }
- if ((2948 > this.players.getMyPlayer().getLocation().getX()) &&
- (this.players.getMyPlayer().getLocation().getX() > 2942) &&
- (3371 > this.players.getMyPlayer().getLocation().getY()) &&
- (this.players.getMyPlayer().getLocation().getY() > 3367)) {
- open();
- for (int i = 0; i < 20; i++) {
- if (this.bank.isOpen()) {
- log("Bank Opened.");
- return;
- }
- sleep(100, 250);
- }
- return;
- }
- if ((this.players.getMyPlayer().getLocation().getY() <= 3394) &&
- (this.players.getMyPlayer().getLocation().getX() >= 2937) &&
- (this.players.getMyPlayer().getLocation().getY() >= 3360) &&
- (this.players.getMyPlayer().getLocation().getX() <= 2975)) {
- this.walking.walkTo(new RSTile(2945, 3370));
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().isMoving()) {
- log("Walking to next tile on path to bank.");
- return;
- }
- sleep(100, 250);
- }
- return;
- }
- if (!this.players.getMyPlayer().isIdle()) return;
- this.inventory.getItem(new int[] { faladorTabID }).doClick(true);
- for (int i = 0; i < 20; i++) {
- if (this.players.getMyPlayer().getAnimation() == 9598) {
- log("Successfully used falador tab.");
- return;
- }
- sleep(75, 150);
- }
- }
- public int getWorldComponentID(int world) {
- for (int i = 0; i < allWorlds.length; i++)
- if (allWorlds[i] == world)
- return i;
- return -1;
- }
- public boolean switchToWorld(int world) {
- if ((world < 1) || (world > 169)) return false;
- if (!this.interfaces.getComponent(906, worldSelectTabID).containsText("World<br>Select")) {
- log("Interfaces have updated. Shutting down.");
- stopScript();
- return false;
- }
- if (this.interfaces.getComponent(906, worldSelectTabID - 2).getBackgroundColor() == welcomeScreenTabTextureID) {
- RSInterface mainInterface = this.interfaces.get(910);
- if (mainInterface.getComponent(worldSwitchCheckID).containsText("World " + Integer.toString(world))) {
- for (int k = 0; k < 20; k++) {
- this.interfaces.getComponent(906, clickHereToPlayID).doClick();
- if ((this.interfaces.getComponent(906, clickHereToPlayID).getText() == null) ||
- (this.interfaces.getComponent(906, clickHereToPlayID).containsText("Entering Game..."))) {
- for (int i = 0; i < 40; i++) {
- if (this.game.isLoggedIn()) {
- log("Logged in.");
- this.worldToSwitchTo = -1;
- sleep(5000);
- return true;
- }
- sleep(1000);
- }
- }
- sleep(75, 150);
- }
- return false;
- }
- int worldCompID = getWorldComponentID(world);
- if (this.interfaces.scrollTo(mainInterface.getComponent(worldInterfaceID).getComponent(worldCompID), 59637760 + scrollbarID)) {
- log("Selecting world : " + validWorlds[this.worldToSwitchTo]);
- mainInterface.getComponent(worldInterfaceID).getComponent(worldCompID).doClick();
- for (int i = 0; i < 20; i++) {
- if (mainInterface.getComponent(worldSwitchCheckID).containsText("World " + Integer.toString(world))) {
- log("World Selected.");
- return false;
- }
- sleep(random(75, 150));
- }
- this.worldToSwitchTo = random(0, validWorlds.length);
- log("Trouble selecting world. Changing to : " + validWorlds[this.worldToSwitchTo]);
- return false;
- }
- return false;
- }
- this.interfaces.getComponent(906, worldSelectTabID).doClick();
- for (int i = 0; i < 20; i++) {
- if (this.interfaces.getComponent(906, worldSelectTabID).getBackgroundColor() == welcomeScreenTabTextureID) {
- log("World Select Tab Clicked.");
- return false;
- }
- sleep(50, 75);
- }
- return false;
- }
- public void onRepaint(Graphics g) {
- this.millis = (System.currentTimeMillis() - this.runTime);
- this.hours = (this.millis / 3600000L);
- this.millis -= this.hours * 3600000L;
- this.minutes = (this.millis / 60000L);
- this.millis -= this.minutes * 60000L;
- this.seconds = (this.millis / 1000L);
- g.setColor(Color.RED);
- if ((this.objectToDisplay != null) && (this.displayDebug)) {
- for (Point p : getObjectModelPoints(this.objectToDisplay.getLocation())) {
- if ((p.x != -1) && (p.y != -1))
- g.drawRect(p.x, p.y, 1, 1);
- }
- }
- if ((this.game.isLoggedIn()) && (!this.game.isWelcomeScreen())) {
- if ((this.startLevel == -1) || (this.startXP == -1)) {
- this.startLevel = this.skills.getCurrentLevel(14);
- this.startXP = this.skills.getCurrentExp(14);
- }
- this.currentLevel = this.skills.getCurrentLevel(14);
- this.currentXP = this.skills.getCurrentExp(14);
- this.expTillLevel = this.skills.getExpToNextLevel(14);
- }
- this.gui.runTimeDisplay.setText(this.hours + ":" + this.minutes + ":" + this.seconds);
- this.gui.currentLevelDisplay.setText(Integer.toString(this.currentLevel));
- this.gui.levelsGainedDisplay.setText(Integer.toString(this.currentLevel - this.startLevel));
- this.gui.gainedExpDisplay.setText(Integer.toString((int)this.currentXP - this.startXP));
- this.gui.expRateDisplay.setText(Integer.toString((int)((this.currentXP - this.startXP) * 3600.0D / (this.hours * 60L * 60L + this.minutes * 60L + this.seconds))));
- this.gui.runeMinedDisplay.setText(Integer.toString(this.oresMined));
- this.gui.jLabel10.setText(Double.toString(this.oresMined * 3600 / (this.hours * 60L * 60L + this.minutes * 60L + this.seconds)));
- this.gui.expTillLevelDisplay.setText(Integer.toString(this.expTillLevel));
- }
- public boolean walkPath(RSTile[] path) {
- if ((!getMyPlayer().isMoving()) || (this.calc.distanceTo(this.walking.getDestination()) <= 5))
- return this.theWalker.walkTo(path, true);
- return false; }
- public class GUI extends JFrame { private static final long serialVersionUID = 1L;
- public JLabel currentLevelDisplay;
- public JLabel expRateDisplay;
- public JLabel expTillLevelDisplay;
- public JLabel gainedExpDisplay;
- private JButton jButton1;
- private JLabel jLabel1;
- private JLabel jLabel10;
- private JLabel jLabel11;
- private JLabel jLabel12;
- private JLabel jLabel13;
- private JLabel jLabel14;
- private JLabel jLabel15;
- private JLabel jLabel2;
- private JLabel jLabel3;
- private JLabel jLabel4;
- private JLabel jLabel5;
- private JLabel jLabel6;
- private JLabel jLabel7;
- private JLabel jLabel8;
- private JLabel jLabel9;
- private JPanel jPanel1;
- public JLabel levelsGainedDisplay;
- public JLabel profitDisplay;
- public JLabel profitPerHourDisplay;
- public JLabel runTimeDisplay;
- public JLabel runeMinedDisplay;
- public GUI() { initComponents();
- }
- private void initComponents()
- {
- this.jPanel1 = new JPanel();
- this.jLabel1 = new JLabel();
- this.jLabel2 = new JLabel();
- this.jLabel3 = new JLabel();
- this.currentLevelDisplay = new JLabel();
- this.jLabel4 = new JLabel();
- this.levelsGainedDisplay = new JLabel();
- this.jLabel5 = new JLabel();
- this.expRateDisplay = new JLabel();
- this.jLabel6 = new JLabel();
- this.gainedExpDisplay = new JLabel();
- this.jLabel7 = new JLabel();
- this.runTimeDisplay = new JLabel();
- this.jLabel8 = new JLabel();
- this.runeMinedDisplay = new JLabel();
- this.jLabel9 = new JLabel();
- this.jLabel10 = new JLabel();
- this.jLabel11 = new JLabel();
- this.profitDisplay = new JLabel();
- this.jLabel13 = new JLabel();
- this.profitPerHourDisplay = new JLabel();
- this.jLabel12 = new JLabel();
- this.expTillLevelDisplay = new JLabel();
- this.jLabel14 = new JLabel();
- this.jLabel15 = new JLabel();
- this.jButton1 = new JButton();
- setDefaultCloseOperation(1);
- setBackground(new Color(0, 204, 204));
- this.jPanel1.setBackground(new Color(0, 0, 0));
- this.jLabel1.setFont(new Font("Kredit", 1, 24));
- this.jLabel1.setForeground(new Color(102, 255, 255));
- this.jLabel1.setText("Runite Miner v0.1");
- this.jLabel2.setFont(new Font("Tahoma", 1, 14));
- this.jLabel2.setForeground(new Color(0, 153, 153));
- this.jLabel2.setText("By : Marneus901");
- this.jLabel3.setForeground(new Color(102, 255, 255));
- this.jLabel3.setText("Current Level :");
- this.currentLevelDisplay.setForeground(new Color(102, 255, 255));
- this.currentLevelDisplay.setText("1");
- this.jLabel4.setForeground(new Color(102, 255, 255));
- this.jLabel4.setText("Level(s) Gained :");
- this.levelsGainedDisplay.setForeground(new Color(102, 255, 255));
- this.levelsGainedDisplay.setText("0");
- this.jLabel5.setForeground(new Color(102, 255, 255));
- this.jLabel5.setText("Experience Per Hour :");
- this.expRateDisplay.setForeground(new Color(102, 255, 255));
- this.expRateDisplay.setText("0");
- this.jLabel6.setForeground(new Color(102, 255, 255));
- this.jLabel6.setText("Gained Experience :");
- this.gainedExpDisplay.setForeground(new Color(102, 255, 255));
- this.gainedExpDisplay.setText("0");
- this.jLabel7.setForeground(new Color(102, 255, 255));
- this.jLabel7.setText("Run Time :");
- this.runTimeDisplay.setForeground(new Color(102, 255, 255));
- this.runTimeDisplay.setText("0:0:0");
- this.jLabel8.setForeground(new Color(102, 255, 255));
- this.jLabel8.setText("Runite Mined :");
- this.runeMinedDisplay.setForeground(new Color(102, 255, 255));
- this.runeMinedDisplay.setText("0");
- this.jLabel9.setForeground(new Color(102, 255, 255));
- this.jLabel9.setText("Ore(s) Per Hour :");
- this.jLabel10.setForeground(new Color(102, 255, 255));
- this.jLabel10.setText("0");
- this.jLabel11.setForeground(new Color(102, 255, 255));
- this.jLabel11.setText("Profit :");
- this.profitDisplay.setForeground(new Color(102, 255, 255));
- this.profitDisplay.setText("0");
- this.jLabel13.setForeground(new Color(102, 255, 255));
- this.jLabel13.setText("Profit Per Hour :");
- this.profitPerHourDisplay.setForeground(new Color(102, 255, 255));
- this.profitPerHourDisplay.setText("0");
- this.jLabel12.setForeground(new Color(102, 255, 255));
- this.jLabel12.setText("Exp Till Level :");
- this.expTillLevelDisplay.setForeground(new Color(102, 255, 255));
- this.expTillLevelDisplay.setText("0");
- this.jLabel14.setForeground(new Color(102, 255, 255));
- this.jLabel14.setText("Time Till Level :");
- this.jLabel15.setForeground(new Color(102, 255, 255));
- this.jLabel15.setText("0");
- this.jButton1.setText("Debug On/Off");
- this.jButton1.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- GUI.this.jButton1ActionPerformed(evt);
- }
- });
- GroupLayout jPanel1Layout = new GroupLayout(this.jPanel1);
- this.jPanel1.setLayout(jPanel1Layout);
- jPanel1Layout.setHorizontalGroup(
- jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addGap(156, 156, 156)
- .addComponent(this.jLabel7)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.runTimeDisplay)
- .addContainerGap(193, 32767))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addGap(30, 30, 30)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(GroupLayout.Alignment.TRAILING,
- jPanel1Layout.createSequentialGroup()
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jButton1)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 146, 32767)
- .addComponent(this.jLabel2))
- .addComponent(this.jLabel1))
- .addGap(38, 38, 38))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel3)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.currentLevelDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel6)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.gainedExpDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel8)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.runeMinedDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel11)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.profitDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel12)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.expTillLevelDisplay)))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 118, 32767)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.jLabel4)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.levelsGainedDisplay, -2, 10, -2))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel9)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.jLabel10))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel5)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.expRateDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel13)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.profitPerHourDisplay))
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel14)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(this.jLabel15)))))
- .addGap(59, 59, 59)))));
- jPanel1Layout.setVerticalGroup(
- jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(this.jLabel1)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel2)
- .addComponent(this.jButton1))
- .addGap(13, 13, 13)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.runTimeDisplay)
- .addComponent(this.jLabel7))
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel3)
- .addComponent(this.currentLevelDisplay)
- .addComponent(this.jLabel4)
- .addComponent(this.levelsGainedDisplay))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel6)
- .addComponent(this.gainedExpDisplay))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel8)
- .addComponent(this.runeMinedDisplay))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel11)
- .addComponent(this.profitDisplay))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel12)
- .addComponent(this.expTillLevelDisplay)))
- .addComponent(this.expRateDisplay)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(this.jLabel5)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel9)
- .addComponent(this.jLabel10))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel13)
- .addComponent(this.profitPerHourDisplay))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(this.jLabel14)
- .addComponent(this.jLabel15))))
- .addContainerGap(-1, 32767)));
- GroupLayout layout = new GroupLayout(getContentPane());
- getContentPane().setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(this.jPanel1, -1, -1, 32767)
- .addContainerGap()));
- layout.setVerticalGroup(
- layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(this.jPanel1, -1, -1, 32767)
- .addContainerGap()));
- pack();
- }
- private void jButton1ActionPerformed(ActionEvent evt) {
- displayDebug = (!displayDebug);
- }
- }
- public class LoginBot
- {
- private static final int INTERFACE_MAIN = 905;
- private static final int INTERFACE_MAIN_CHILD = 59;
- private static final int INTERFACE_MAIN_CHILD_COMPONENT_ID = 4;
- private static final int INTERFACE_LOGIN_SCREEN = 596;
- private static final int INTERFACE_USERNAME = 65;
- private static final int INTERFACE_USERNAME_WINDOW = 37;
- private static final int INTERFACE_PASSWORD = 71;
- private static final int INTERFACE_PASSWORD_WINDOW = 39;
- private static final int INTERFACE_BUTTON_LOGIN = 42;
- private static final int INTERFACE_TEXT_RETURN = 11;
- private static final int INTERFACE_BUTTON_BACK = 55;
- private static final int INTERFACE_GRAPHICS_NOTICE = 976;
- private static final int INTERFACE_GRAPHICS_LEAVE_ALONE = 6;
- private static final int INDEX_LOGGED_OUT = 3;
- private int invalidCount;
- public LoginBot()
- {
- }
- public boolean activateCondition()
- {
- int idx = game.getClientState();
- return (idx == 3) && (account.getName() != null);
- }
- public int loop() {
- String username = account.getName().toLowerCase().trim();
- String returnText = interfaces.get(596)
- .getComponent(11).getText().toLowerCase();
- if (game.getClientState() != 3) {
- if (!game.isWelcomeScreen()) {
- sleep(random(1000, 2000));
- }
- return -1;
- }
- if (!game.isLoggedIn()) {
- if (returnText.contains("update")) {
- log("Runescape has been updated, please reload RSBot.");
- stopScript(false);
- }
- if (returnText.contains("disable")) {
- log("Your account is banned/disabled.");
- stopScript(false);
- }
- if (returnText.contains("incorrect")) {
- log("Failed to login five times in a row. Stopping script.");
- stopScript(false);
- }
- if (returnText.contains("invalid")) {
- if (this.invalidCount > 6) {
- log("Unable to login after 6 attempts. Stopping script.");
- log("Please verify that your RSBot account profile is correct.");
- stopScript(false);
- }
- interfaces.get(596).getComponent(55).doClick();
- this.invalidCount += 1;
- return random(500, 2000);
- }
- if (returnText.contains("error connecting")) {
- interfaces.get(596).getComponent(55).doClick();
- stopScript(false);
- return random(500, 2000);
- }
- }
- if (game.getClientState() == 3) {
- if (interfaces.getComponent(976, 6).isValid()) {
- interfaces.getComponent(976, 6).doClick();
- return random(500, 600);
- }
- if (!atLoginScreen()) {
- interfaces.getComponent(905, 59).getComponent(4).doAction("");
- return random(500, 600);
- }
- if ((isUsernameFilled()) && (isPasswordFilled())) {
- interfaces.get(596).getComponent(42).doClick();
- return random(500, 600);
- }
- if (!isUsernameFilled()) {
- atLoginInterface(interfaces.get(596).getComponent(37));
- sleep(random(500, 700));
- int textlength = interfaces.get(596).getComponent(65).getText().length() + random(3, 5);
- for (int i = 0; i <= textlength + random(1, 5); i++) {
- keyboard.sendText("\b", false);
- if (random(0, 2) == 1) {
- sleep(random(25, 100));
- }
- }
- keyboard.sendText(username, false);
- return random(500, 600);
- }
- if ((isUsernameFilled()) && (!isPasswordFilled())) {
- atLoginInterface(interfaces.get(596).getComponent(39));
- sleep(random(500, 700));
- int textlength = interfaces.get(596).getComponent(71).getText().length() + random(3, 5);
- for (int i = 0; i <= textlength + random(1, 5); i++) {
- keyboard.sendText("\b", false);
- if (random(0, 2) == 1) {
- sleep(random(25, 100));
- }
- }
- keyboard.sendText(account.getPassword(), false);
- }
- }
- return random(500, 2000);
- }
- private boolean atLoginInterface(RSComponent i)
- {
- if (!i.isValid())
- return false;
- Rectangle pos = i.getArea();
- if ((pos.x == -1) || (pos.y == -1) || (pos.width == -1) || (pos.height == -1))
- return false;
- int dy = (int)(pos.getHeight() - 4.0D) / 2;
- int maxRandomX = (int)(pos.getMaxX() - pos.getCenterX());
- int midx = (int)pos.getCenterX();
- int midy = (int)(pos.getMinY() + pos.getHeight() / 2.0D);
- if (i.getIndex() == 39)
- mouse.click(minX(i), midy + random(-dy, dy), true);
- else {
- mouse.click(midx + random(1, maxRandomX), midy + random(-dy, dy), true);
- }
- return true;
- }
- private int minX(RSComponent a)
- {
- int x = 0;
- Rectangle pos = a.getArea();
- int dx = (int)(pos.getWidth() - 4.0D) / 2;
- int midx = (int)(pos.getMinX() + pos.getWidth() / 2.0D);
- if ((pos.x == -1) || (pos.y == -1) || (pos.width == -1) || (pos.height == -1))
- return 0;
- for (int i = 0; i < interfaces.get(596).getComponent(71).getText().length(); i++) {
- x += 11;
- }
- if (x > 44) {
- return (int)(pos.getMinX() + x + 15.0D);
- }
- return midx + random(-dx, dx);
- }
- private boolean atLoginScreen()
- {
- return interfaces.get(596).isValid();
- }
- private boolean isUsernameFilled() {
- String username = account.getName().toLowerCase().trim();
- return interfaces.get(596).getComponent(65).getText().toLowerCase().equalsIgnoreCase(username);
- }
- private boolean isPasswordFilled() {
- return interfaces.get(596).getComponent(71).getText().toLowerCase().length() == account.getPassword().length();
- }
- }
- public class TheWalker {
- Thread walker = null;
- RSTile[] path = null;
- public TheWalker() { }
- private void sleep(int i) throws InterruptedException { Thread.sleep(i); }
- public void wait(int toSleep) {
- try {
- long start = System.currentTimeMillis();
- Thread.sleep(toSleep);
- long now;
- while (start + toSleep > (now = System.currentTimeMillis()))
- {
- Thread.sleep(start + toSleep - now);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public boolean waitToMove(int timeout) {
- long start = System.currentTimeMillis();
- RSPlayer myPlayer = getMyPlayer();
- while (System.currentTimeMillis() - start < timeout) {
- if (myPlayer.isMoving())
- return true;
- wait(15);
- }
- return false;
- }
- public void drawMap(Graphics g) {
- if ((this.walker != null) && (this.walker.isAlive())) {
- Point myTile = calc.tileToMinimap(getMyPlayer().getLocation());
- Point center = new Point(myTile.x + 2, myTile.y + 2);
- g.drawOval(center.x - 70, center.y - 70, 140, 140);
- if (this.path == null) return;
- for (int i = 0; i < this.path.length; i++) {
- RSTile tile = this.path[i];
- Point p = calc.tileToMinimap(tile);
- if ((p.x != -1) && (p.y != -1)) {
- g.setColor(Color.BLACK);
- g.fillRect(p.x + 1, p.y + 1, 3, 3);
- if (i > 0) {
- Point p1 = calc.tileToMinimap(this.path[(i - 1)]);
- g.setColor(Color.ORANGE);
- if ((p1.x != -1) && (p1.y != -1))
- g.drawLine(p.x + 2, p.y + 2, p1.x + 2, p1.y + 2);
- }
- }
- }
- Point tile = calc.tileToMinimap(nextTile(this.path));
- g.setColor(Color.RED);
- if ((tile.x != -1) && (tile.y != -1)) {
- g.fillRect(tile.x + 1, tile.y + 1, 3, 3);
- }
- g.setColor(Color.BLACK);
- }
- }
- public boolean walkTo(RSTile[] path, boolean waitUntilDest) {
- TheWalker.Walker walkto = new TheWalker.Walker(path, 3, 10000);
- this.walker = new Thread(walkto);
- this.walker.start();
- waitToMove(random(800, 1200));
- if (waitUntilDest) {
- while (this.walker.isAlive())
- try {
- sleep(random(300, 600));
- }
- catch (InterruptedException localInterruptedException) {
- }
- return walkto.done;
- }return true;
- }
- public Point tileToMM(RSTile tile) {
- return new Point(calc.tileToMinimap(tile).x + 2, calc.tileToMinimap(tile).y + 2);
- }
- public boolean tileOnMM(RSTile tile) {
- return pointOnMM(tileToMM(tile));
- }
- public boolean pointOnMM(Point point) {
- Point myTile = tileToMM(getMyPlayer().getLocation());
- Point center = new Point(myTile.x, myTile.y);
- return center.distance(point) < 70.0D;
- }
- public RSTile getClosestTileOnMap(RSTile tile) {
- if (game.isLoggedIn() && (!tileOnMM(tile)))
- try {
- RSTile loc = getMyPlayer().getLocation();
- RSTile walk = new RSTile((loc.getX() + tile.getX()) / 2, (loc.getY() + tile.getY()) / 2);
- return tileOnMM(walk) ? walk : getClosestTileOnMap(walk);
- } catch (Exception localException) {
- }
- return tile;
- }
- public RSTile nextTile(RSTile[] path) {
- for (int i = path.length - 1; i >= 0; i--) {
- if (tileOnMM(path[i])) {
- return path[i];
- }
- }
- return new RSTile(0, 0);
- }
- class Walker implements Runnable {
- RSTile tile = null;
- boolean done = false;
- int movementTimer = 10000;
- int distanceTo = 3;
- Walker(RSTile[] userpath) { this.tile = userpath[(userpath.length - 1)];
- TheWalker.this.path = userpath; }
- Walker(RSTile[] userpath, int distanceTo, int movementTimer) {
- this.tile = userpath[(userpath.length - 1)];
- this.movementTimer = movementTimer;
- this.distanceTo = distanceTo;
- TheWalker.this.path = userpath;
- }
- public void run() {
- long timer = System.currentTimeMillis();
- RSTile lastTile = getMyPlayer().getLocation();
- int randomReturn = random(5, 8);
- while ((calc.distanceTo(this.tile) > this.distanceTo) && (!shuttingDown) && (!PAUSE) && (!stop)) {
- if ((!getMyPlayer().isMoving()) || (walking.getDestination() == null) || (calc.distanceTo(walking.getDestination()) < randomReturn)) {
- RSTile nextTile = TheWalker.this.nextTile(TheWalker.this.path);
- if (walking.getDestination() != null && (calc.distanceBetween(walking.getDestination(), nextTile) <= this.distanceTo))
- continue;
- walking.walkTileMM(nextTile);
- TheWalker.this.waitToMove(random(800, 1200));
- randomReturn = random(5, 8);
- }
- RSTile myLoc = getMyPlayer().getLocation();
- if (myLoc != lastTile) {
- if (calc.distanceBetween(myLoc, lastTile) > 30.0D) {
- log("Teleportation Detected. Stopping The Walking Loop.");
- stop = true;
- }
- timer = System.currentTimeMillis();
- lastTile = myLoc;
- }
- if (System.currentTimeMillis() - timer > this.movementTimer)
- stop = true;
- try
- {
- sleep(random(20, 40));
- } catch (InterruptedException localInterruptedException) {
- }
- }
- if (calc.distanceTo(this.tile) <= this.distanceTo)
- this.done = true;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement