Jump to content
Frequently Asked Questions
  • Are you not able to open the client? Try following our getting started guide
  • Still not working? Try downloading and running JarFix
  • Help! My bot doesn't do anything! Enable fresh start in client settings and restart the client
  • How to purchase with PayPal/OSRS/Crypto gold? You can purchase vouchers from other users
  • Review my second script please


    btksurfjohn

    Recommended Posts

    Hello, 

    Thanks for checking out my post.

    here is my second script which is a moded version of my first, both of which relied on Pandemics example miner and chatgpt.

    Seems to be running fine but one thing that is bugging me is it stays on the bank longer than Id like, ex it withdraws gold bars and seems to sleep for a second longer then it should but im still not certain what code is producing this.

    It is a simple gold bar crafter making whatever mould is in your inventory in edge. Not really any antiban so if any one has some to share id appreciate it as well. 

    It is a node task script as Pandemic showed in his miner example. Im open to all critique.

    It is seperated into 3 files, the main script being CashCrafter and the two nodes being BankTask & SmeltTask.

    Here is CashCrafter.

    
    import org.dreambot.api.methods.skills.Skill;
    import org.dreambot.api.methods.skills.SkillTracker;
    import org.dreambot.api.script.Category;
    import org.dreambot.api.script.ScriptManifest;
    import org.dreambot.api.script.impl.TaskScript;
    import org.dreambot.api.utilities.Logger;
    import tasks.BankTask;
    import tasks.SmeltingTask;
    
    
    import java.awt.*;
    
    @ScriptManifest(category = Category.CRAFTING, name = "CashCrafter", description = "Crafts Cash.", author = "BTK", version = 0.2)
    public class CashCrafter extends TaskScript {
        private long startTime;
        private SmeltingTask smeltingTask;
        private BankTask bankTask;
        @Override
        public void onStart() {
            Logger.log("Starting cash miner......");
            SkillTracker.start(Skill.CRAFTING);
            startTime = System.currentTimeMillis();
            smeltingTask = new SmeltingTask();
            bankTask = new BankTask();
    
            addNodes(smeltingTask, bankTask);
        }
    
        @Override
        public void onPaint(Graphics2D g) {
            g.setFont(new Font("Arial", Font.BOLD, 12));
    
            Color bronze = new Color(205, 127, 50);
            g.setColor(bronze);
    
            String experienceGainedText = String.format(
                    "Crafting Experience: %d (%d per hour)",
                    SkillTracker.getGainedExperience(Skill.CRAFTING),
                    SkillTracker.getGainedExperiencePerHour(Skill.CRAFTING)
            );
            g.drawString(experienceGainedText, 5, 35);
    
            long elapsedTime = System.currentTimeMillis() - startTime;
            String timeRunningText = "Time Running: " + formatTimeElapsed(elapsedTime);
            g.drawString(timeRunningText, 5, 65);  // Adjust y-coordinate as
    
            String smeltingStatus = "Smelting: " + smeltingTask.getStatus();
            g.drawString(smeltingStatus, 5, 95);
    
            String bankStatus = "Banking: " + bankTask.getStatus();
            g.drawString(bankStatus, 5, 115);
        }
    
        private String formatTimeElapsed(long millis) {
            long seconds = millis / 1000;
            long minutes = seconds / 60;
            seconds %= 60;
            long hours = minutes / 60;
            minutes %= 60;
    
            return String.format("%02d:%02d:%02d", hours, minutes, seconds);
        }
    
    }

    SmeltingTask

    package tasks;
    
    import org.dreambot.api.methods.Calculations;
    import org.dreambot.api.methods.container.impl.Inventory;
    import org.dreambot.api.methods.input.Camera;
    import org.dreambot.api.methods.interactive.GameObjects;
    import org.dreambot.api.methods.interactive.Players;
    import org.dreambot.api.methods.map.Area;
    import org.dreambot.api.methods.map.Tile;
    import org.dreambot.api.methods.skills.Skill;
    import org.dreambot.api.methods.skills.Skills;
    import org.dreambot.api.methods.tabs.Tab;
    import org.dreambot.api.methods.tabs.Tabs;
    import org.dreambot.api.methods.walking.impl.Walking;
    import org.dreambot.api.methods.widget.Widgets;
    import org.dreambot.api.script.TaskNode;
    import org.dreambot.api.utilities.Logger;
    import org.dreambot.api.utilities.Sleep;
    import org.dreambot.api.wrappers.interactive.GameObject;
    import org.dreambot.api.wrappers.widgets.WidgetChild;
    
    import java.util.Random;
    
    public class SmeltingTask extends TaskNode {
    
        Area smeltArea = new Area(3108, 3500, 3109, 3498);
        Tile smeltTile = new Tile(3109, 3499);
    
        private String status = "Inactive";
    
        // ... your existing node logic ...
    
        public String getStatus() {
            return status;
        }
    
    
        @Override
        public boolean accept() {
    
            boolean hasBars = Inventory.contains(item -> item.getName().toLowerCase().contains("bar"));
    
            if (isSmelting() && !hasBars) status = "Inactive";
            return !isSmelting() && hasBars;
        }
    
        @Override
        public int execute() {
            status = "Executing smelting.";
            if (!smeltArea.contains(Players.getLocal().getTile())) {
                Random random = new Random();
                status = "Walking to smelting";
                if (random.nextInt(10) == 0) {
                    Logger.log("Walk to smelt area");
                    Walking.walk(smeltArea.getRandomTile());
                } else {
                    Logger.log("Walk to smelt tile");
                    Walking.walk(smeltTile);
                }
    
                Sleep.sleepUntil(Walking::shouldWalk, () -> Players.getLocal().isMoving(), 1000, 100);
                return 100;
            }
    
            GameObject furnace = getClosestFurnace();
            if (furnace == null) {
                Logger.log("No furace...something gone wrong!");
                return Calculations.random(500, 1000);
            }
            Sleep.sleep(Calculations.random(100, 500));
            status = "Interacting to smelt.";
            if (furnace.interact("Smelt")) {
                status = "Cashin in.";
                Sleep.sleep(Calculations.random(1500, 2500));
                WidgetChild bronzeBarWidget = getWidgetBasedOnMould();
                if (bronzeBarWidget != null && bronzeBarWidget.interact()) {
                    antiBan();
                    Sleep.sleepUntil(this::isSmelting,  3000);
                }
            }
    
    
            return Calculations.random(500, 1000);
        }
    
        private WidgetChild getWidgetBasedOnMould() {
            if (Inventory.contains("Necklace mould")) {
                return Widgets.get(446, 23);
            } else if (Inventory.contains("Amulet mould")) {
                return Widgets.get(446, 37);
            } else if (Inventory.contains("Bracelet mould")){
                return Widgets.get(446, 50);
            } else if (Inventory.contains("Ring mould")) {
                return Widgets.get();
            }
            else {
                throw new RuntimeException("No mould in inventory!");
            }
        }
    
    
        private void antiBan() {
                int choice = Calculations.random(0, 99); // Generates a random number between 0 and 99 inclusive
                status = "Cashin in, antiban random: " + choice;
                switch (choice) {
                    case 0: // 1% chance
                        Skills.hoverSkill(Skill.CRAFTING);
                        Sleep.sleep(Calculations.random(2000, 5000));
                        break;
                    case 1: // 1% chance
    //                    Camera.
                        Sleep.sleep(Calculations.random(2000, 5000));
                        break;
                    case 2: // 1% chance
                        Sleep.sleep(Calculations.random(20000, 50000));
                        break;
                    case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10:
                        if (Tabs.getOpen() != Tab.INVENTORY) {
                            Tabs.open(Tab.INVENTORY);
                            Sleep.sleep(Calculations.random(500, 1000));
                        }
                        break;
                    default: // 90% chance
                        // Do nothing
                        break;
                }
            }
    
    
    
        private boolean isSmelting() {
            for (int i = 0; i < 9; i++) {
                if (Players.getLocal().isAnimating()) {
                    return true;
                }
    
                int sleepTime = Calculations.random(100, 500);
                Sleep.sleep(sleepTime);
            }
    
            return false;
        }
    
    
        private GameObject getClosestFurnace() {
            return GameObjects.closest(object -> object.getName().equalsIgnoreCase("Furnace") &&
                    object.hasAction("Smelt") &&
                    object.distance() < 10);
        }
    }

    And BankTask

    package tasks;
    
    import org.dreambot.api.methods.Calculations;
    import org.dreambot.api.methods.container.impl.Inventory;
    import org.dreambot.api.methods.container.impl.bank.Bank;
    import org.dreambot.api.methods.interactive.Players;
    import org.dreambot.api.methods.walking.impl.Walking;
    import org.dreambot.api.script.TaskNode;
    import org.dreambot.api.utilities.Logger;
    import org.dreambot.api.utilities.Sleep;
    
    public class BankTask extends TaskNode {
    
        private String status = "Inactive";
    
        public String getStatus() {
            return status;
        }
    
        @Override
        public boolean accept() {
            boolean hasBars = Inventory.contains(item -> item.getName().toLowerCase().contains("bar"));
    
            if (hasBars) status = "Inactive";
            return !hasBars;
        }
    
        @Override
        public int execute() {
            status = "Banking";
            if (Bank.open()) {
                status = "Banking; open.";
                Bank.depositAllExcept(item -> item.getName().contains("mould"));
                Bank.withdraw("Gold bar", 27);
            } else {
                status = "Banking; walking.";
                Sleep.sleepUntil(Walking::shouldWalk, () -> Players.getLocal().isMoving(), 1000, 100);
                return 100;
            }
            return Calculations.random(300, 600);
        }
    }

     

    Edited by btksurfjohn
    Link to comment
    Share on other sites

    • btksurfjohn changed the title to Review my second script please

    The bug with the bank mentioned above was fixed thanks to help from Glozzen on discord. I had created a crazy for loop to determine if the player was smelting using the Player is animating and waits since while smelting a player isn't always animating. This whole function was removed and just now uses an inline check to see i the player has bars

                WidgetChild bronzeBarWidget = getWidgetBasedOnMould();
                if (bronzeBarWidget != null && bronzeBarWidget.interact()) {
                    // -antiban, im not aeglen.
                    Sleep.sleepUntil(() -> !Inventory.contains(BARS), // if this is true, stop sleeping
                    () -> Players.getLocal().isAnimating(), // reset the maximum every time this is true
                    3000, // wait a maximum of X milliseconds
                    100 // check if you are animating every X milliseconds
                    );
                }

     

    Edited by btksurfjohn
    Link to comment
    Share on other sites

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now
    ×
    ×
    • Create New...

    Important Information

    We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.