Jump to content

[Snippet] A start to an AIO Runecrafter [Open-Source]


Scripter 3

Recommended Posts

Our Enum for our altar modes

 

Credits: Isolate - for status snippet, Explv - for JOptionPane snippet, and Valkyr - for being my boy toy.

import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.map.Position;

public enum Altars {

    AIR_ALTAR("Rune essence", "Air rune", new Position(2986, 3294,0), new Position(3013, 3356, 0), new Area(2839, 4840, 2849, 4827), new Area(3009, 3358, 3021, 3353), new Area(2970, 3379, 3022, 3275)),
    MIND_ALTAR("Rune essence", "Mind rune", new Position(2980, 3513, 0), new Position(2945, 3370, 0), new Area(2771, 4852, 2798, 4823), new Area(2940, 3375, 2952, 3358), new Area(2922, 3525, 3037, 3308)),
    WATER_ALTAR("Rune essence", "Water rune", new Position(3183, 3166, 0), new Position(3094, 3244, 0), new Area(2706, 4842, 2730, 4828), new Area(3088, 3246, 3097, 3240), new Area(3058, 3278, 3280, 3119)),
    EARTH_ALTAR("Rune essence", "Earth rune", new Position(3305, 3472, 0), new Position(3253, 3421, 0), new Area(2644, 4851, 2663, 4824), new Area(3248, 3427, 3259, 3414), new Area(3225, 3406, 3318, 3500)),
    FIRE_ALTAR("Rune essence", "Fire rune", new Position(3312, 3253, 0), new Position(3382, 3270, 0), new Area(2572, 4852, 2596, 4827), new Area(3375, 3275, 3388, 3266), new Area(3267, 3302, 3412, 3154)),
    BODY_ALTAR("Rune essence", "Body rune", new Position(3055, 3447, 0), new Position(3093, 3490, 0), new Area(2511, 4847, 2529, 4829), new Area(3090, 3499, 3098, 3488), new Area(3039, 3521, 3127, 3408)),
    COSMIC_ALTAR("Pure essence", "Cosmic rune", new Position(2408, 4379, 0), new Position(2386, 4458, 0), new Area(2119, 4856, 2164, 4811), new Area(2382, 4461, 2390, 4453), new Area(2382, 4461, 2424, 4369)),
    //CHAOS_ALTAR("Pure essence", "Chaos rune", new Position(3062, 3590, 0), new Position(3094, 3497, 0), new Area(), new Area(3090, 3499, 3098, 3488), new Area(3114, 3455, 2959, 3621)),
    ASTRAL_ALTAR("Pure essence", "Astral rune", new Position(2156, 3865, 0), new Position(2100, 3918, 0), new Area(2150, 3871, 2164, 3859), new Area(2097, 3921, 2104, 3917), new Area(2094, 3924, 2170, 3845))
    ;
    
    private String essence, crafted;
    private Position ruinsPos, bankPos;
    private Area altarZone, bankZone, pathingZone;

    Altars(String essence, String craftedRune, Position ruinsPos, Position bankPos, Area altarZone, Area bankZone, Area pathingZone) {
        this.essence = essence;
        this.crafted = craftedRune;
        this.ruinsPos = ruinsPos;
        this.bankPos = bankPos;
        this.altarZone = altarZone;
        this.bankZone = bankZone;
        this.pathingZone = pathingZone;
    }

    public String getEssence() {
        return essence;
    }

    public String getCrafted() {
        return crafted;
    }

    public Position getRuinsPos() {
        return ruinsPos;
    }

    public Position getBankPos() {
        return bankPos;
    }

    public Area getAltarZone() {
        return altarZone;
    }

    public Area getBankZone() {
        return bankZone;
    }

    public Area getPathingZone() {
        return pathingZone;
    }

}

You can edit and expand it as you like happy.png

 

Main 

@ScriptManifest(name = "Runecrafter", author = "Scripter 3", version = 1.0, info = "Supports walking atm", logo = "")
public class RC extends Script{

    // define variables
    private String essence, crafted;
    private Position ruinsPos, bankPos;
    private Area altarZone, bankZone, pathingZone;
    private Altars altars;

    public static String getStatus, lastLoggedStatus;
    private long startTime;
    private int runesMade;

}

onStart

    @Override
    public void onStart() throws InterruptedException {
        startTime = System.currentTimeMillis(); //start the timer
        getExperienceTracker().startAll(); /start the experience tracker. can just do start(Skill skill);
        runesMade = 0; //refresh our rune counter
        altars = (Altars) JOptionPane.showInputDialog(null,
                "Select a mode:",
                "Runecrafter",
                JOptionPane.INFORMATION_MESSAGE,
                null,
                Altars.values(),
                Altars.values()[0]
        ); //JOptionPane that throws our enum into it to select a 'Mode'
        loadMode(altars); //load our mode.
    }

onLoop

    @Override
    public int onLoop() throws InterruptedException {

        /*Handle level-up*/
        if (getDialogues().isPendingContinuation()) { //if pending con -> click con
            getDialogues().clickContinue();
            new ConditionalSleep(2000, 600) { //sleep
                @Override
                public boolean condition() throws InterruptedException {
                    return !getDialogues().isPendingContinuation();
                }
            }.sleep();
        }

        /*Handle bank depositbox missclick */
        if (getDepositBox().isOpen()){ //if its open -> close -> sleep
            getDepositBox().close();
            new ConditionalSleep(2000, 900) {
                @Override
                public boolean condition() throws InterruptedException {
                    return !getDepositBox().isOpen();
                }
            }.sleep();
        }

        /*Handle running*/
        if (getSettings().getRunEnergy() >= random(15, 35) && !getSettings().isRunning()){ 
            getSettings().setRunning(true);
            new ConditionalSleep(2000, 700) {
                @Override
                public boolean condition() throws InterruptedException {
                    return getSettings().isRunning();
                }
            }.sleep();
        } //if not running -> randomize between 15,25 energy -> turn it on -> sleep

        /*Handle banking*/
        if (bankZone.contains(myPosition()) && !getInventory().contains(essence)){ //pretty explanatory
            if (!getBank().isOpen()){
                getStatus = "Opening bank";
                getBank().open();
                new ConditionalSleep(2000, 767) {
                    @Override
                    public boolean condition() throws InterruptedException {
                        return getBank().isOpen();
                    }
                }.sleep();
            } else {
                if (getInventory().contains(crafted)){
                    getStatus = "Depositing";
                    getBank().depositAll();
                    sleep(600);
                } else {
                    getStatus = "Withdrawing";
                    getBank().withdrawAll(essence);
                    sleep(600);
                    if (random(0, 7) < 2) getBank().close();
                }
            }
        }

        /*Handle walking w/ essence*/
        if (pathingZone.contains(myPosition()) && getInventory().contains(essence)){
            if (ruinsPos.distance(myPosition()) <= 10){
                RS2Object ruins = getObjects().closest(obj -> obj.hasAction("Enter") && obj.getName().equals("Mysterious ruins"));
                if (ruins != null && ruins.interact("Enter")){
                    getStatus = "Entering ruins";
                    new ConditionalSleep(5000, 676) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return altarZone.contains(myPosition());
                        }
                    }.sleep();
                }
            } else {
                getStatus = "Walking to ruins";
                WebWalkEvent toRuins = new WebWalkEvent(INodeRouteFinder.createAdvanced(), ruinsPos);
                execute(toRuins);
            }
        }

        /*Handle walking w/o essence*/
        if (pathingZone.contains(myPosition()) && getInventory().contains(crafted)){
            getStatus = "Walking to bank";
            WebWalkEvent toRuins = new WebWalkEvent(INodeRouteFinder.createAdvanced(), bankPos);
            execute(toRuins);
        }

        /*Craft runes in altar area || leave altar area*/
        if (altarZone.contains(myPosition())){
            if (getInventory().contains(essence)){
                RS2Object altar = getObjects().closest("Altar");
                if (altar != null && altar.interact("Craft-rune")){
                    getStatus = "Crafting runes";
                    new ConditionalSleep(4000, 912) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return getInventory().contains(crafted);
                        }
                    }.sleep();
                    runesMade += getInventory().getAmount(crafted);
                }
            } else if (getInventory().contains(crafted)){
                RS2Object portal = getObjects().closest("Portal");
                if (portal != null && portal.interact("Use")){
                    getStatus = "Exiting area";
                    new ConditionalSleep(3500, 684) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return pathingZone.contains(myPosition());
                        }
                    }.sleep();
                }
            }
        }

        return 600;
    }

onPaint

    @Override
    public void onPaint(Graphics2D gfx) {
        long timeRan = System.currentTimeMillis() - this.startTime;
        gfx.setColor(Color.PINK);
        gfx.drawString("Mode: " + altars, 20, 20);
        gfx.drawString("Status: " + printStatus(), 20, 40);
        gfx.drawString("Time: " + Time.format(timeRan), 20, 60);
        gfx.drawString("Experience: " + getExperienceTracker().getGainedXP(Skill.RUNECRAFTING) + " (" + getExperienceTracker().getGainedXPPerHour(Skill.RUNECRAFTING) + ")", 20, 80);
        gfx.drawString("Time Till Level: " + Time.format(getExperienceTracker().getTimeToLevel(Skill.RUNECRAFTING)), 20, 100);
        gfx.drawString("Gained level(s): +" + getExperienceTracker().getGainedLevels(Skill.RUNECRAFTING), 20, 120);
        gfx.drawString("Runes crafted: " + runesMade, 20, 140);
    }

methods

/**
     * Methods
     * @param mode
     */

    public void loadMode(Altars mode) {
        this.essence = mode.getEssence();
        this.crafted = mode.getCrafted();
        this.ruinsPos = mode.getRuinsPos();
        this.bankPos = mode.getBankPos();
        this.altarZone = mode.getAltarZone();
        this.bankZone = mode.getBankZone();
        this.pathingZone = mode.getPathingZone();
    }

    private String printStatus(){
        if(!Objects.equals(lastLoggedStatus, getStatus)){
            log("Current Status: " + getStatus);
            lastLoggedStatus = getStatus;
        }
        return lastLoggedStatus;
    }

Quick copy pasta

import com.ajck.runecrafting.util.Altars;
import com.ajck.runecrafting.util.Time;
import org.osbot.rs07.api.map.Area;
import org.osbot.rs07.api.map.Position;
import org.osbot.rs07.api.model.RS2Object;
import org.osbot.rs07.api.ui.Skill;
import org.osbot.rs07.api.webwalk.INodeRouteFinder;
import org.osbot.rs07.event.WebWalkEvent;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.script.ScriptManifest;
import org.osbot.rs07.utility.ConditionalSleep;

import javax.swing.*;
import java.awt.*;
import java.util.Objects;

@ScriptManifest(name = "Runecrafter", author = "Scripter 3", version = 1.0, info = "Supports walking atm", logo = "")
public class RC extends Script{

    private String essence, crafted;
    private Position ruinsPos, bankPos;
    private Area altarZone, bankZone, pathingZone;
    private Altars altars;

    public static String getStatus, lastLoggedStatus;
    private long startTime;
    private int runesMade;

    @Override
    public void onStart() throws InterruptedException {
        startTime = System.currentTimeMillis();
        getExperienceTracker().startAll();
        runesMade = 0;
        altars = (Altars) JOptionPane.showInputDialog(null,
                "Select a mode:",
                "Runecrafter",
                JOptionPane.INFORMATION_MESSAGE,
                null,
                Altars.values(),
                Altars.values()[0]
        );
        loadMode(altars);
    }

    @Override
    public int onLoop() throws InterruptedException {

        /*Handle level-up*/
        if (getDialogues().isPendingContinuation()) {
            getDialogues().clickContinue();
            new ConditionalSleep(2000, 600) {
                @Override
                public boolean condition() throws InterruptedException {
                    return !getDialogues().isPendingContinuation();
                }
            }.sleep();
        }

        /*Handle bank depositbox missclick */
        if (getDepositBox().isOpen()){
            getDepositBox().close();
            new ConditionalSleep(2000, 900) {
                @Override
                public boolean condition() throws InterruptedException {
                    return !getDepositBox().isOpen();
                }
            }.sleep();
        }

        /*Handle running*/
        if (getSettings().getRunEnergy() >= random(15, 35) && !getSettings().isRunning()){
            getSettings().setRunning(true);
            new ConditionalSleep(2000, 700) {
                @Override
                public boolean condition() throws InterruptedException {
                    return getSettings().isRunning();
                }
            }.sleep();
        }

        /*Handle banking*/
        if (bankZone.contains(myPosition()) && !getInventory().contains(essence)){
            if (!getBank().isOpen()){
                getStatus = "Opening bank";
                getBank().open();
                new ConditionalSleep(2000, 767) {
                    @Override
                    public boolean condition() throws InterruptedException {
                        return getBank().isOpen();
                    }
                }.sleep();
            } else {
                if (getInventory().contains(crafted)){
                    getStatus = "Depositing";
                    getBank().depositAll();
                    sleep(600);
                } else {
                    getStatus = "Withdrawing";
                    getBank().withdrawAll(essence);
                    sleep(600);
                    if (random(0, 7) < 2) getBank().close();
                }
            }
        }

        /*Handle walking w/ essence*/
        if (pathingZone.contains(myPosition()) && getInventory().contains(essence)){
            if (ruinsPos.distance(myPosition()) <= 10){
                RS2Object ruins = getObjects().closest(obj -> obj.hasAction("Enter") && obj.getName().equals("Mysterious ruins"));
                if (ruins != null && ruins.interact("Enter")){
                    getStatus = "Entering ruins";
                    new ConditionalSleep(5000, 676) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return altarZone.contains(myPosition());
                        }
                    }.sleep();
                }
            } else {
                getStatus = "Walking to ruins";
                WebWalkEvent toRuins = new WebWalkEvent(INodeRouteFinder.createAdvanced(), ruinsPos);
                execute(toRuins);
            }
        }

        /*Handle walking w/o essence*/
        if (pathingZone.contains(myPosition()) && getInventory().contains(crafted)){
            getStatus = "Walking to bank";
            WebWalkEvent toRuins = new WebWalkEvent(INodeRouteFinder.createAdvanced(), bankPos);
            execute(toRuins);
        }

        /*Craft runes in altar area || leave altar area*/
        if (altarZone.contains(myPosition())){
            if (getInventory().contains(essence)){
                RS2Object altar = getObjects().closest("Altar");
                if (altar != null && altar.interact("Craft-rune")){
                    getStatus = "Crafting runes";
                    new ConditionalSleep(4000, 912) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return getInventory().contains(crafted);
                        }
                    }.sleep();
                    runesMade += getInventory().getAmount(crafted);
                }
            } else if (getInventory().contains(crafted)){
                RS2Object portal = getObjects().closest("Portal");
                if (portal != null && portal.interact("Use")){
                    getStatus = "Exiting area";
                    new ConditionalSleep(3500, 684) {
                        @Override
                        public boolean condition() throws InterruptedException {
                            return pathingZone.contains(myPosition());
                        }
                    }.sleep();
                }
            }
        }

        return 600;
    }

    @Override
    public void onPaint(Graphics2D gfx) {
        long timeRan = System.currentTimeMillis() - this.startTime;
        gfx.setColor(Color.PINK);
        gfx.drawString("Mode: " + altars, 20, 20);
        gfx.drawString("Status: " + printStatus(), 20, 40);
        gfx.drawString("Time: " + Time.format(timeRan), 20, 60);
        gfx.drawString("Experience: " + getExperienceTracker().getGainedXP(Skill.RUNECRAFTING) + " (" + getExperienceTracker().getGainedXPPerHour(Skill.RUNECRAFTING) + ")", 20, 80);
        gfx.drawString("Time Till Level: " + Time.format(getExperienceTracker().getTimeToLevel(Skill.RUNECRAFTING)), 20, 100);
        gfx.drawString("Gained level(s): +" + getExperienceTracker().getGainedLevels(Skill.RUNECRAFTING), 20, 120);
        gfx.drawString("Runes crafted: " + runesMade, 20, 140);
    }

    /**
     * Methods
     * @param mode
     */

    public void loadMode(Altars mode) {
        this.essence = mode.getEssence();
        this.crafted = mode.getCrafted();
        this.ruinsPos = mode.getRuinsPos();
        this.bankPos = mode.getBankPos();
        this.altarZone = mode.getAltarZone();
        this.bankZone = mode.getBankZone();
        this.pathingZone = mode.getPathingZone();
    }

    private String printStatus(){
        if(!Objects.equals(lastLoggedStatus, getStatus)){
            log("Current Status: " + getStatus);
            lastLoggedStatus = getStatus;
        }
        return lastLoggedStatus;
    }


}

If something can be changed please let everyone know cool.png

 

 

EDIT: forgot a few classes

public class Time {
  public static String format(long time) {
    StringBuilder t = new StringBuilder();
    long total_secs = time / 1000L;
    long total_mins = total_secs / 60L;
    long total_hrs = total_mins / 60L;
    long total_days = total_hrs / 24L;
    int secs = (int)total_secs % 60;
    int mins = (int)total_mins % 60;
    int hrs = (int)total_hrs % 24;
    int days = (int)total_days;
    if (days > 0) {
      if (days < 10) {
        t.append("0");
      }
      t.append(days);
      t.append(":");
    }
    if (hrs < 10) {
      t.append("0");
    }
    t.append(hrs);
    t.append(":");
    if (mins < 10) {
      t.append("0");
    }
    t.append(mins);
    t.append(":");
    if (secs < 10) {
      t.append("0");
    }
    t.append(secs);
    return t.toString();
  }
}
public class Timer { //Extra
  private final long start;
  private final long period;
  private long end;
  
  public Timer(long period) {
    this.period = period;
    this.start = System.currentTimeMillis();
    this.end = (this.start + period);
  }
  
  public long getElapsed()
  {
    return System.currentTimeMillis() - this.start;
  }
  
  public long getRemaining() {
    if (isRunning()) {
      return this.end - System.currentTimeMillis();
    }
    return 0L;
  }
  
  public boolean isRunning()
  {
    return System.currentTimeMillis() < this.end;
  }
  
  public void reset()
  {
    this.end = (System.currentTimeMillis() + this.period);
  }
  
  public long setEndIn(long ms) {
    this.end = (System.currentTimeMillis() + ms);
    return this.end;
  }
  
  public String toElapsedString()
  {
    return Time.format(getElapsed());
  }
  
  public String toRemainingString()
  {
    return Time.format(getRemaining());
  }
}
Edited by Scripter 3
Link to comment
Share on other sites

  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...