Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 08/27/2020 in all areas

  1. Roughly around mid to late September, we will be offering our first early access closed beta to users with EARLY BETA ACCESS role which is assigned currently in our discord here: https://www.discord.gg/epicbot If you are interested, kindly ask an admin for the early beta access role and we will get it assigned for you. As a note, we are not accepting more than 100 users in the role and as of this post we are at about 60/100. That means there is about 40 left and we suggest you request those beta spots are easly as possible. During the closed beta we will try to offer as many features as possible that we can complete, including offering a selection of premium scripts. Please do refer some friends and old time Epicbot members to return and watch how we come back bigger and better. If you are in the early beta access role on discord, you will get added to the beta channel where you can retain your access. Spoiler: Coming soon - early beta access will even have their own rank/title on the forums.
    11 points
  2. ___________________________ | Free Fighter | ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ Free Fighter by Sean is an all-in-one script for fighting npcs across Runescape. With support for many free to play npcs ("Chicken", "Cow", "Cow Calf", "Seagull", "Goblin", "Hill Giant", "Flesh Crawler", "Minotaur", "Wolf", "Zombie", "Catablepon", "Ankou", "Barbarian", "Moss Giant") as well as many configurable options such as looting, alching, healing, special attacks, training goals, equipment upgrading, and more, Free Fighter is there to help level your account and gain easy gp. If you enjoy Free Fighter, please check out Pro Fighter! Free Fighter features include: Supported locations: ✔️ All locations currently supported by the Dax Walker: ✔️ All Cities (Except Lletya) including Zeah ✔️ Wilderness ✔️ Gnome Slayer Dungeon ✔️ Relleka Slayer Dungeon ✔️ Stronghold of Security ✔️ Most underground locations (Falador Mine, Varrock Sewers, etc) Supported NPC's: ✔️ "Chicken", "Cow", "Cow Calf", "Seagull", "Goblin", "Hill Giant", "Flesh Crawler", "Minotaur", "Wolf", "Zombie", "Catablepon", "Ankou", "Barbarian", "Moss Giant" Main features: ✔️ Supports Preset and User generated profiles. Quickly get back to fighting with only a few mouse clicks! ✔️ Option to determine your fighting location using a center tile and check distance. Easily use the minimap to set up the perfect spot. ✔️ Option to define a requirement string for your profile. This can be used to ensure you have DFS equipped if fighting dragons, or to ensure you have a Dusty Key in your inventory if you're in taverley dungeon. ✔️ Easily pick NPCs to fight based on what is around you. ✔️ Food Type and count selection ✔️ Can configure the percent of your total health that you will eat at. ✔️ Option to heal with Guthans ✔️ Many looting options such as: ✔️ Looting by list. Load the drop table from your selected NPCs and loot any items that match your selections. ✔️ Loot by value. Loot any item over a value threshold determined by you. ✔️ Loot Bones. Loot all bones. ✔️ Option to bury bones. ✔️ Loot Arrows - Loot all arrows and bolts. ✔️ Option to only loot personal kills. ✔️ Ability to alch looted items. You select what items to alch. ✔️ Options to keep travel items in your inventory for quicker travel between tasks and the bank. This includes charged jewelry, ectophial, royal seedpod, and the dramen/lunar staff. ✔️ Ability to purchase new jewelry from the grand exchange when out of charges. ✔️ Ability to use special attacks in combat. Can swap weapons to use the special attack as well. ✔️ Ability to use a protection prayer of your choice. ✔️ Option to bank if out of prayer potions and withdraw a user configured number of prayer potions. ✔️ If using magic, the script will not deposit any runes. ✔️ Ability to use a safe spot. This will attempt to keep your character at the center tile. ✔️ Option for unreachable NPC's. ✔️ Cannon Supported ✔️ Automatic Equipment Upgrader: ✔️ Will automatically determine item progressions based on what your character is wearing when the script starts. ✔️ Will withdraw and equip any upgrades as your character levels up. ✔️ Potion support ✔️ Training Goals: ✔️ Has the ability to swap attack styles and profiles based on level goals. Example: Train attack, then strength, then defence to 10 using chickens. Then train attack, then strength, then defence to 20 using cows. All without turning off the script.
    9 points
  3. Hi everyone, We're back! Over the next couple of weeks we are expecting to be releasing beta access to the client which is being developed by the talented @Suko along with some help from the Scripting team. Aside from that, welcome back to the forums, please read the site rules, enjoy yourself and tell your friends that EpicBot's back. Keep updated with the bot progress through the forums or discord. Now go and get acquainted with the new forums, test everything you can (within reason and abiding the rules of course) here to make sure everything is ready for the beta launch in a couple of weeks. Many thanks, The EpicBot Team
    8 points
  4. Hello everyone! The entire team here at EpicBot has been working hard to get our first beta version ready for some early testing. We still have a lot of work to do and will be working on things over the next few weeks as well, but this is a good sample taste of what we're doing and where we're going. Please note that the bot is beta and this is currently our injection mode, so bot safely and do not abuse! We will be working on EpicBot Echo mode over the next month and will have updates on that next month. Again, this is a really early stage alpha/beta for you guys to test things out on, and start developing scripts on your own. Here is a little update on what is working/finished in this live public beta: - Injection Mode - Mouse Settings w/Custom Mouse Profiles: The mouse system which is very very customizable. You can effectively dictate speed profiles and from there you can customize motion, flow and flow pattern, speed, and overshoots. - Account Manager (add/edit/remove and delete accounts) with key encryption. - Premium scripts (made free for testing) - Client Tabs with support for individual proxying - Easy to use GUI - Low Resource Usage (pretty damn low!) - Proxy Support for all tabs - Dax Walker integration - Forum authentication / Auto Login (logging into the client via your forum account) - Loader that supports heap size settings and hardware acceleration that also serves as downloading the latest updates. - Developer and debug tools (Widget Explorer, Vars Explorer) - Script Loading Coming soon (mid to late December): - Break System/Task Scheduler: Originally this was supposed to be a very simple break system (and it would've been done already if it stayed that way). However, the idea is to turn it into an advanced breaking system that allows you to schedule tasks along with breaking is currently the direction we'd like to go. It's a lot more advanced than a normal breaking system and we think our users will find it beneficial. Private Scripts: - As of right now, we are not allowing private scripts to be sold in any way, shape, or form. We are still working out local script access and how we can keep things fair, but as of right now, we request that no one attempt to sell any private scripts of any kind until a further announcement is made. Yes, we will allow it, but under our terms, and right now we ask that any talented scripters instead work on pushing scripts for the community! There will be a further announcement made on private script sales soon. Anyone caught selling a private script will be permanetely banned on site, client, and the discord. Thanks. Special Thanks: - To @Suko @Chet @Koala @Proto @Krulvis @Wildkilla @Eran @Euan @Sean and the many beta testers who've went over and beyond to help us, including @Sellout @smile @Mansnothot @Nub and the many others who've helped in any way, shape, or form. This is just the beginning of something great. If I missed anyone, im sorry this was written in haste to get this out as soon as possible. DOWNLOAD: https://www.epicbot.com/download.php JAVA DOCS: https://epicbot.com/javadocs/juice/
    8 points
  5. Hello everyone! The early private beta access group is intended for early access to the very first version of EpicBot for user testing. It will be given to active members of EpicBot to help aid in testing, bug reporting, and suggestions of our very first client. Originally, we filled up this early beta access role pretty quickly. We wanted to make sure we only had active members, so periodically, we were pruning anyone who was not active enough for assisting with the testing of a very early private beta. If you feel you can and are willing to help post bugs, test, and make suggestions and overall help shape the future of the EpicBot client, please leave your DISCORD NAME here, you must be on the server. To join the Discord server, please join at: https://discord.gg/epicbot Failure to follow this simple instruction of leaving your discord name will get your post deleted/ignored. We will start adding people from this list after confirming who is who in the next 1-3 hours 🙂 If you didn't get in, it is possible you were accidentally missed or your request was rejected for a reason or another. Please feel free to reach out to Mint#5869 directly for more informaiton. Do not hesitate to ask! Thanks and happy botting.
    6 points
  6. How to set up Intellij for Script Development Please note that EpicBot uses Java 8. You can download this from Oracle here. If your Java version is not 8, set up Intellij to use Java 8, read "Set Up Intellij" here. Don't know your Java version? Type java --version in a command prompt. SETUP Make a new Intellij Project Go to File -> Project Structure -> Modules. Click the + icon. Select JARs or Directories. Find your EpicBot folder. Select the dependencies folder and click OK. You should now see it in your Dependencies list. Click Apply (don't click OK). Click your Artifacts tab on the left, and the plus arrow again. Select "Other" from the drop down menu. You should see something like this: Name your artifact at the top (must be unique from your other script artifact names in other projects). Select the "Include in project build" checkbox. Click the '<project name> compile output' on the right side, so it moves to the left column. Click the file folder on the left. Find your EpicBot/scripts folder. You may not have one, and will need to make one. Select it and click OK. If your screen looks like this, click Apply and OK. Any script should now compile when you click the "Build Project" button (green hammer top right) Making a Test Script Right click your src folder on the left. Select New -> Java Class, and name it. You should get something like this: A quick sample script to test: import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import java.awt.*; @ScriptManifest(name = "Test Script", gameType = GameType.OS) public class TestClass extends LoopScript { @Override public boolean onStart(String... strings) { return true; } @Override protected int loop() { return 50; } @Override protected void onPaint(Graphics2D g, APIContext ctx) { PaintFrame frame = new PaintFrame("Test Script"); frame.addLine("Title", "Value"); frame.draw(g, 0, 170, ctx); } } Click the build icon (green hammer top right) and you should then be able to see your script in the script selector. FAQ Q: I followed the instructions and everything is red? Your dependencies are not imported properly. Q: I don't see the script in the script list? You're not building the artifact properly. Ensure that "Include in Project Build" is checked, your output directory is correct, and your compile output is under the output root (left column). See below:
    5 points
  7. Pro Firemaker Current Features: 🐨 Supports all Logs 🐨 🐨 Supports multiple locations 🐨 🐨 Progressive Mode🐨 Planned Features: 🐨 Stop conditions 🐨 🐨 Profiles 🐨
    5 points
  8. Hey everyone, in this tutorial I'll detail how to create a simple script that loots bones and buries them for free prayer exp. I noticed on the forums that there are a lot of people who are new to script writing and are interested in writing their own scripts. This tutorial will teach you some Java basics and walk you through writing a simple script. Hopefully you are able to learn something from this and can start to write your own scripts. There are plenty of open source scripts on the forum already so you can use those as a resource as well. What will be covered in this tutorial? LoopScript basics Understanding and Passing the API Context Simple Java functions Using the GroundItems API Using the Inventory API Referring to the Javadoc and why it's important The best way to learn from this tutorial is to read and try to understand what is happening, if you simply copy and paste code then you won't learn much. This tutorial assumes you have IntelliJ IDEA installed and setup for EpicBot. If not there is a tutorial you can follow here. One thing to keep in mind: Coding and script writing is not for everyone. Some of you will really enjoy it, and some of you will hate it. It is what it is, if you don't like it then you're better off using free and premium scripts instead. Let's get started: LoopScript Basics: A LoopScript is a type of script that can be run by EpicBot, there are other types of scripts like a TreeScript but that won't be covered in this tutorial. A LoopScript is exactly what it sounds like, it's a loop that continues indefinitely until you tell it to stop. Here is a basic skeleton of a LoopScript, I will go over the important bits that are necessary for making our bone burying script, called Gravedigger: @ScriptManifest(...): This is where the script selector gets it's information about the script, mainly the name of the script and the game type. Here we named the script Gravedigger, and the script is meant for OSRS loop(): This is the meat of the script, everything that you want your script to do should go in this loop() method. onStart(String... strings): This function runs once when the script first starts, it is useful for setting up certain settings for your script or anything up that is required for your script to run. This could be something like setting a variable with the start time of the script, which is useful for calculating the total runtime of a script (which can be displayed on screen using Paint). We won't concern ourselves with the (String... strings) inside the brackets of this function since we are just writing a simple script. @ScriptManifest(name = "Gravedigger", gameType = GameType.OS) public class Gravedigger extends LoopScript { @Override protected int loop() { return 600; } @Override public boolean onStart(String... strings) { return true; } } What is that "return 600" in the loop() method?: The return value of the loop tells EpicBot how long to sleep before running the loop again. The return value of 600 means that EpicBot will wait 600 milliseconds before starting the loop again. This is important because it keeps CPU usage at a reasonable level. If you set it to 0 your CPU usage will be much higher and you don't gain anything from this. Remember that a game tick in OSRS is 600 milliseconds, so nothing in game will have changed until the next game tick, so it doesn't make sense to have your loop running every 100ms because it won't be doing anything. Of course it takes time to execute the loop and all the methods inside it, so if you have a fairly complex script then it makes sense to have a return value lower than 600. But since this is a very basic script, we will have it sleep 600ms between each loop. TIP: You can choose a random number between a certain range to add a bit more variation to the script if you would like. Simply use this line instead: return Random.nextInt(450, 600); This will have the script sleep at a random interval between 450ms and 600ms. What is that "return true" in the onStart() methods?: When you return true in the onStart method, this simply tells the script to start. You might be wondering "Well of course I want my script to start, what is the point of this?". Consider this scenario: You are creating a fletching script, and your character doesn't have a knife in their inventory, if you don't want the script to be able to run without a knife in the inventory, then this is a very handy way of stopping the script before it even starts. How would you do this? Check if the user has a knife in their inventory, if they don't then return false in the onStart method and the script will stop before it even starts. I won't post a code snippet of how to do this, consider it an exercise after you complete the tutorial. If you follow along to the end of the tutorial then you should be able to figure out how to do this yourself. Is there another way to stop the script? Yes there is, say you have started the script already, therefore the onStart method has already ran once and won't run again since it only runs once when the script first starts. How do we stop the script then? In a LoopScript, it's very simple. Remember the return value in the loop() method? When given a positive number, it sleeps for that amount of time in milliseconds, try passing a negative number instead. What happens? The script stops. In a LoopScript, if you return any negative number in the loop() method, it will stop the script. Let's go back to that fletching knife scenario from earlier. Say you want your script to check the bank for a knife first before stopping, in case the user forgot to withdraw it from their bank. You write a method to check the bank, and it looks like they don't have a knife in the bank either! Simply have the method return a negative number and pass that as the return value and it will stop the script. This may sound confusing at first but once you write your first script it will start to make sense. Before we start writing code, we need to understand the API Context. Understanding and Passing the API Context The API Context is possibly the single most important thing you will use when writing scripts. It's how you get your script to do anything really. Need to get an item in your inventory, use the API Context. Need to figure out where your player is standing, use the API Context. How do I attack an NPC...? Use the API Context. See where I'm going with this? There are two ways to get the API Context in your script. In the main script file, your LoopScript, there is a function called "getAPIContext()", you can call this function and store it's result in a APIContext variable. Like so: APIContext ctx = getAPIContext(); This is my preferred method, it stores the API Context in a variable called "ctx" (shorthand for the word context). Afterwards you simply pass the API Context to any function that requires it. How do we do this?: To do this you must understand how a Java function is structured: private void openBank(APIContext ctx){ ctx.bank().open(); } Access Level Modifier: private Return Type: void Function Name: openBank Function Arguments: APIContext ctx Access Level Modifiers (Might seem complicated at first): This restricts or provides access for different levels of your Java program. Here is a StackOverflow answer about Access Level modifiers. This might seem confusing at first, so I'll try to phrase it in a basic way. Think of private functions and variables as items you will only need to access in this specific file. Protected functions and variables are items you can access in a package (You can think of a package as a folder). Public functions and variables are items you can access throughout your program. Generally you want to provide a minimum level of access, meaning functions and variables should always be private unless you need to use them elsewhere. There are ways to provide access to private functions and variables for use elsewhere but I won't go into detail about this since this is already a lot of information to take in. Did you understand all that? If you're a newbie then probably not, but that's okay, as you begin to write scripts and get a better understanding of Java, these concepts will start to become clearer. The best way to learn coding is through practical application, so even if you don't understand this now, after writing your first script or two or five? you will start to connect the dots. Return Type: In the above example the return type is void. What does this mean? void means the function does not return any value. Remember in the loop() method of the LoopScript, you return an integer and it sleeps for that amount of time in milliseconds. Take a look at that loop() function again, do you see it's return type? It's "int", not "void" like this example, that means the loop() function returns an integer. There are other return types like boolean (true/false), double (numbers with a decimal like 3.14), etc. Google Intro to Java Functions if you want to learn more. Function Name: This should be obvious, it's the name of the function, this is what you type in the loop() function when you want to call this specific function in your script. You would call this function by using the following line "openBank(ctx)" Fairly straightforward. Function Arguments: Remember earlier when I talked about passing the API Context to functions, that is exactly what is happening here. When you call this function, the Java compiler expects you to pass in a variable of the type APIContext. If you don't then you will get an error and your script won't compile. You can have multiple arguments in a function like so (in this case, the multiply function's arguments are "int a" and "int b"): public int multiply(int a, int b){ return a*b; } Call the multiply function like this: multiply(2,4); Store the result returned by the function in a variable for later use: int product = multiply(2,4); The value stored in the variable "product" is 8. Hopefully this example helps you understand function arguments. That was a lot to take in. One last thing about the API Context: Another method for getting the API Context is by calling APIContext.get(). You can do this anywhere in your script, although in the Epicbot Javadocs it say's not to rely on this method so that is why I prefer to use the "getAPIContext()" function like I mentioned earlier. Simple Java Functions - Using the GroundItems API - Using the Inventory API First let's map out what we want our script to do. We want it to loot bones on the ground and bury them. So what exactly does our script need to do? Find bones on the ground Pick up the bones from the ground Keep looting bones until your inventory is full Start burying bones when you have a full inventory Repeat. Sounds easy enough, but as you write the script you will notice that doing these tasks is not a single line of code but moreso a multistep process. Lets start with finding bones on the ground. It is best to split up the script logic into smaller functions, each function should have only one specific purpose. This is called the Single Responsibility principle, by the name you should understand what this means. Essentially, it's consider bad practice to have functions do more than one specific thing, for instance: If we wrote a function that finds bones on the ground and then picks up the bones and then buries the bones, this violates the Single Responsibility principle. Following this principle will make your life easier in the long run, especially when its time to test and debug your script. Find Bones on Ground: How do we find items on the ground? we use the Ground Items API which is provided by the API Context. How did I know to use the GroundItems API? Simple. Check the Javadocs: https://epicbot.com/javadocs/ The Javadocs will be the best resource to read when you want to explore the API and see how to use specific functions. The EpicBot Javadocs are well documented, and when you see a function and you're not entirely sure how to use it, check the Javadocs. Let's write a function that returns the nearest GroundItem when the function is given a specific item name. private GroundItem getNearestItem(APIContext ctx, String itemName){ return ctx.groundItems().query() .named(itemName) .results() .nearest(); } How to use the function to find Bones: GroundItem bones = getNearestItem(ctx, "Bones"); How does this function work? We use the "query()" method, try to use the query method when possible because it is easy to understand and efficient in terms of CPU usage. This function returns the nearest ground item with the name that was passed to the function. This function can be reused for any item, not just bones, since we can pass in any item name into the function. What happens if there are no bones found in game? This is very important to note, if there are no bones found in the game when this function is called, the return value will be "null". Null is essentially Java's way of saying whatever you are looking for, doesn't exist. If you try to operate on a null value, your script will throw a NullPointerException (NPE) and it will break the script. You want to avoid NPEs at all costs, and to do so it's very simple: GroundItem bones = getNearestItem(ctx, "Bones"); if(bones != null){ //do something } We use an if statement to check if bones does not equal (!=) null. This way if there are no bones available in game and the function returns a null value, the if statement protects us from operating on a null value, because the if statement only does something if the value inside the brackets is true, meaning the variable bones is not null. Whenever there is an ! exclamation mark in front of an equals or a boolean variable, that means "not". != means "does not equal" Pick up bones from the ground: Let's write a function to pick up bones from the ground, but wait, what if our inventory is full? Should we still try to pick up bones? Obviously not. So we will need to write a function that checks if our inventory is full. How do we check if our inventory is full? Use the API Context! private boolean isInventoryFull(APIContext ctx){ return ctx.inventory().isFull(); } We can reuse this function any time we need to check if our inventory is full. So how do we check if our inventory is not full? Remember to use the ! exclamation mark to denote "not". So we would call the function like this: if(!isInventoryFull(ctx)){ //do something } Now to write the actual pick up logic: private void pickUpBonesFromGround(GroundItem bones){ if(bones != null){ bones.interact("Take"); } } Try using this function in your script and running it. (Make sure you do this on an account you don't care about) What happens? Well it tries to pick up bones, but then immediately tries to pick up the bones again, it keeps spam clicking! What do I do? We have to tell the script to sleep, we can tell the script to sleep until an event occurs. We will use a lambda function for shorthand, you can read up on Lambda functions here. Let's rewrite the function to include a sleep call. private boolean pickUpBonesFromGround(APIContext ctx, GroundItem bones){ final String BONES = "Bones"; int count = ctx.inventory().getCount(BONES); if(bones != null && bones.interact("Take")){ return Time.sleep(3600, () -> ctx.inventory().getCount(BONES) != count); } return false; } This function has changed considerably. Did you notice the return type is now a boolean and not void? What is the point of the BONES variable? And what are we doing with the count variable? What is happening??? We changed the return type of this function to a boolean, why? This is so we know if we successfully picked up the bones or not. To understand how this works, we have to look at the Time.sleep() function. If you look in the Javadocs, or IntelliJ's Code Completion, we see that Time.sleep() returns a boolean value. This specific Time.sleep() function takes two values (There are multiple Time.sleep() functions, look up Java Overloading), the first is an integer, this represents the time to wait until we stop sleeping. So we're waiting a maximum of 3.6 seconds (arbitrary number, you can wait for as long as you like) to see if the script is able to pick up bones in that time. The sleep function knows to stop because of the second argument, the lambda function: () -> ctx.inventory().getCount(BONES) != count). This is what the sleep function is waiting for, it checks to see in the number of bones in your inventory does not equal the number stored in the variable count. The variable count is the number of bones that we're in our inventory before we tried to pick up the bones. If that condition becomes true within 3.6 seconds, Time.sleep() will stop sleeping and send a return value of True, meaning we successfully picked up the bones. If not, then it returns false, meaning we didn't pick up the bones within 3.6 seconds. Starting to make sense? We also have the function return false if the condition in the if statement returns false which means the bones variable is null or the bones.interact() function failed for whatever reason. Notice in the if statement the &&. This reads as "if bones does not equal null AND bones.interact() is successful", if we want to use an OR instead of an AND we use double bars: ||. We can have multiple conditions in a single if statement. Keep looting bones until Inventory is full: Now that we have functions to check if our inventory is full, one to get nearby bones, and one to pick up the bones, let's write a function that is able to put all of these actions together and record the number of bones we picked up. private int bonesLooted = 0; private void lootBones(APIContext ctx){ GroundItem bones = getNearestItem(ctx, "Bones"); if(pickUpBonesFromGround(ctx, bones)){ bonesLooted++; } } We created a variable outside of the function called lootBones, when we do this, we can still access the variable in the lootBones function itself since it is a private variable and the function is inside the same file (Remember Access Level Modifiers?). But since this bonesLooted variable is outside of the lootBones function, other functions have access to this variable too (as long as it's in the same file, since its a private variable). This will be useful for our Paint. Notice we use the code: bonesLooted++; when we use ++, that basically means add 1 to the current variable. It is a shorthand for the following code: bonesLooted = bonesLooted + 1; Start burying bones when we have a full inventory: This is the last part of our script logic, burying the bones, we do this when our inventory is full of bones. There are multiple ways to go about burying all 28 bones, we will use something in Java called a for loop, which is a loop we can define to run a certain number of times: private void buryBones(APIContext ctx){ final String BONES = "Bones"; for(int i = 0; i < 28; i++){ int count = ctx.inventory().getCount(BONES); ItemWidget bones = ctx.inventory().getItem(BONES); if(bones != null && bones.interact("Bury")){ Time.sleep(1200, () -> ctx.inventory().getCount(BONES) != count); } } } One thing I forgot to mention earlier, if you find yourself using the same string over and over again, it's best to store it in a variable and use that variable instead, like the BONES variable. Let's talk about this function, it loops 28 times (Number of inventory slots in your backpack) and buries a set of bones each loop. After it buries the bones, the script will wait for a maximum of 1.2 seconds (1200ms) until the the number of bones in your inventory is not equal to the number of bones that were in your inventory before trying to bury the bones. There are a few different kinds of for loops, in this one we use an integer value as a counter. In this case the variable is i. Which is set to 0, the next bit: i < 28; this is the stopping condition of the for loop, as long as i is less than 28, the loop continues, each time the loop completes, i is incremented by 1, remember the ++ operator? So essentially what this loop is doing is starting from the very first inventory slot, it gets the first Bones item in the inventory, and then buries the bones. Remember that we are only getting the Bones item, since we call ctx.inventory().getItem(BONES); It will either return the first bones item in the inventory, or if there are no bones left, it returns a null value. We are safe from a NullPointerException here because we check if the variable bones is null before trying to operate on it. And that is basically it for the script logic. Well done for making it this far! Referring to the Javadocs and why its important: When scripting, the Javadocs are one of your best resources, it documents everything about EpicBot's API and explains the more complex function in an easy to understand manner. If you are unsure of how to use a function, or if you're wondering if a function to do your specific task already exists within the API, check the Javadocs: https://epicbot.com/javadocs/ Seriously, I can't stress this enough. This is how I learned the basics of the EpicBot API and created my own scripts. Refer to the Javadocs whenever you are lost, and always check the Javadocs first before you ask for help, chances are it already has what you're looking for. If you want to search for API Context functions, it may not be obvious where to look. When first starting to write scripts, you will most likely need to look at the IInventoryAPI or whatever API. IBankAPI, IGroundItemsAPI, ICombatAPI. That has all the API Context functions you will use and most likely need to look up. Once you start to create more complex scripts, you will find yourself looking through basically the entire Javadocs. Again, it's very well documented, and the more complex functions have helpful descriptions as well. Putting it all together: Now that you have learned how to write a basic script, and I have provided the overall functionality for you in the above functions. I'll leave it up to you as an exercise to call the functions in the loop() method of the LoopScript. If you're confused make sure to read up on the LoopScript basics section again, you should be able to complete this by yourself now that you have a better understanding of how things work. Hopefully. I hope you weren't expecting me to leave a completed script for you to copy and paste into IntelliJ at the end of this tutorial 😂 Instead I'll give you the structure of the script, its very simple. In the main file: Create an APIContext variable outside of the main loop In the onStart method, intialize the APIContext variable by storing the result of the getAPIContext() method in the variable Create a bonesLooted variable outside of the main loop like the APIContext variable, and make it equal to 0 In the main Loop method: Check if the inventory is full If it is full then bury bones Otherwise (else) loot the bones Done. A good place to run this script is the in the Lumbridge cow pens on a free world. If you need help feel free to leave a comment, but this should be more than enough to help you create a simple bone burying script. I hope you learned something from this tutorial and if it helps you create your own script, then that's great! Good luck and have fun!
    5 points
  9. Pro Tutorial Island Current Features: 🐨 Randomized Appearances 🐨 🐨 Realistic Names 🐨 🐨 Walk to bank on completion 🐨 Work in Progress: 🐨 Profiles 🐨
    5 points
  10. This bot will mine Tin & Copper in Rimmington then navigate to Falador smelter, create bronze bars, bank. Start script with empty inventory and desired pickaxe in equipment slot, only start the script in either Rimmington or Falador East Bank. import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.SceneObject; import com.epicbot.api.shared.entity.WidgetGroup; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.model.Tile; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import com.epicbot.api.shared.webwalking.model.RSBank; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; @ScriptManifest(name = "Private Miner & Smither", gameType = GameType.OS) public class main extends LoopScript { private Area BANK_AREA = new Area(new Tile(3008, 3359, 0), new Tile(3019, 3352, 0)); private Area TIN_AREA = new Area(new Tile(2983, 3238, 0), new Tile(2987, 3234, 0)); private Area COPPER_AREA = new Area(new Tile(2975, 3248, 0), new Tile(2980, 3244, 0)); private Area FURNACE_AREA = new Area(new Tile(2969, 3371, 0), new Tile(2978, 3367, 0)); private long startTime; private int counter = 0; @Override public boolean onStart(String... strings) { startTime = System.currentTimeMillis(); return true; } @Override protected int loop() { WidgetGroup LevelUpInterface = getAPIContext().widgets().get(233); if (LevelUpInterface.isVisible()) { levelup(); } else { if (getAPIContext().inventory().getCount("Uncut sapphire", "Uncut emerald", "Uncut ruby", "Uncut diamond", "Clue geode (beginner)") > 0) { drop(); } else if (getAPIContext().inventory().getCount("Bronze bar") == 14) { bank(); } else if (FURNACE_AREA.contains(getAPIContext().localPlayer().getLocation())) { smelt(); } else if (getAPIContext().inventory().getCount("Tin ore") == 14 && (getAPIContext().inventory().getCount("Copper ore") == 14)) { smelt(); } else if (getAPIContext().inventory().getCount("Tin ore") != 14) { mine_tin(); } else if (getAPIContext().inventory().getCount("Copper ore") != 14) { mine_copper(); } } return 100; } private boolean isActioning() { return getAPIContext().localPlayer().isAnimating() || getAPIContext().localPlayer().isMoving(); } private void bank() { if (!BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().webWalking().walkTo(RSBank.FALADOR_EAST.getTile()); } else { if (BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { if (!getAPIContext().bank().isOpen()) { getAPIContext().bank().open(); Time.sleep(1_000, () -> getAPIContext().bank().isOpen()); }else if (getAPIContext().bank().isOpen()) { getAPIContext().bank().depositInventory(); counter = counter + 14; Time.sleep(1_000, () -> !getAPIContext().bank().isOpen()); } } } } private void mine_tin() { final SceneObject Rocks = getAPIContext().objects().query().id(11361, 11360).results().nearest(); if (!TIN_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().webWalking().walkTo(TIN_AREA.getCentralTile()); } else if (!isActioning()) { if (Rocks != null) { Rocks.interact("Mine"); Time.sleep(2_000, () -> getAPIContext().localPlayer().isAnimating()); } } } private void mine_copper() { final SceneObject Rocks = getAPIContext().objects().query().id(11161, 10943).results().nearest(); if (!COPPER_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().webWalking().walkTo(COPPER_AREA.getCentralTile()); } else if (!isActioning()) { if (Rocks != null) { Rocks.interact("Mine"); Time.sleep(2_000, () -> getAPIContext().localPlayer().isAnimating()); } } } private void smelt() { final SceneObject FURNACE = getAPIContext().objects().query().nameContains("Furnace").results().nearest(); WidgetGroup SmeltInterface = getAPIContext().widgets().get(270); if (!FURNACE_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().webWalking().walkTo(FURNACE_AREA.getCentralTile()); } else if (isActioning()) { Time.sleep(2_000, () -> !getAPIContext().localPlayer().isAnimating()); Time.sleep(2_000, () -> getAPIContext().localPlayer().isAnimating() && getAPIContext().inventory().getCount("Bronze bar") != 14); } else if (SmeltInterface.isVisible()) { getAPIContext().keyboard().sendKey(49); Time.sleep(2_000, () -> getAPIContext().localPlayer().isAnimating()); } else if (FURNACE != null) { FURNACE.interact("Smelt"); Time.sleep(1000,2000); } } private void levelup() { WidgetGroup LevelUpInterface = getAPIContext().widgets().get(233); Time.sleep(500, 1000); if (LevelUpInterface.isVisible()) { getAPIContext().keyboard().sendKey(32); } } private void drop() { if (getAPIContext().inventory().getCount("Uncut sapphire") > 0) { getAPIContext().inventory().dropAll("Uncut sapphire"); }else if (getAPIContext().inventory().getCount("Uncut emerald") > 0) { getAPIContext().inventory().dropAll("Uncut emerald"); }else if (getAPIContext().inventory().getCount("Uncut ruby") > 0) { getAPIContext().inventory().dropAll("Uncut ruby"); }else if (getAPIContext().inventory().getCount("Uncut diamond") > 0) { getAPIContext().inventory().dropAll("Uncut diamond"); }else if (getAPIContext().inventory().getCount("Clue geode (beginner)") > 0) { getAPIContext().inventory().dropAll("Clue geode (beginner)"); Time.sleep(500,1000); } } //define image to display on screen private BufferedImage image = downloadImage("https://i.imgur.com/6rfxOOp.jpg"); @Override protected void onPaint(Graphics2D g, APIContext ctx){ PaintFrame pf = new PaintFrame(); g.drawImage(image, 0, getAPIContext().game().getViewportHeight() - -5, null); pf.addLine("Private Miner/Smither",""); pf.addLine("",""); pf.addLine("Runtime: ", Time.getFormattedRuntime(startTime)); pf.addLine("",""); pf.addLine("Mining Level: ", getAPIContext().skills().mining().getCurrentLevel()); pf.addLine("",""); pf.addLine("Smithing Level: ", getAPIContext().skills().smithing().getCurrentLevel()); pf.addLine("",""); pf.addLine("Bronze Bars: ", counter); pf.addLine("",""); pf.addLine("",""); pf.addLine("",""); pf.addLine("",""); pf.draw(g, 195, 339, ctx); } //download the image to display on screen public BufferedImage downloadImage(String url) { try { HttpURLConnection conn; conn = (HttpURLConnection)(new URL(url.replaceAll(" ", "%20")).openConnection()); conn.setInstanceFollowRedirects(false); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"); conn.setRequestProperty("Accept", "ttext/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"); conn.setRequestProperty("Accept-Language", "en-us,en;q=0.5"); conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); conn.setRequestProperty("Keep-Alive", "300"); conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestMethod("GET"); return ImageIO.read(conn.getInputStream()); } catch(IOException e1) { return null; } } }
    5 points
  11. ___________________________ | Pro Fighter | ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ Pro Fighter by Sean is an all-in-one script for fighting npcs across Runescape. With support for just about any monster including dragons, abyssal demons, and more as well as many configurable options such as looting, alching, healing, special attacks, training goals, equipment upgrading, and more, Pro Fighter is there to help level your account and gain easy gp. Pro Fighter features include: Supported locations: ✔️ All locations currently supported by the Dax Walker: ✔️ All Cities (Except Lletya) including Zeah ✔️ Wilderness ✔️ Gnome Slayer Dungeon ✔️ Relleka Slayer Dungeon ✔️ Stronghold of Security ✔️ Most underground locations (Falador Mine, Varrock Sewers, etc) Supported NPC's: ✔️ All NPC's with a standard fight cycle including dragons, Abyssal Demons, etc. Some NPC's with custom actions required such as Gargoyles, rock slugs, and desert lizards. Not supported are NPCs with custom fight cycles or special abilities (such as Demonic Gorillas). Main features: ✔️ Supports Preset and User generated profiles. Quickly get back to fighting with only a few mouse clicks! ✔️ Option to determine your fighting location using a center tile and check distance. Easily use the minimap to set up the perfect spot. ✔️ Option to define a requirement string for your profile. This can be used to ensure you have DFS equipped if fighting dragons, or to ensure you have a Dusty Key in your inventory if you're in taverley dungeon. ✔️ Easily pick NPCs to fight based on what is around you. ✔️ Food Type and count selection ✔️ Can configure the percent of your total health that you will eat at. ✔️ Option to heal with Guthans ✔️ Many looting options such as: ✔️ Looting by list. Load the drop table from your selected NPCs and loot any items that match your selections. ✔️ Loot by value. Loot any item over a value threshold determined by you. ✔️ Loot Bones. Loot all bones. ✔️ Option to bury bones. ✔️ Loot Arrows - Loot all arrows and bolts. ✔️ Option to only loot personal kills. ✔️ Ability to alch looted items. You select what items to alch. ✔️ Options to keep travel items in your inventory for quicker travel between tasks and the bank. This includes charged jewelry, ectophial, royal seedpod, and the dramen/lunar staff. ✔️ Ability to purchase new jewelry from the grand exchange when out of charges. ✔️ Ability to use special attacks in combat. Can swap weapons to use the special attack as well. ✔️ Ability to use a protection prayer of your choice. ✔️ Option to bank if out of prayer potions and withdraw a user configured number of prayer potions. ✔️ If using magic, the script will not deposit any runes. ✔️ Ability to use a safe spot. This will attempt to keep your character at the center tile. ✔️ Option for unreachable NPC's. ✔️ Cannon Supported ✔️ Automatic Equipment Upgrader: ✔️ Will automatically determine item progressions based on what your character is wearing when the script starts. ✔️ Will withdraw and equip any upgrades as your character levels up. ✔️ Potion support ✔️ Training Goals: ✔️ Has the ability to swap attack styles and profiles based on level goals. Example: Train attack, then strength, then defence to 10 using chickens. Then train attack, then strength, then defence to 20 using cows. All without turning off the script. Pro Fighter GUI: Pro Fighter Screenshots:
    4 points
  12. Hello everyone! We are opening back up some spots in the beta usergroup, which basically gets early access to new EpicBot features and releases. It will be given to active members of EpicBot to help aid in testing, bug reporting, and suggestions for the EpicBot client. Originally, we filled up this early beta access role pretty quickly. We wanted to make sure we only had active members, so periodically, we were pruning anyone who was not active enough for assisting with the testing of a very early private beta. If you feel you can and are willing to help post bugs, test, and make suggestions and overall help shape the future of the EpicBot client, please leave your DISCORD NAME here, you must be on the server. To join the Discord server, please join at: https://discord.gg/epicbot Failure to follow this simple instruction of leaving your discord name will get your post deleted/ignored. If you didn't get in, it is possible you were accidentally missed or your request was rejected for a reason or another. Please feel free to reach out to Mint#5869 directly for more informaiton. Do not hesitate to ask! This is a limited role and this topic will be closed when the group is full. Thanks and happy botting.
    4 points
  13. EpicBot is currently working on a simple scripter rank system where we evaluate the talent within our community to decide who can advertise their private script writing services. In addition, we'll judge your level of skill in terms of moderate, advanced, and expert level which will open up more permissions in the future. For now, we will be using this application form for scripters who want to be private scripters or premium scripters. We will assign your skill level behind the scenes until we make the necessary changes for those permissions some time at a future date. To apply, you need to please provide the following information in a POST THAT IS POSTED IN THIS FORUM SECTION: https://www.epicbot.com/forum/index.php?/forum/76-application-submission/ (aka the Application Submission forum). Feel free to include any other details you'd like us to consider. ALL SCRIPTER APPLICATIONS POSTED ARE PRIVATE AND CANNOT BE SEEN BY ANYONE ELSE OTHER THAN ADMINS/DEVELOPERS/SCRIPTERS. Username: Application type: Private scripter or Premium scripter Years experience: Languages known: Do you have a scripter rank at any other bots? If so, where? Link to GitHub or any other public repo: Link to at least two RuneScape scripts (can be attached or linked) that was done using the EpicBot API: Other comments/remarks: All private scripters will get a private scripter rank + a discord color name change. Privately, we will also be assigning you a rank based on your submitted materials that will come with additional permissions later on. - Moderate Level: Demonstrates enough knowledge in Java and can produce scripts of easy to moderate complexity. - Able to post in our Scripting Services market to advertise their script writing services. - Private scripter rank only Advanced Level: Demonstrates advanced knowledge in Java and can produce most scripts regardless of complexity. - Able to post in our Scripting Services market to advertise their script writing services. - Is able to contribute to free scripts that will be posted on the EpicBot SDN. - Private Scripter rank + Advanced level rank - Discord rank and username color change Expert Level: Demonstrates ultimate knowledge in Java and can produce any script regardless of complexity. - Able to post in our Scripting Services market to advertise their script writing services. - Is able to contribute to free scripts that will be posted on the EpicBot SDN. - Is able to contribute premium scripts that will be posted for sale on the EpicBot SDN. - Private scripter or Premium scripter rank + Expert level rank - Discord rank and username color change
    4 points
  14. These rules are to be followed at all times by all other community members. Breaking any rule can cause your account to be permanently suspended by EpicBot with or without warning. Market Guidelines The participation in the EpicBot market is completely at your own risk! Scamming is not allowed, but use your common sense to detect scams and scammers. EpicBot staff will not always judge in the event of scamming and therefore also sometimes refrain from punishments being applied to users, unless it's a very clear case. There are several reasons for this: If the EpicBot staff is the jury in scam cases, corruption of staff members will be inevitable in the future as the market grows. First of all because there will be a need for more moderators in charge of the market, thus creating a less controlled environment, and second and most important of all is that moderators could be tempted to take money or have ulterior hidden motives to favor one in front of the other. Our community needs to be aware that trading of virtual items is always an event bringing risk into the situation. We want you to pay attention, thus not simply rely on the staff team to back you up in case something goes wrong, for example getting scammed. General Market Rules 1. EpicBot is not liable for any of your losses using our market and will not refund in any way, shape or form on behalf of members of our community. If you are scammed, you can post a report in the appropriate section. 2. No external links to other websites providing vouches or services are allowed, everything must be from within the EpicBot community. 3. EpicBot accounts are not to be sold, rented or shared. They are meant to be personal and not to be distributed from player to player. 4. Please keep in mind that the following items are not to be sold on the EpicBot Market for your own safety. Doing so, will result in immediate removal of your thread, and possibly more severe consequences depending on the item you're trying to promote: NSFW content Auths or cracks Torrents/Movies/Music PayPal accounts no limitation removal/verifications Virtual bank accounts Website invites Social network services or accounts Loans Blackhat tools Selling nude photos/web cam shows Microsoft software Amazon services Subscription accounts These rules can be changed at any time at Administrator discretion to punish you or delete your thread for any reason said Administrator sees fit.
    4 points
  15. These rules are to be followed at all times by all other community members. Breaking any rule can cause your account to be permanently suspended by EpicBot with or without warning. Rules 1. Offensive Language or Harassment There is to be nothing posted that could be seen as offensive by other members of the community. This includes, but is not limited to: Discrimination in any way, including sex, religion, race or ethnicity, nationality, sexual preference, or spiritual beliefs. Comments intended to hurt another member. Any disrespect towards other members of this community. 2. Excessive Spamming No post is allowed to be made that is completely unrelated to the topic or does not benefit the direct cause of the topic. Don't abuse our leniency. 3. Advertising Members are not allowed to post any URL to another community, commercial website, or bot. Doing so will result in a warning. Excessively spamming a URL will result in an immediate suspension of your account. 4. Personal Information No personal information of other member's is allowed to be posted on the forum, even with their permission. They must post it themselves if they wish for it to be. This includes, but is not limited to: Names Personal photos Instant Messaging Phone numbers Addresses E-mails Name relations from other communities or anywhere else 5. Pornographic Content No media, content, or talk will be posted regarding pornographic content. This means that no nudity is to be shown anywhere on the forum and talking about certain sites will result in a warning. 6. Client Links EpicBot's client link is not to be posted anywhere on this community, any other community, or otherwise made downloadable without the direct permission from EpicBot. This is our property, and legal action can be taken if re-distributed. 7. Script Content If you use someone else's work, you must have permission from them and must give full credit to their Intellectual Property. 8. Malicious Content No content that contains malware, trojans, or viruses is to be posted anywhere on the forum. This includes direct intent to DDoS another member of our community, any other community, or any other website. This will result in a temporary ban, or IP ban depending on the situation; further action may be taken, as this is also a federal offense. 9. Your Forum Account You are only allowed one forum account, all others will be banned. 10. Language This is an English only forum, you are free to use whatever language you want in private chat or personal messenger.
    4 points
  16. Pro Wintertodt Current Features: 🐨 Relight/Repair Brazier Support 🐨 🐨 Fletching Support 🐨 🐨 Custom food options 🐨 🐨 Custom play style options 🐨 🐨 1-50 Firemaking Mode 🐨 🐨 Ironman mode 🐨 🐨 Safespot support 🐨 Work in Progress: 🐨 Stop conditions 🐨 🐨 Profiles 🐨 🐨 Restocking 🐨 🐨 Loot Tracking 🐨
    3 points
  17. Pro NMZ <insert my fancy paint/gui/proggies here. They're great, just believe me.> Current Features: 🐨 Supports all bosses 🐨 🐨 World hopping 🐨 🐨 Complete potion support 🐨 🐨 Rock Cake Support 🐨 🐨 Rapid Heal Support 🐨 🐨 Prayer Support 🐨 Work in Progress: 🐨 Stop conditions 🐨 🐨 Profiles 🐨 🐨 Restocking🐨 🐨 Repairing/Recharging🐨 🐨 Attack style changing 🐨
    3 points
  18. Hi! New to these forums, but certainly not new to EB. I've been around since the beginning of EB. Been through various ups and downs with the community as a whole which will always have a place somewhere in me. Therefore I thought of checking what EB's like and I must say I am very pleased with what I see. The forums look sick! Well done @Euan. Some information about what I did for EB. Back in the day I was extremely active in the marketplace. I ran my own gold selling / buying services, have traded numerous accounts and eventually set up my own gold farming farm. My activity was picked up by then Head Market Mod and Super moderator Nstark who invited me to join as a staff member focussing on being a middleman at first (OMMV it was called). Eventually I became a moderator with main focus on market and non-rs related stuff. At some point in time the staff team was reorganized due to dissatisfaction of how EB was ran and dissatisfaction on the community as a whole. At that point I became a super moderator regulating all of the forums. @Eran was an S-mod at the time too, but did do admin-related stuff such as sponsorships. Eventually my interest in RS was gone and therefore I had no reason to do anything with EB. I became inactive and only now and then came back to say hi. Planning to stick around some more now! - Hadi
    3 points
  19. Pro Agility Features Supported courses: Gnome Stronghold Draynor rooftop Al Kharid rooftop Varrock rooftop Barbarian Outpost Canifis rooftop Ape Atoll Falador Wilderness Seers' village Pollnivneach Rellekka Ardougne Brimhaven Agility Arena Agility Pyramid Progressive-mode (walks to the next course upon reaching required agility level) Stop conditions Time - stop after a certain time has elapsed Level - stop when target agility level is reached Eats food Banks to retrieve new food Picks up Mark of Graces
    3 points
  20. Pro Looter Current Features: 🐨 Value-based looting 🐨 🐨 Distance-based looting 🐨 🐨 Supports instant mouse clicks 🐨 🐨 Popular preset areas 🐨 🐨 PvP Looting🐨 🐨 Profiles 🐨 🐨 Custom Area Options 🐨 🐨 Loot Tracking 🐨
    3 points
  21. Epicbot Setup guide by @Sellout Getting started Welcome to the Epicbot setup guide, this guide will show you how to get started with Epicbot. By the end of this guide you will know how to set up epicbot on your system and how to start your first bot. So let's get started shall we? For a video version of how to get started and use EpicBot see below: https://www.youtube.com/watch?v=y0iPXTxG50Q Creating a forum account The first thing you need to get started is a forum account, you can create one HERE. Once you have reached the website you can create a new account by clicking here: Once clicked you will be prompted with a page, here you can enter your details for account creation: When you have created an account an email will be sent to the filled in email. If you can't find it make sure you also check your spam folder. In this email there will be a link to register your account, once that is done we can start downloading the client once the account is fully registered. DISCLAIMER: Old Epicbot accounts won't work, this is a new client with a new team and website, the old Epic bot is no more Downloading the client When You have created your account you can start by downloading the Epicbot client HERE. Here you have an option between multiple operating systems: Download the file needed for your operating system. DISCLAIMER: If you can only use max 4GB of ram on windows, download the 64-bit version Extracting and installing the client Next thing we need to do is to extract the client. You can find the client in ‘C:\Users\Yourname\Downloads’. If you have trouble with that make sure to check THIS. Once extracted you can open the epic folder and you should see the following: Here click on the ‘Epicbot.exe’, this will prompt you with the following: The very first time it will start to download all the files it needs, give it a second. You can also change the amount of ram you want to use, this is named ‘Heap Size’ in the loader. Also, if you still have no forum account now is the right time to make one, we can't do the next step without it. When everything is ready and the ‘Launch’ button appears, press that button and you will see the following: Here you can fill in your credentials from the forums. You can either use the username or the creation email address in combination with your created password. If you have trouble with logging in, try to reset your password on the forums and try again. Using the client When everything is setup and you are logged in we can start using the client! The first thing you will see when you are logged in is this: Adding a Runescape account Before we can start botting we need to add the Runescape accounts we want to use, this is possible by clicking the button in the left right corner. Once pressed you should see the following: Here you are able to add a Runescape account by pressing the ‘Add’ button. Also you are able to edit and remove accounts already added. The ‘New Encryption Key’ will re-hash your password list. Once pressed you should see the following: Fill in the credentials of your desired runescape account. You can also specify the starting world and if the account is member or not. When everything is filled in you can press the ‘Add Account’ button to save the account the account database. Adding a proxy If you don’t feel like using your home IP you can use a proxy to mask it. Runescape only works with an Ipv4 Socks5 proxy, anything else will not be able to connect. To add a proxy click the button in the low left corner. Once clicked you should see the following: Here you are able to add you proxy by clicking the button. You can also edit or remove a proxy by first selecting it, and then pressing either ‘Edit’ or ‘Remove’. When you have clicked on that you will see this: Here you are able to fill in all the proxy settings you got from your proxy provider. Fill in the ip-address and port number and the optional username and password and hit the button. Now you have saved the proxy to the proxy database. After doing this you are able to select this proxy when adding a client. Adding a client Click on the green button underneath the house and the following will prompt: If you added a proxy in the last steps you are able to select that proxy from the dropdown menu. If you leave this blank Epicbot will use your home ip to connect to runescape. Once everything is filled in you can hit the button and a new client will spawn. Starting your first script So now that we have setup Epicbot and know how to start a new client, we now can start our first script. To start your first script press the play button in the top right of the client: Once clicked you will see the following: In the ‘Account’ tab you will be able to add the account you just added. You can also choose between different mouse profile speeds. There should be a plethora of different scripts for you to use. Select the script you want to use and press the ‘Start script’ Bugs When you encounter bugs in the scripts you are using or in the client then you can report them Here. Please make sure to use the given template when reporting a bug, this will make the bug fixing easier for your scripting buddies. End This is it for now. You now know how to get started with Epicbot. More information will be added along the way. Useful Links If you haven't joined the discord then feel free to do so! Website Here Forum Here Discord Here Download Here Bugs Here
    3 points
  22. Forth script release! 🎉 Do you like my free scripts? Please show your support: 🙂 ---------------- 👇 DISCLAIMER: This script is for EDUCATIONAL PURPOSES ONLY. It is to help other new scripters get an idea of how to approach writing scripts. If you use this script,⚠️you will more than likely face a quick ban in OSRS⚠️. This is a very easy first script to write, but also a very well-known method. Use at your own risk, and most importantly... learn from it. 🙂 VIDEO TUTORIAL: CODE: import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.GroundItem; import com.epicbot.api.shared.methods.*; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.webwalking.model.RSBank; import java.awt.*; @ScriptManifest(name = "Lumbridge Cowhide Collector by Zynava", gameType = GameType.OS) public class LumbridgeCowHideCollector extends LoopScript { /*** BEGIN VARIABLES ***/ public String status = ""; public IInventoryAPI myInventory() { return getAPIContext().inventory(); } public IWebWalkingAPI webWalking() { return getAPIContext().webWalking(); } public IBankAPI myBank() { return getAPIContext().bank(); } public ILocalPlayerAPI localPosition() { return getAPIContext().localPlayer(); } public IGroundItemsAPI groundItems() { return getAPIContext().groundItems(); } public Area COW_AREA = new Area(3244, 3295, 3262, 3277); /*** END VARIABLES ***/ @Override public boolean onStart(String... strings) { setStatus("Script starting"); return true; } @Override protected int loop() { if(myInventoryIsFull()) { setStatus("Heading to bank..."); bank(); if(myBank().isOpen()) { setStatus("Depositing inventory..."); if(myBank().depositInventory()) { myBank().close(); } } } if(!myInventoryIsFull() && !COW_AREA.contains(localPosition().getLocation())) { setStatus("Walking to cow field..."); webWalking().walkTo(COW_AREA.getRandomTile()); } if(!myInventoryIsFull() && COW_AREA.contains(localPosition().getLocation())) { GroundItem cowHide = groundItems().query().named("Cowhide").results().nearest(); if(cowHide != null) { setStatus("Gathering cowhide"); cowHide.interact("Take"); } } return 50; } public boolean myInventoryIsFull() { return myInventory().isFull(); } public void bank() { webWalking().walkTo(RSBank.LUMBRIDGE_TOP.getTile()); myBank().open(); } public void setStatus(String status) { this.status = status; } @Override protected void onPaint(Graphics2D g, APIContext ctx) { PaintFrame frame = new PaintFrame("Lumbridge Cowhide Collector by Zynava"); frame.addLine("Action being performed: ", status); frame.draw(g, 0, 170, ctx); } }
    3 points
  23. import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.NPC; import com.epicbot.api.shared.entity.Player; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.Random; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import java.awt.*; //Script Manifest stuff for your script selector @ScriptManifest(name = "sCowKiller", gameType = GameType.OS) public class main extends LoopScript { //instantiate variable to be used later. private Player local_Player; private long startTime; private State state; private String playerState; private int strengthLevel; private int percentTNL; private NPC cowNPC; @Override public boolean onStart(String... strings) { //when the script starts, startTime is set equal to the current millisecond which is used for the runtime later on. startTime = System.currentTimeMillis(); System.out.println("Starting sCowKiller!"); return true; } @Override protected void onPause() { playerState = "Script is paused"; getAPIContext().mouse().moveOffScreen(); } //An enum of all the States private enum State { QUERYING, FIGHTING, ENABLING_RUN } // A getter for the player's state and defining what causes the state to change private State getPlayerState() { if (getAPIContext().client().isLoggedIn() && getAPIContext().localPlayer().get() != null) { local_Player = getAPIContext().localPlayer().get(); if (local_Player.getAnimation() != -1) { state = State.FIGHTING; } else if (local_Player.getAnimation() == -1) { state = State.QUERYING; } else if (!getAPIContext().walking().isRunEnabled()) { state = State.ENABLING_RUN; } } return state; } private NPC getCowNPC() { return getAPIContext().npcs().query() //what we're querying for .nameMatches("Cow") .notInCombat() .animation(-1) .reachable() .results() .nearest(); } private void attack() { cowNPC.click(); getAPIContext().mouse().moveOffScreen(); } // The actual loop method @Override protected int loop() { if (!getAPIContext().client().isLoggedIn()) { return 500; } switch (getPlayerState()) { // switch case for setting player state case FIGHTING: playerState = "Fighting"; break; case QUERYING: playerState = "Querying"; break; case ENABLING_RUN: playerState = "Enabling run"; default: playerState = "ERROR"; break; } //shit for determining skill XP/Time to level/etc strengthLevel = getAPIContext().skills().strength().getCurrentLevel(); percentTNL = getAPIContext().skills().strength().getPercentToNextLevel(); if (getAPIContext().localPlayer().getInteracting() == null) { cowNPC = getCowNPC(); // if the local player is not interacting if (cowNPC != null && !cowNPC.isDead()) { //if the cow npc query is not dead attack(); // do the attack method if (local_Player.getInteracting() != null) { // if our player is interacting Time.sleep(6000, () -> cowNPC.isDead()); // sleep until cow npc is dead } if (local_Player.isMoving() || cowNPC.isInteractingWithMe() || local_Player.getInteracting() == null) { if (!getAPIContext().walking().isRunEnabled()) { if (getAPIContext().walking().getRunEnergy() >= Random.nextInt(55,100)) { getAPIContext().walking().setRun(true); } } else if (getAPIContext().walking().isRunEnabled()) { if (getAPIContext().walking().getRunEnergy() <= Random.nextInt(10,15)) { getAPIContext().walking().setRun(false); } } } } } return 200; } // paint shit. @Override protected void onPaint(Graphics2D g, APIContext ctx) { if (!getAPIContext().client().isLoggedIn()) { Time.sleep(15_000, () -> getAPIContext().client().isLoggedIn()); } if (getAPIContext().client().isLoggedIn()) { PaintFrame frame = new PaintFrame(); frame.setTitle("sCowKiller"); frame.addLine("Runtime: ", Time.getFormattedRuntime(startTime)); // we use startTime here from the very beginning frame.addLine("State: ", playerState); //we get whatever the player's state is equal to and print it onto the paint. frame.addLine("", ""); frame.addLine("Current Strength level: ", strengthLevel); frame.addLine("% to next level", percentTNL); frame.draw(g, 0, 90, ctx); //drawing the actual frame. g.setColor(new Color(208, 189, 155, 255)); g.fillRect(11, 468, 120, 15); //name covering stuff, honestly might remove it cuz kinda pointless? Dunno } } }
    3 points
  24. Worked a little bit on it: import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.SceneObject; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.model.Skill; import com.epicbot.api.shared.model.Tile; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.time.Time; import com.epicbot.api.shared.util.time.Timer; import java.awt.*; @ScriptManifest(name = "Woodcutting.retard", gameType = GameType.OS) public class F2PWoodcuting extends LoopScript { private long startTime; private int experienceGained, startExperience = 0; private final Timer experienceTimer = new Timer(5_000); private final Area BANK_AREA = new Area(new Tile(3165, 3486, 0), new Tile(3170, 3492, 0)); private final Area OAK_AREA = new Area(new Tile(3188, 3465, 0), new Tile(3197,3458,0)); @Override public boolean onStart(String... strings) { startTime = System.currentTimeMillis(); return true; } @Override protected int loop() { if ( !getAPIContext().inventory().contains("Bronze axe", "Iron axe", "Steel axe", "Black axe", "Mithril axe", "Adamant axe", "Rune axe", "Gilded axe", "Dragon axe", "3rd age axe", "Infernal axe", "Crystal axe") && !getAPIContext().equipment().contains("Bronze axe", "Iron axe", "Steel axe", "Black axe", "Mithril axe", "Adamant axe", "Rune axe", "Gilded axe", "Dragon axe", "3rd age axe", "Infernal axe", "Crystal axe")) { getAxe(); } if (getAPIContext().walking().getRunEnergy() > 30 && !getAPIContext().walking().isRunEnabled()){ getAPIContext().walking().setRun(true); } else { if (getAPIContext().inventory().isFull()) { bank(); } else { handleCalculations(); chop(); } } return 0; } public void getAxe() { if (!BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().walking().walkTo(BANK_AREA.getCentralTile()); System.out.println("Walking to bank"); Time.sleep(1000); } else if (BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { if (!getAPIContext().bank().isOpen()) { System.out.println("Trying to open bank"); getAPIContext().bank().open(); Time.sleep(4000, () -> getAPIContext().bank().isOpen()); } if (getAPIContext().bank().isOpen()) { System.out.println("Bank is open"); getAPIContext().bank().withdraw(1,"Bronze axe", "Iron axe", "Steel axe", "Black axe", "Mithril axe", "Adamant axe", "Rune axe", "Gilded axe", "Dragon axe", "3rd age axe", "Infernal axe", "Crystal axe"); Time.sleep(4000, () -> APIContext.get().inventory().contains("Bronze axe", "Iron axe", "Steel axe", "Black axe", "Mithril axe", "Adamant axe", "Rune axe", "Gilded axe", "Dragon axe", "3rd age axe", "Infernal axe", "Crystal axe")); System.out.println("Closing bank"); if (getAPIContext().bank().isOpen()){ getAPIContext().bank().close(); Time.sleep(1000); } if (getAPIContext().inventory().contains("Adamant axe")){ getAPIContext().inventory().interactItem("Wield" ,"Adamant axe"); Time.sleep(2000); } else if(getAPIContext().inventory().contains("Mithril axe")) { getAPIContext().inventory().interactItem("Wield" ,"Mithril axe"); Time.sleep(2000); } else{ getAPIContext().inventory().interactItem("Wield" ,"Bronze axe"); Time.sleep(2000); } } } } public void bank() { if (!BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().walking().walkTo(BANK_AREA.getCentralTile()); System.out.println("Walking to bank"); Time.sleep(1000); } else if (BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { if (!getAPIContext().bank().isOpen()) { System.out.println("Trying to open bank"); getAPIContext().bank().open(); Time.sleep(4000, () -> getAPIContext().bank().isOpen()); } if (getAPIContext().bank().isOpen()) { System.out.println("Bank is open"); getAPIContext().bank().depositAllExcept("Bronze axe", "Iron axe", "Steel axe", "Black axe", "Mithril axe", "Adamant axe", "Rune axe", "Gilded axe", "Dragon axe", "3rd age axe", "Infernal axe", "Crystal axe"); System.out.println("Closing bank"); getAPIContext().bank().close(); } } } public void chop() { if (!OAK_AREA.contains(getAPIContext().localPlayer().getLocation())) { System.out.println("Walking to oak area"); getAPIContext().walking().walkTo(OAK_AREA.getCentralTile()); Time.sleep(3000); } else if (!this.isChopping()) { SceneObject tree = getAPIContext().objects().query().nameContains(new String[]{"Oak"}).results().nearest(); if (tree != null && tree.interact()) { System.out.println("Chopping"); Time.sleep(4000, () -> getAPIContext().localPlayer().isAnimating()); } } } public boolean isChopping() { return getAPIContext().localPlayer().isAnimating() || getAPIContext().localPlayer().isMoving(); } // Credit to Pseudo for this function. private void handleCalculations() { if (startExperience == 0) { startExperience = getAPIContext().skills().get(Skill.Skills.WOODCUTTING).getExperience(); } else { if (!experienceTimer.isRunning()) { experienceGained = getAPIContext().skills().get(Skill.Skills.WOODCUTTING).getExperience() - startExperience; experienceTimer.reset(); } } } private int getExperienceGainedString() { return experienceGained; } @Override protected void onPaint(Graphics2D g, APIContext ctx) { PaintFrame pf = new PaintFrame(); pf.setTitle("Script by Michaud.retard"); pf.addLine("Runtime: ", Time.getFormattedRuntime(startTime)); pf.addLine("Experience Gain: ",getExperienceGainedString()); pf.addLine("Lv.",getAPIContext().skills().woodcutting().getCurrentLevel()); pf.draw(g, 4, 110, ctx); } } F2PWoodcuting.class
    3 points
  25. import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.SceneObject; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.time.Time; @ScriptManifest(name = "Alias", gameType = GameType.OS) public class Main extends LoopScript { private final static Area OAK_AREA = new Area(3172, 3422, 3159, 3411); private final static Area BANK_AREA = new Area(3185, 3439, 3180, 3431); @Override public boolean onStart(String... strings) { return true; } @Override protected int loop() { if (getAPIContext().inventory().isFull()) { bank(); } else { chop(); } return 100; } private void bank() { if (!BANK_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().walking().walkTo(BANK_AREA.getCentralTile()); } else if (!getAPIContext().bank().isOpen()) { if (getAPIContext().bank().open()) { Time.sleep(5_000, () -> getAPIContext().bank().isOpen()); } } else if (getAPIContext().bank().depositAll("Oak logs")) { Time.sleep(5_000, () -> getAPIContext().inventory().isEmpty()); } } private void chop() { if (!OAK_AREA.contains(getAPIContext().localPlayer().getLocation())) { getAPIContext().walking().walkTo(OAK_AREA.getCentralTile()); } else if (!isChopping()) { final SceneObject tree = getAPIContext().objects().query().nameContains("Oak").results().nearest(); if (tree != null) { if (tree.interact()) { Time.sleep(5_000, () -> getAPIContext().localPlayer().isAnimating()); } } } } private boolean isChopping() { return getAPIContext().localPlayer().isAnimating() || getAPIContext().localPlayer().isMoving(); } }
    3 points
  26. Hey everyone, as EpicBot is beginning anew I decided that I wanted to learn and begin publishing high quality scripts. Before I start on writing scripts my preliminary project is being able to capture the data produced from scripts. I wanted to share with you all a bit of my progress and gauge interest for this type of stuff. A REST API with endpoints for submitting data and then retrieving it was created. Currently the data is only being formatted into an image but there's a lot that can be expanded upon here. New data is sent as JSON, an example of a request would look like: URL: /stats/:botName Method: POST Body: { "user": "lone", "key": "secretkey" "stats": { "gp": 3500, "kills": 15, "runtime": 300, "attack": 1 } } Below is an example of data that has been added for the bot test bot and user lone. This data is from two separate runs. When a request is made to retrieve the data we do a sum of the columns With that the data is inserted into an SVG ( am all thumbs with gfx ) and sent back. Formatting for data like time, kills, and profit will be added. This work is still only local but my poc is running and you can see how it will work a little better. It takes the image below and replaces the tilde with a random number, you can see that live ( currently ) here Just want to throw out a big thanks to both proto and smile for their script guides, they will be a huge help to me as I get started.
    3 points
  27. Hello! This is my second script that I have ever written, so don't expect anything too crazy. It enchants sapphire rings for you, making 200k per hour. What you need : 1. Have cosmic runes in your inventory 2. Have sapphire rings in your bank From my intensive testing on 10+ accounts for 2 weeks, the script works flawlessly and it logs out when you run out of resources. If you want to see me writing the script and explaining what's what along the way, you can check out this video! import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.*; import com.epicbot.api.shared.event.ChatMessageEvent; import com.epicbot.api.shared.methods.ITabsAPI; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.model.Skill; import com.epicbot.api.shared.model.Spell; import com.epicbot.api.shared.model.Tile; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.Random; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import sun.security.action.GetBooleanAction; import javax.imageio.ImageIO; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; @ScriptManifest(name = "Recoil FACTORY", gameType = GameType.OS) public class main extends LoopScript { public boolean needsToBank() { return !getAPIContext().inventory().contains("Cosmic rune") || !getAPIContext().inventory().contains("Sapphire ring"); } public boolean needsToOpenBank() { return !getAPIContext().bank().isOpen(); } public void openBank() { if (getAPIContext().magic().isSpellSelected()) { getAPIContext().mouse().click(450, 265); } else { getAPIContext().bank().open(); } } public boolean shouldLogOut() { return getAPIContext().bank().getCount("Sapphire ring") == 0 || getAPIContext().inventory().getCount("Cosmic rune") == 0; } public void logOut() { if (getAPIContext().bank().isOpen()) { getAPIContext().bank().close(); } getAPIContext().game().logout(); getAPIContext().script().stop("Das it bro, was it worth it?"); } public boolean doesNeedToDeposit() { return getAPIContext().inventory().getCount("Ring of recoil") == 27; } public void depositRings() { getAPIContext().bank().depositAllExcept("Cosmic rune"); } public boolean needsWithdrawSapphirerings() { return getAPIContext().inventory().getCount("Ring of recoil") == 0 && getAPIContext().inventory().getCount("Sapphire ring") == 0; } public void withdrawSapphireRing() { getAPIContext().bank().withdrawAll("Sapphire ring"); } public boolean needsToEnchant() { return getAPIContext().inventory().contains("Cosmic Rune") && getAPIContext().inventory().contains("Sapphire ring"); } public void enchantsRings() { int count = getAPIContext().inventory().getCount(true, "Ring of recoil"); if (!getAPIContext().magic().isSpellSelected()) { if (getAPIContext().magic().cast(Spell.Modern.LEVEL_1_ENCHANT)) { Time.sleep(500, 1000, () -> getAPIContext().magic().isSpellSelected()); } } else { ItemWidget ring = getAPIContext().inventory().getItem("Sapphire ring"); if (ring != null) { if (ring.interact()) { Time.sleep(500, 1000, () -> getAPIContext().inventory().getCount(true, "Ring of recoil") > count); } } } } public final String formatTime(long ms) { long s = ms / 1000, m = s / 60, h = m / 60, d = h / 24; s %= 60; m %= 60; h %= 24; return d > 0 ? String.format("%02d:%02d:%02d:%02d", d, h, m, s) : h > 0 ? String.format("%02d:%02d:%02d", h, m, s) : String.format("%02d:%02d", m, s); } @Override public boolean onStart(String... strings) { System.out.println("Lets enchant some rings"); return true; } @Override protected int loop() { if (!getAPIContext().client().isLoggedIn()) { System.out.println("hold up till you are logged in mayne"); return 300; } if (needsToBank() && needsToOpenBank()) { System.out.println("Opening bank"); openBank(); return 300; } if (getAPIContext().bank().isOpen()) { if (doesNeedToDeposit()) { System.out.println("Depositing rings"); depositRings(); return 200; } if (shouldLogOut()) { logOut(); } if (needsWithdrawSapphirerings()) { System.out.println("Withdrawin the rings"); withdrawSapphireRing(); return 1000; } else { getAPIContext().bank().close(); return 200; } } if (needsToEnchant()) { System.out.println("Enchanting rings"); enchantsRings(); return 200; } if (needsToBank()) { System.out.println("Bankin"); openBank(); return 200; } if (doesNeedToDeposit()) { depositRings(); return 200; } return 200; } }
    3 points
  28. Hey Umbringen, I just wrote up a Free Essence Miner script which should be up later today. Check it out. Thanks, Sean
    3 points
  29. This is a simple class that can be used to convert String names into Item ID's or visa versa There are a few edge cases where there is more than one ID for the same item so that is a possibility if you're using this. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class ItemConverter { private final static String URL = "https://rsbuddy.com/exchange/summary.json"; private final JsonObject json; public ItemConverter() { this.json = new JsonParser().parse(getJson()).getAsJsonObject(); } public int getID(final String item) { for (String key : json.keySet()) { final JsonObject obj = json.get(key).getAsJsonObject(); if (obj.get("name").getAsString().equals(item)) { return obj.get("id").getAsInt(); } } return -1; } public String getName(final int itemId) { for (String key : json.keySet()) { final JsonObject obj = json.get(key).getAsJsonObject(); if (obj.get("id").getAsInt() == itemId) { return obj.get("name").getAsString(); } } return ""; } private String getJson() { try { final URL url = new URL(URL); final BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String inputLine; String out = null; while ((inputLine = in.readLine()) != null) { out = inputLine; } in.close(); return out; } catch (IOException e) { e.printStackTrace(); } return null; } }
    3 points
  30. Epicbot is scheduling downtime for the next 2 days (12/22 and 12/23) and will be back in time for Christmas. Please note you will not be able to login to the bot during this time, but you can post on our forums or join our discord here: https://discord.gg/epicbot Thanks for your patience while we upgrade some systems and push out some release-ready work on our end.
    3 points
  31. Added Added Added Added Added Added Added Added --- As for the rest, will be manually checking everyone else soon and will add some more people today!
    3 points
  32. It is funny to see a koala making a firemaking script, after all that happened to them 🤯 But lt looks dope AF an will deffo use ❤️
    3 points
  33. Pro Quester Available here: A new quest will be added every week. If you have any suggestions for quests please let me know. Current supported quests: F2P Quests: Quest Name Quest Points Cook's Assistant 1 Doric's Quest 1 Ernest the Chicken 4 Goblin Diplomacy 5 Imp Catcher 1 Restless Ghost 1 Romeo and Juliet 5 Rune Mysteries 1 Sheep Shearer 1 Vampire Slayer 3 X Marks the Spot 1 The Knight's Sword 1 P2P Quests: Quest Name Quest Points Black Knights' Fortress 3 Clock Tower 1 Druidic Ritual 4 Dwarf Cannon 1 Eagles' Peak 2 Enter the Abyss 1 Fishing Contest 1 Gertrude's Cat 1 Hazeel Cult 1 Lost City 3 Monk's Friend 1 Nature Spirit 2 Plague City 1 Priest in Peril 1 Temple of the Eye 1 The Feud 1 Tree Gnome Village 2 Waterfall Quest 1 Witch's Potion 1 Dragon Slayer I 1 The Grand Tree 5 Jungle Potion 1 Shilo Village 2 Total quest points: 63
    2 points
  34. Simple tutorial for you today, I'll be showing you how to compile a script without needing an IDE (ideal for non-scripters/programmers who would like to use a local script or two). 1. If you haven't already, copy and paste the code for the script you want into your favourite text editor. (Notepad works fine). 2. Save the script manually and ensure you set the name exactly as shown below, adding .java on to the end. (Also ensure you're saving as 'All files' not as a '.txt' document). TIP: The name of the script you're compiling can be found like so: The name of the script is the portion highlighted in yellow above (Note: it's case sensitive!). This part of the script will be near the top of the java file for future reference when trawling for the script name. Now save the script like so: Ensure you have the .java file extension written in, and it isn't saved as a standard text document. 3. Load this website. 4. Select the newly saved script file(s) as your 'Source file' , and use the 'epicbot-api-1.x.jar' as your 'Jar file'. It can be found at "C:\Users\YOUR_NAME\EpicBot\dependencies". Your page should now look something like so: If so, you can now hit compile. (The compilation may take a few seconds). 5. Download the newly compiled class file(s) (if it's more than one you can download the .zip supplied and extract it) and move them to: "C:\Users\YOUR_NAME\EpicBot\Scripts". 6. If you followed the steps correctly, your script(s) should now be present in the Script Selector within EpicBot. Happy botting! If you hit any issues or have any queries, post below.
    2 points
  35. Hey! I've successfully completed my first script on any bot client! 🤑 I've open sourced it as I'd like to learn more and improve. https://github.com/SkrrtNick/SkrrtFishnCook The script will grab a fishing net from the fish tutor, and then will fish shrimp and anchovies depending on level and will cook them at the range in lumby. There's only room for improvement, feedback would be appreciated. Obvious disclaimer: the accounts using this script will likely get banned quickly as I haven't implemented anything to prevent the bot acting bot like. Big thanks to @smile who helped me with a few issues
    2 points
  36. Do you like my free scripts? Please show your support and Buy Me a Coffee! ☕ Hi, first script here. 🙂 Originally written by Edwardino, but with a few improvements. See the top comments "CHANGES" in the code for main features. HOW TO USE: Have the equal desired amount of Cosmic Runes in your inventory & the equal amount of the items you need enchanting in your bank before starting the script. * Change these lines to match the object being enchanted & the enchanted item: public String itemToBeEnchanted = "Emerald amulet"; public String enchantedItem = "Amulet of defence"; * Change this method to establish which enchantment level you're working with: public void CAST_ENCHANT() { Time.sleep(500, 100, () -> myMagicBook().cast(Spell.Modern.LEVEL_2_ENCHANT)); // Example: Spell.Modern.LEVEL_3_ENCHANMENT for Lv-3 Enchant } CODE: import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.ItemWidget; import com.epicbot.api.shared.methods.*; import com.epicbot.api.shared.model.Spell; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.time.Time; @ScriptManifest(name = "Improved Enchanter by Zynava", gameType = GameType.OS) public class ImprovedEnchanter extends LoopScript { /** * * THIS BOT IS BUILT FOR ENCHANTING LV-1 - LV-4 * However... While it doesn't track the other runes for higher level enchantments, it will still work if you have them. * * CREDITS: * Original script author -> Edwardino * Improvement author -> Zynava * * CHANGES: * - Improved readability of code * - Easy-to-alter items being enchanted via script * * See 'itemToBeEnchanted', 'enchantedItem' & 'CAST_ENCHANT()' below * - Grouped relevant methods together, labeled. * - Added sleep methods to reduce the amount of buggy clicks **/ // CHANGE THESE TO WHATEVER YOU'RE WORKING WITH public String itemToBeEnchanted = "Emerald amulet"; public String enchantedItem = "Amulet of defence"; public String COSMIC_RUNES = "Cosmic rune"; public void CAST_ENCHANT() { Time.sleep(500, 100, () -> myMagicBook().cast(Spell.Modern.LEVEL_2_ENCHANT)); } // BEGIN METHODS FOR NESTED REFERENCES public IClientAPI myClient() {return getAPIContext().client();} public IBankAPI myBank() {return getAPIContext().bank();} public IInventoryAPI myInventory() {return getAPIContext().inventory();} public IMagicAPI myMagicBook() {return getAPIContext().magic();} public IGameAPI myGame() {return getAPIContext().game();} public IScriptAPI myScript() {return getAPIContext().script();} // END METHODS FOR NESTED REFERENCES /********************************************************** *********************BANKING METHODS********************** **********************************************************/ // Do I need to bank? (Checks for necessary supplies in inventory) public boolean botNeedsToBank() { boolean doesHaveSupplies = !myInventory().contains(COSMIC_RUNES) || !myInventory().contains(itemToBeEnchanted); return doesHaveSupplies; } // Do I need to OPEN the bank? public boolean needsToOpenBank() { return !myBank().isOpen(); } // Open the bank public void openBank() { System.out.println("Opening bank."); myBank().open(); } // Close the bank public void closeBank() { System.out.println("Closing bank."); myBank().close(); } // Do I need to deposit? public boolean shouldDeposit() { return myInventory().getCount(enchantedItem) > 0; } // Deposit all items except runes public void depositEnchantedItems() { System.out.println("Depositing enchanted items."); myBank().depositAll(enchantedItem); } // Can withdraw more of the item I'm enchanting? public boolean shouldWithdraw() { return myInventory().getCount(itemToBeEnchanted) == 0 && myBank().getCount(itemToBeEnchanted) > 0; } // Withdraw items public void withdrawItems() { System.out.println("Withdrawing items to be enchanted."); myBank().withdraw(27, itemToBeEnchanted); } /********************************************************** *********************ENCHANTING METHODS******************* **********************************************************/ // Should I begin enchanting? public boolean shouldEnchant() { boolean hasSupplies = myInventory().contains(itemToBeEnchanted) && myInventory().contains(COSMIC_RUNES); return hasSupplies; } // Begin enchanting public void enchantItem() { System.out.println("Enchanting..."); CAST_ENCHANT(); ItemWidget item = myInventory().getItem(itemToBeEnchanted); if(item != null) { item.interact(); Time.sleep(1000); } } @Override public boolean onStart(String... strings) { System.out.print("Starting Improved Enchanter script..."); return true; } @Override protected int loop() { if(!myClient().isLoggedIn()) { System.out.println("Please wait until you are logged in."); } // First checks supplies & if bank needs to be opened if(botNeedsToBank() && needsToOpenBank()) { openBank(); } // If bank is open: // Deposits and/or Withdraws as needed // Closes bank after // If there's no more to withdraw // Close bank, logout, end script if(myBank().isOpen()) { if(shouldDeposit()) { depositEnchantedItems(); } if(shouldWithdraw()) { withdrawItems(); closeBank(); Time.sleep(1000); } else { closeBank(); myGame().logout(); Time.sleep(800); myScript().stop("Script stopping..."); } } // Enchants if there's items needing to be enchanted if(shouldEnchant()) { enchantItem(); } return 200; } }
    2 points
  37. Friendly Father of 3, Gamer, Chef, Streamer (twitch) and youtuber. If i can help people i will, if i cant i find a way of helping in what way i can. me
    2 points
  38. I have got to let you know that this is my first time trying to do anything even closely related to programming, so don't expect anything crazy. This is just a simple flax picker that picks flax, goes to spin the flax into bowstrings and then banks them. After that its on repeat. I created this because I am running a Youtube series about botting my ironman account and I really wanted to do bowstrings to alch the bows later. No way was I gonna do it by hand - that's why this script was created. Start the script anywhere near Seers Village. If you want to be safe, start it in the bank to be sure. Make sure you have an empty inventory before running it. From my own testing the script runs without any issues. If you do encounter any - please let me know! import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.Player; import com.epicbot.api.shared.entity.SceneObject; import com.epicbot.api.shared.entity.WidgetChild; import com.epicbot.api.shared.entity.WidgetGroup; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.model.Tile; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import sun.security.action.GetBooleanAction; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; @ScriptManifest(name = "Ed's Kush Picker", gameType = GameType.OS) public class main extends LoopScript { private final Area flaxField = new Area(2751, 3437, 2739, 3451); private final Area seersBank = new Area(2729, 3490, 2721, 3493); private Player local; private SceneObject flax; private final Tile spinRoom = new Tile(2771, 3471, 1); private SceneObject spinningWheel; private final Tile ladderTile = new Tile(2715, 3471, 0); private final Area stairRoom = new Area(2711, 3470, 2715, 3472); private final long spinTimeOut = 3000; private long startTime; private long lastSpin = 0; private long runTime = System.currentTimeMillis() - startTime; private int counter = 0; public boolean NeedsToBank() { return getAPIContext().inventory().isFull() && getAPIContext().inventory().contains("Bow string") && !seersBank.contains(local); } public void walksToBank() { getAPIContext().webWalking().walkToBank(); } public boolean needsToOpenBank() { return !getAPIContext().bank().isOpen(); } public void openBank() { getAPIContext().bank().open(); } public boolean doesNeedToDeposit() { return getAPIContext().bank().isOpen() && !getAPIContext().inventory().isEmpty(); } public void depositAll() { counter = counter + 28; getAPIContext().bank().depositInventory(); } public boolean needsToWalkToFlax() { local = getAPIContext().localPlayer().get(); return !getAPIContext().inventory().isFull() && !flaxField.contains(local); } public void walkFlaxField() { getAPIContext().webWalking().walkTo(flaxField.getRandomTile()); } public boolean shouldPick() { local = getAPIContext().localPlayer().get(); return flaxField.contains(local) && !getAPIContext().inventory().isFull(); } public boolean needsToWalkToSpin() { local = getAPIContext().localPlayer().get(); return getAPIContext().inventory().isFull() && getAPIContext().inventory().contains("Flax") && local.getPlane() != 1; } public void walksToSpin() { SceneObject ladder = getAPIContext().objects().query().nameMatches("Ladder").results().nearest(); if (!stairRoom.contains(local)) { getAPIContext().webWalking().walkTo(ladderTile); } else { getAPIContext().objects().query().nameMatches("Ladder").results().nearest().interact("Climb-up"); } } public boolean shouldSpin() { local = getAPIContext().localPlayer().get(); return local.getPlane() == 1 && getAPIContext().inventory().contains("Flax"); } public final String formatTime(long ms) { long s = ms / 1000, m = s / 60, h = m / 60, d = h / 24; s %= 60; m %= 60; h %= 24; return d > 0 ? String.format("%02d:%02d:%02d:%02d", d, h, m, s) : h > 0 ? String.format("%02d:%02d:%02d", h, m, s) : String.format("%02d:%02d", m, s); } //========================================================================================================================== private SceneObject getFlax() { return getAPIContext().objects().query().nameMatches("Flax").actions("Pick").results().nearest(); } private void pick() { flax = getFlax(); if (flax != null) { flax.interact("Pick"); } } private SceneObject getSpinning() { return getAPIContext().objects().query().nameMatches("Spinning wheel").results().nearest(); } private void spin() { if (getAPIContext().localPlayer().getAnimation() == 894) { lastSpin = System.currentTimeMillis(); } if (notSpinning()) { System.out.println("memes plz work"); WidgetGroup spinInterface = getAPIContext().widgets().get(270); spinningWheel = getSpinning(); if (spinInterface != null && spinInterface.isVisible()) { System.out.println("pressing 3"); getAPIContext().keyboard().sendKey(51); lastSpin = System.currentTimeMillis(); } else if (spinningWheel != null) { System.out.println("tryna spin"); if (spinningWheel.interact("Spin")) { Time.sleep(9000, () -> getAPIContext().widgets().get(270).isVisible()); } } } } private boolean notSpinning() { return System.currentTimeMillis() - lastSpin > spinTimeOut; } @Override public boolean onStart(String... strings) { System.out.println("FlaxPickSpinOP"); startTime = System.currentTimeMillis(); return true; } //============================================================================================================ private BufferedImage bg = downloadImage("https://i.imgur.com/uesM6ze.png"); @Override protected void onPaint(Graphics2D g, APIContext a) { long runTime = System.currentTimeMillis() - startTime; g.drawImage(bg, 0, getAPIContext().game().getViewportHeight() - 165, null); PaintFrame frame = new PaintFrame("It Just 'Works'"); frame.addLine("Kush Manicured", counter); frame.addLine(formatTime(runTime), ""); frame.draw(g, 293, getAPIContext().game().getViewportHeight() - 63, getAPIContext()); } // function to parse the image public BufferedImage downloadImage(String url) { try { HttpURLConnection conn; conn = (HttpURLConnection)(new URL(url.replaceAll(" ", "%20")).openConnection()); conn.setInstanceFollowRedirects(false); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"); conn.setRequestProperty("Accept", "ttext/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"); conn.setRequestProperty("Accept-Language", "en-us,en;q=0.5"); conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); conn.setRequestProperty("Keep-Alive", "300"); conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestMethod("GET"); return ImageIO.read(conn.getInputStream()); } catch(IOException e1) { return null; } } @Override protected int loop() { if (!getAPIContext().client().isLoggedIn()) { System.out.println("hold up till you are logged in mayne"); return 300; } if (needsToWalkToFlax()) { System.out.println("Walking to the fields"); walkFlaxField(); } else if (shouldPick()) { System.out.println("Picking up the DANK KUSH"); pick(); } else if (needsToWalkToSpin()) { System.out.println("On my way to spin my KUSH"); walksToSpin(); } else if (shouldSpin()) { System.out.println("Processing the KUSH"); System.out.println("Smells nice"); spin(); } else if (NeedsToBank()) { System.out.println("Walkin to the Dank Bank"); System.out.println("Sneaky Beaky Style"); walksToBank(); } else if (needsToOpenBank()) { System.out.println("Opening Dank Bank"); openBank(); } else if (doesNeedToDeposit()) { System.out.println("Depositing Dank"); depositAll(); } else { getAPIContext().script().stop("get danker"); } return 2000; } }
    2 points
  39. one hell of a script!
    2 points
  40. Start date: 3/29/2021 Accounts = 25 Bans = 18 Sold = 0 Total lvl's = 513 Locked = 4 6/19/21: I know I've been gone for a month but I still have been working on the farm. I just have run into a few things at home that needed my full attention first. I'm back and my goal currently is to get a few account mems ready for wintertodt (wc - 30 fm - 45), then the first few days Ill be Training (thev - 200 cakes agil - 30 fm - 50) I'm aiming for 8 accounts in total most likely mean ill have to hand t play each of them a lot thank you OSRS mobile. Spreading out the workload over a 8 account working on a every other day schedule. I'm doing this because currently I'm working on a way to run more through a residential IP address.
    2 points
  41. I've been learning python for the last year but wanted to try to learn java/scripting so this was a quick project to get familiar with java syntax, scripting api, etc. I know there's a lot to clean up but if you see any bad practices or have any tips I would appreciate it. ❤️ Start with an empty inventory in the draynor village bank. 45 minute progress report: https://imgur.com/lEm8r4g import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.GroundItem; import com.epicbot.api.shared.entity.Player; import com.epicbot.api.shared.entity.SceneObject; import com.epicbot.api.shared.model.Area; import com.epicbot.api.shared.model.Tile; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import com.epicbot.api.shared.webwalking.model.RSBank; import javafx.scene.Scene; import java.awt.*; @ScriptManifest(name = "Gavin's Tinderbox Collector", gameType = GameType.OS) public class main extends LoopScript { private final Tile stairsTile = new Tile(3089, 3251, 0); private final Tile bookcaseTile = new Tile(3093, 3253, 1); private final Area mansRoom = new Area (new Tile(3089, 3251, 0), new Tile(3087, 3252, 0)); private final Area draynorBank = new Area (new Tile(3092, 3246, 0), new Tile(3094, 3240, 0)); private final int fullInventory = 10; private int tinderboxes = 0; private int tinderboxCounter = 0; private long startTime; private long profit; public boolean needsToBank() { System.out.println("Checking if we need to bank!"); if (getAPIContext().inventory().getCount() == fullInventory) { System.out.println("We need to bank!"); return true; } else { System.out.println("We dont need to bank"); return false; } } public void bank_tinderboxes() { System.out.println("First line of bank_tinderboxes()"); System.out.println(draynorBank.contains(getAPIContext().localPlayer().getLocation())); if (getAPIContext().localPlayer().getPlane() != 0 && getAPIContext().objects().query().nameMatches("Staircase").results().nearest() != null) { System.out.println("Climbing down the stairs"); getAPIContext().camera().turnTo(getAPIContext().objects().query().id(16669).results().nearest().getLocation()); if (getAPIContext().objects().query().id(16669).results().nearest().interact("Climb-down")) { Time.sleep(5000, () -> getAPIContext().localPlayer().getPlane() == 0); } // Time.sleep(5_000, () -> getAPIContext().objects().query().id(16669).results().nearest().interact("Climb-down")); } if (getAPIContext().objects().query().nameMatches("Door").results().nearest().hasAction("Open") && !draynorBank.contains(getAPIContext().localPlayer().getLocation()) && !getAPIContext().localPlayer().isMoving()) { System.out.println("Opening the door"); getAPIContext().objects().query().nameMatches("Door").results().nearest().interact("Open"); } else if (!draynorBank.contains(getAPIContext().localPlayer().getLocation()) && !getAPIContext().localPlayer().isMoving()){ System.out.println("Door is open, walking to bank."); getAPIContext().webWalking().walkToBank(RSBank.DRAYNOR); Time.sleep(5000, () -> draynorBank.contains(getAPIContext().localPlayer().getLocation())); } else if (draynorBank.contains(getAPIContext().localPlayer().getLocation())){ System.out.println("We're in the bank. Continuing banking."); if (!getAPIContext().bank().isOpen()) { if (getAPIContext().bank().open()) { Time.sleep(5000, () -> getAPIContext().bank().isOpen()); } } else if (getAPIContext().inventory().getCount() == fullInventory) { System.out.println("Depositing items"); if (getAPIContext().bank().depositInventory()) { Time.sleep(5_000, () -> getAPIContext().inventory().isEmpty()); } tinderboxCounter += fullInventory; profit = (tinderboxCounter * 90); } } System.out.println("Banking finished."); tinderboxes = 0; } public boolean needsToTravel() { Tile myTile = getAPIContext().localPlayer().getLocation(); if (getAPIContext().inventory().isEmpty() && !myTile.equals(bookcaseTile)) { return true; } else { return false; } } public void travelToBookcase() { Tile myTile = getAPIContext().localPlayer().getLocation(); Tile outsideTile = new Tile (3088, 3250, 0); if (myTile.equals(bookcaseTile)) { System.out.println("We're at the bookcase tile!"); } else if (getAPIContext().localPlayer().getPlane() == 1 && !myTile.equals(bookcaseTile) && !getAPIContext().localPlayer().isMoving()) { System.out.println("We're walking to the bookcase tile."); if (getAPIContext().walking().walkTo(getAPIContext().objects().query().id(7073).results().nearest().getLocation())) { Time.sleep(1000, 1200, () -> getAPIContext().localPlayer().getLocation().equals(getAPIContext().objects().query().id(7073).results().nearest().getLocation())); } } else if (!mansRoom.contains(myTile) && getAPIContext().objects().query().nameMatches("Door").results().nearest().hasAction("Open")) { getAPIContext().walking().walkTo(outsideTile); getAPIContext().objects().query().nameMatches("Door").results().nearest().interact("Open"); System.out.println("We're walking to the stairs tile."); getAPIContext().webWalking().walkTo(stairsTile); Time.sleep(5_000, () -> getAPIContext().objects().query().nameMatches("Staircase").results().nearest().interact("Climb-up")); } else if (getAPIContext().walking().walkTo(stairsTile)) { Time.sleep(5000, () -> getAPIContext().localPlayer().getLocation().equals(stairsTile)); if (getAPIContext().objects().query().nameMatches("Staircase").results().nearest().interact("Climb-up")) { Time.sleep(7000, () -> getAPIContext().localPlayer().getPlane() == 1); } } } public void gather_tinderboxes() { System.out.println("Time to get our tinderboxes!"); SceneObject Bookshelf = getAPIContext().objects().query().id(7073).results().nearest(); GroundItem Tinderbox = getAPIContext().groundItems().query().nameMatches("Tinderbox").results().nearest(); while (tinderboxes != fullInventory) { // Time.sleep(500, 1000); // It will spam click the bookcase otherwise if (getAPIContext().inventory().isEmpty()) { System.out.println("Searching bookshelf"); getAPIContext().camera().turnTo(getAPIContext().objects().query().id(7073).results().nearest().getLocation()); if (Bookshelf.interact("Search")) { Time.sleep(3000, 4000, () -> getAPIContext().inventory().getCount() == 1); } } if (getAPIContext().inventory().getCount() > 0) { System.out.println("Stole a tinderbox! time to drop it"); if (getAPIContext().inventory().dropItem("Tinderbox")) { Time.sleep(2000,4000, () -> getAPIContext().inventory().getCount() == 0); tinderboxes++; } } } if (getAPIContext().inventory().getCount() <= fullInventory && getAPIContext().groundItems().query().nameMatches("Tinderbox").results().nearest() != null) { System.out.println("Time to pickup our tinderboxes."); getAPIContext().camera().turnTo(getAPIContext().objects().query().id(7082).results().nearest()); if (getAPIContext().groundItems().query().nameMatches("Tinderbox").results().nearest().interact("Take")) { Time.sleep(150, 250, () -> getAPIContext().inventory().getCount() == tinderboxes); } } } @Override protected int loop() { if (needsToBank()) { bank_tinderboxes(); } else if (needsToTravel()){ travelToBookcase(); } else { gather_tinderboxes(); } return 500; } @Override public boolean onStart(String... strings) { System.out.println("Now running: " + getManifest().name()); startTime = System.currentTimeMillis(); if (!getAPIContext().walking().isRunEnabled()) { System.out.println("Turning on running."); if (getAPIContext().walking().setRun(true)) { Time.sleep(2000, () -> getAPIContext().walking().isRunEnabled()); } } return true; } @Override protected void onPaint(Graphics2D g, APIContext ctx){ long runningTime = System.currentTimeMillis() - startTime; long profitPerHour = (int) (profit * 3600000.0D / runningTime); PaintFrame pf = new PaintFrame(); pf.setTitle("Gavin's Tinderbox Collector"); pf.addLine("Runtime: ", Time.getFormattedRuntime(startTime)); pf.addLine("Tinderboxes Collected: ", tinderboxCounter); pf.addLine("GP Earned: ", profit); pf.addLine("GP/Hr: ", profitPerHour); pf.draw(g, 0, 90, ctx); } }
    2 points
  42. I'll try and add it today
    2 points
  43. This API is an open source API that anyone can contribute to, I will probably be checking 1-3 times a month for contributions so if you don't see your change added right away, I probably haven't checked. Follow the guidelines I have on the README.md and everything should be fine If anyone has any questions message me on discord or in the scripting channel in the Epicbot discord. Github link
    2 points
  44. this is sellout speaking and the above meme is inaccurate
    2 points
  45. Another release for everyone. Features: - Fletches headless arrows from level 1-20 fletching (Have approx 5k arrow shafts and feathers banked). - Fletches the best possible bow (short and long) for it's level, progressively, from Oak shortbows all the way to Magic longbows. - Stops if it detects we're out of the necessary supplies. (Have more than enough of each log required for the progression if you intend on leaving it run for a long time unmonitored). import com.epicbot.api.shared.APIContext; import com.epicbot.api.shared.GameType; import com.epicbot.api.shared.entity.ItemWidget; import com.epicbot.api.shared.entity.WidgetChild; import com.epicbot.api.shared.model.Skill; import com.epicbot.api.shared.script.LoopScript; import com.epicbot.api.shared.script.ScriptManifest; import com.epicbot.api.shared.util.details.Completable; import com.epicbot.api.shared.util.paint.frame.PaintFrame; import com.epicbot.api.shared.util.time.Time; import com.epicbot.api.shared.util.time.Timer; import java.awt.*; import java.awt.event.KeyEvent; @ScriptManifest(name = "Λ Progressive Fletcher", gameType = GameType.OS) public class LambdaProgressiveFletcher extends LoopScript { private final Timer runTimer = new Timer(0); private final Timer experienceTimer = new Timer(5000); private Timer idleTimer = null; private final double version = 0.1; private int experienceGained, startExperience = 0; private final PaintFrame paintFrame = new PaintFrame(); private String status = ""; @Override protected int loop() { if (getAPIContext().client().isLoggedIn()) { handleCalculations(); doTasks(); } return 50; } private enum Task { FLETCHING, BANKING; @Override public String toString() { return this.name().toLowerCase(); } } private void handleCalculations() { if (startExperience == 0) { startExperience = getAPIContext().skills().get(Skill.Skills.FLETCHING).getExperience(); } else { if (!experienceTimer.isRunning()) { experienceGained = getAPIContext().skills().get(Skill.Skills.FLETCHING).getExperience() - startExperience; experienceTimer.reset(); } } } private void doTasks() { status = getCurrentTask().toString(); switch (getCurrentTask()) { case FLETCHING: doFletching(); break; case BANKING: doBanking(); break; } } private void buildPaintTitle() { paintFrame.setTitle(getManifest().name() + " v" + version); paintFrame.setColumnValueSpacing(0); } private boolean isFletching() { if (!hasInputItems() || idleTimer == null || idleTimer.getElapsed() >= getRandomNumber(2500, 4000)) return false; if (getAPIContext().localPlayer().getAnimation() != -1) { idleTimer = new Timer(0); return true; } return true; } private boolean hasInputItems() { return getAPIContext().inventory().contains(getFletchingMethod().getItemsRequired()); } private void doBanking() { if (getAPIContext().bank().isOpen()) { if (hasRequiredItemsInInventoryOrBank()) { if (getAPIContext().inventory().getCount() > 27) { if (getAPIContext().bank().depositAllExcept("Knife")) { Time.sleep(1800, () -> getAPIContext().inventory().getCount() <= 27); } } else { if (getFletchingMethod().getOutputName().contains("arrow")) { withdrawItem(getFletchingMethod().getItemsRequired()[0], 0); withdrawItem(getFletchingMethod().getItemsRequired()[1], 0); } else { withdrawItem("Knife", 1); withdrawItem(getFletchingMethod().getItemsRequired()[0], 0); } } } else { stop("We don't have the required items!"); } } else { if (getAPIContext().bank().open()) { Time.sleep(2400, () -> getAPIContext().bank().isOpen()); } } } private boolean withdrawItem(String itemName, int amount) { if (!getAPIContext().inventory().contains(itemName)) { if (amount == 0) { getAPIContext().bank().withdrawAll(itemName); } else { getAPIContext().bank().withdraw(amount, itemName); } } return Time.sleep(1000, 2000, () -> hasItem(itemName)); } private boolean hasItem(String itemName) { return getAPIContext().inventory().contains(itemName); } private boolean itemExistsInInventoryOrBank(String item) { return getAPIContext().inventory().contains(item) || getAPIContext().bank().contains(item); } private boolean hasRequiredItemsInInventoryOrBank() { for (String item : getFletchingMethod().getItemsRequired()) { if (item != null) { if (!itemExistsInInventoryOrBank(item)) return false; } } return true; } private void doFletching() { if (!getAPIContext().bank().isOpen()) { if (!isFletching()) { if (isWidgetValid(getTargetWidget())) { getAPIContext().keyboard().sendKey(getWidgetOptionKeyboardKey()); idleTimer = new Timer(0); Time.sleep(1200, 2000, this::isFletching); } else { if (getFletchingMethod().getOutputName().contains("arrow")) { if (handleItem(getFletchingMethod().getItemsRequired()[0], null, 1200, () -> getAPIContext().inventory().isItemSelected())) { handleItem(getFletchingMethod().getItemsRequired()[1], null, 1200, () -> isWidgetValid(getTargetWidget())); } } else { if (handleItem("Knife", null, 1200, () -> getAPIContext().inventory().isItemSelected())) { handleItem(getFletchingMethod().itemsRequired[0], null, 1200, () -> isWidgetValid(getTargetWidget())); } } } } else { idleTimer.reset(); Time.sleep(50, 300); } } else { if (closeBank()) { Time.sleep(1800, () -> !getAPIContext().bank().isOpen()); } } } private boolean hasEscToCloseInterface() { return getAPIContext().vars().getVarbit(4681) == 1; } private boolean closeBank() { if (hasEscToCloseInterface() && getWidgetOptionKeyboardKey() != -1) { getAPIContext().keyboard().sendKey(KeyEvent.VK_ESCAPE); return true; } else return getAPIContext().bank().close(); } private boolean isWidgetValid(WidgetChild widgetChild) { return widgetChild != null && widgetChild.isVisible(); } private WidgetChild getTargetWidget() { return getAPIContext().widgets().get(getParentWidgetId()).find(i -> i != null && getWidgetPredicateString() != null && i.getName().contains(getWidgetPredicateString())); } private int getWidgetOptionKeyboardKey() { if (getWidgetPredicateString() == null) return -1; return getWidgetPredicateString().equals("shortbow") ? KeyEvent.VK_2 : getWidgetPredicateString().equals("longbow") ? KeyEvent.VK_3 : KeyEvent.VK_1; } private String getWidgetPredicateString() { String output = getFletchingMethod().getOutputName(); if (output != null) { if (output.contains("shortbow")) { return "shortbow"; } else if (output.contains("longbow")) { return "longbow"; } else { return "arrow"; } } return null; } private int getParentWidgetId() { return 270; } private Task getCurrentTask() { if (!hasItemsRequired()) { return Task.BANKING; } else return Task.FLETCHING; } private boolean hasItemsRequired() { return inventoryContainsAllOf(getFletchingMethod().getItemsRequired()); } private boolean handleItem(String itemName, String action, int timeOut, Completable condition) { ItemWidget itemWidget = getAPIContext().inventory().getItem(itemName); if (itemWidget == null) return false; if (action != null) { if (itemWidget.interact(action)) { return Time.sleep(timeOut, condition); } } else { if (itemWidget.click()) { return Time.sleep(timeOut, condition); } } return false; } private int getRandomNumber(int min, int max) { return (int) ((Math.random() * (max - min)) + min); } @Override public boolean onStart(String... strings) { System.out.println("Starting " + getManifest().name() + " v" + version); buildPaintTitle(); return true; } private boolean inventoryContainsAllOf(String[] items) { for (String item : items) { if (item != null) { if (!getAPIContext().inventory().contains(item)) { return false; } } } return true; } private String rsFormat(Integer number) { String[] suffix = new String[]{"K", "M", "B", "T"}; int size = (number != 0) ? (int) Math.log10(number) : 0; if (size >= 3) { while (size % 3 != 0) { size = size - 1; } } return (size >= 3) ? +(Math.round((number / Math.pow(10, size)) * 10) / 10d) + suffix[(size / 3) - 1] : +number + ""; } private int getHourlyRate(int i) { return (int) (i / (runTimer.getElapsed() / 3600000.0D)); } private String getExperienceGainedString() { return "Experience gained: " + rsFormat(experienceGained) + " (" + rsFormat(getHourlyRate(experienceGained)) + ")"; } private String getStatusString() { return modifyString(status); } private String modifyString(String string) { String input = string.replace("_", " "); return input.substring(0, 1).toUpperCase() + input.substring(1); } private final Font boldText = new Font(Font.SANS_SERIF, Font.BOLD, 12); @Override protected void onPaint(Graphics2D g2d, APIContext ctx) { if (getAPIContext().client().isLoggedIn()) { paintFrame.draw(g2d, 20, 30, getAPIContext()); g2d.setFont(boldText); g2d.setColor(Color.WHITE); g2d.drawString("Time running: " + runTimer.toElapsedString(), 20, 70); g2d.drawString("Status: " + getStatusString(), 20, 90); g2d.drawString(getExperienceGainedString(), 20, 110); g2d.drawString("Fletching method: " + getFletchingMethod().toString(), 20, 130); super.onPaint(g2d, ctx); } } private int getFletchingLevel() { return getAPIContext().skills().get(Skill.Skills.FLETCHING).getRealLevel(); } private Fletch getFletchingMethod() { for (Fletch fletch : Fletch.values()) { if (fletch.getRequiredLevel() <= getFletchingLevel() && fletch.getTargetLevel() > getFletchingLevel()) { return fletch; } } return Fletch.HEADLESS_ARROW; } private enum Fletch { HEADLESS_ARROW("Headless arrow", 1, 20, new String[]{"Feather", "Arrow shaft"}), OAK_SHORTBOW("Oak shortbow", 20, 25, new String[]{"Oak logs"}), OAK_LONGBOW("Oak longbow", 25, 35, new String[]{"Oak logs"}), WILLOW_SHORTBOW("Willow shortbow", 35, 40, new String[]{"Willow logs"}), WILLOW_LONGBOW("Willow longbow", 40, 50, new String[]{"Willow logs"}), MAPLE_SHORTBOW("Maple shortbow", 50, 55, new String[]{"Maple logs"}), MAPLE_LONGBOW("Maple longbow", 55, 65, new String[]{"Maple logs"}), YEW_SHORTBOW("Yew shortbow", 65, 70, new String[]{"Yew logs"}), YEW_LONGBOW("Yew longbow", 70, 80, new String[]{"Yew logs"}), MAGIC_SHORTBOW("Magic shortbow", 80, 85, new String[]{"Magic logs"}), MAGIC_LONGBOW("Magic longbow", 85, 100, new String[]{"Magic logs"}); private final int requiredLevel, targetLevel; private final String[] itemsRequired; private final String outputName; Fletch(String outputName, int requiredLevel, int targetLevel, String[] itemsRequired) { this.outputName = outputName; this.requiredLevel = requiredLevel; this.targetLevel = targetLevel; this.itemsRequired = itemsRequired; } public int getRequiredLevel() { return requiredLevel; } public String getOutputName() { return outputName; } public int getTargetLevel() { return targetLevel; } public String[] getItemsRequired() { return itemsRequired; } } } See this post for how to compile local scripts if you intend on using this.
    2 points
  46. I have a mostly working f2p script that has most of these 😄 I'll probably split it up into multiple scripts 🙂
    2 points
  47. Only after the public beta is released as Sellout said.
    2 points
  48. Bruh its not even in beta yet they're not gonna just give everyone access so they dont have a monoply for few weeks till its in full release plus scripts are free until full launch which is pretty cool of them. Just be patient and wait the few months till full launch and then you can get your grubby little hands on the api lol
    2 points
×
×
  • Create New...