btksurfjohn 24 Posted October 4, 2023 (edited) 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 October 4, 2023 by btksurfjohn
btksurfjohn 24 Author Posted October 4, 2023 (edited) 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 October 4, 2023 by btksurfjohn
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now