Jump to content

Search the Community

Showing results for tags 'abcl2'.

Found 5 results

  1. Elite Chopper FREE - AIO Woodcutter Hello Everyone! I'm here to bring you an exciting new script. As some of you know, I've been working on a project that I call ABCv3, which is a new form of antiban that improves upon the principles set forth by ABCv2. Here is the first script that implements my new experimental antiban. Repository Link: https://tribot.org/repository/script/id/2611 Features: Best Antiban possible. ABCL 10 plus new antiban not seen in ANY OTHER SCRIPT. Yes, I'm talking about ABCv3 Task System for completely automated 1-99 [*] 20+ locations Customer location support! Fast and efficient chopping Start from ANYWHERE Auto axe upgrading (bronze to dragon) Completely Customizable Antiban Control Mouse Speed, Reaction Times, and even play around with Tribot's built-in antiban! Features in Red belong to the Premium Version of this script. * Task system is limited to 2 tasks for the Free Version. * Some preset locations such as Catherby, Gnome Stronghold, etc are only available in the Premium Version. Click Here to see the Premium Version! GUI: Happy Botting!
  2. newbie looking for info on anti ban

    Hey Guys, I am wondering what the difference between all the different types of anti ban (pretend i know nothing about any of them). -ABCL 10 [ABC2] -ABCv2 Level 10-ABCL 10 is there a abc1, or is that abcl 10 ? which came first and what one is the latest? thanks guys! ty for heloing a noobie
  3. Tri Al-Kharid Warrior Fighter V2 The perfect way to train up medium level accounts and make a lot of money looting herbs! Features: Kills level 18 Al-Kharid warriors in Al-Kharid Earns a lot of xp! Makes you a lot of money looting herbs in p2p ( up to 150k+ an hour! ) Start the script from anywhere Supports all food and can been used without food Supports all weapons and special attacks Re-equips ammo and can withdraw more from the bank Supports nearly all potions Customisable banking Customisable looting ABC2 antiban with a 10/10 rating Telekinetic grab support Can bury bones Load & save GUI settings Profit calculations and xp tracking To activate the script from the repository click the button below: Note: I also have a premium script available that can do all of this plus it has the following extra features: VIP is not required! Complete all in one combat system that can fight every single monster in Runescape. Extended banking features Built in AIO magic script that can train magic with every spell available from alching, curses, to teleports, to lunar spells. It does it all! Dwarf multicannon support Herb cleaning and dropping Full prayer support Progressive training including changing attack styles, upgrading gear and switching training spots when you level up! Bones to peaches support Improved potion features Rock crab support Safe spotting optional Full worldhopping system that can worldhop when many different conditions are met And much more! If you're interested in this script check out the tribot thread below: Thanks for reading.
  4. ABC2 is the second version of TRiBot's Anti-Ban Compliance utility, whose aim is to provide scripts with a standardized anti-ban, backed by character profiles. ABC2 has been built upon statistical analysis of human playing data, making our anti-ban the most human-like on the market. Read more about the importance of modeling human playing data here: https://tribot.org/forums/topic/60719-tribot-release-9300-0-abc2/. So now you must be wondering how to implement ABC2 in your script. First, I will link the main utility: https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html. Each script should use one instance of ABCUtil, unless the script switches RuneScape accounts during runtime. Since each ABCUtil instance is tied to a single character profile for an account, the script must create a new ABCUtil instance if a new RuneScape account starts to be used throughout the runtime of the script. Upon creating a new ABCUtil instance, a thread will be started which is in charge of tracking XP gains, and making the mouse enter/leave the game screen. For this reason, it is important to call ABCUtil#close when you are finished with a specific ABCUtil instance to stop the background thread from executing, and to clean-up. Now, there are four types of scenarios which ABCUtil oversees: Timed Actions Tab Checking (Pts: 2) ABCUtil#shouldCheckTabs ABCUtil#checkTabs XP Checking (Pts: 4) ABCUtil#shouldCheckXP ABCUtil#checkXP Entity Examining (Pts: 1) ABCUtil#shouldExamineEntity ABCUtil#examineEntity Mouse Exiting (Game Screen) (Pts: 10) ABCUtil#shouldLeaveGame ABCUtil#leaveGame Mouse Movement (Pts: 2) ABCUtil#shouldMoveMouse ABCUtil#moveMouse Mouse Pickup (Pts: 2) ABCUtil#shouldPickupMouse ABCUtil#pickupMouse Mouse Right Click (Pts: 2) ABCUtil#shouldRightClick ABCUtil#rightClick Camera Rotating (Pts: 2) ABCUtil#shouldRotateCamera ABCUtil#rotateCamera Preferences Open Bank Preference (Pts: 2) ABCUtil#generateOpenBankPreference Tab Switch Preference (Pts: 2) ABCUtil#generateTabSwitchPreference Walking Preference (Pts: 2) ABCUtil#generateWalkingPreference Next Target Preference (Pts: 4) ABCUtil#selectNextTarget Action Conditions HP to Eat At (Pts: 4) ABCUtil#generateEatAtHP Energy to Activate Run At (Pts: 4) ABCUtil#generateRunActivation Moving to Anticipated Location (Pts: 3) ABCUtil#shouldMoveToAnticipated Resource Switching Upon High Competition (Pts: 1) ABCUtil#shouldSwitchResources Next Target Hovering (Pts: 8) ABCUtil#shouldHover Next Target Menu Opening (Pts: 6) ABCUtil#shouldOpenMenu Reaction Times Generating Reaction Times (Pts: 20) ABCUtil#generateReactionTime https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateReactionTime-- or https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateReactionTime-long- Generating Supporting Tracker Information (Pts: 10) ABCUtil#generateTrackers https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateTrackers-- or https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateTrackers-long- Sleeping for the Length of the Reaction Time (Pts: 10) ABCUtil#sleep Timed Actions These are actions which are performed based on internal timers. For each timed action, simply use the should method to check if you should perform the action. If true, call the other corresponding method to perform the action. These actions should only be performed when the player isn't particularly busy at the time. Ex: If the player is woodcutting, these actions should be checked/performed while chopping down the tree. Example on how to use the methods: // Here our player is idling, so we can check/perform the timed actions. if (this.abc_util.shouldCheckTabs()) this.abc_util.checkTabs(); if (this.abc_util.shouldCheckXP()) this.abc_util.checkXP(); if (this.abc_util.shouldExamineEntity()) this.abc_util.examineEntity(); if (this.abc_util.shouldMoveMouse()) this.abc_util.moveMouse(); if (this.abc_util.shouldPickupMouse()) this.abc_util.pickupMouse(); if (this.abc_util.shouldRightClick()) this.abc_util.rightClick(); if (this.abc_util.shouldRotateCamera()) this.abc_util.rotateCamera(); if (this.abc_util.shouldLeaveGame()) this.abc_util.leaveGame(); Preferences These are preferred ways of doing things as specified by the player's character profile. Note that the preference generated by each method isn't constant, so we should not store the returned value of the generation method. So when an area covered by ABC preferences comes up, we must call the generation method, and act upon the returned value. Example: Let's say we want to open the bank using custom methods. We then use ABCUtil#generateOpenBankPreference to generate the preferred way to open the bank. final OpenBankPreference pref = this.abc_util.generateOpenBankPreference(); switch (pref) { case BANKER: openBankBanker(); break; case BOOTH: openBankBooth(); break; default: throw new RuntimeException("Unhandled open bank preference."); } Note that Banking#openBank, GameTab#open, and web walking all take ABC preferences into account, so we don't have to worry about handling preferences if we use those methods. Next Target Preference ABCUtil#selectNextTarget selects the positionable entity from the given list which should be our next target. We should store this value until we switch targets (i.e. the entity which we are interacting with), because the output of this method isn't constant. I.e. We call this method to determine which entity to interact with next, and store the returned value so we aren't constantly calling this method. We can re-call this method and re-store the returned value when we move on to a different target entity. If an entity spawns which is closer than the original closest entity, then we can re-call this method to re-select the next target entity. Otherwise, we should stick with the stored value. Note that when we chose an entity which is not the closest, that entity will be within a close distance to the closest, and if the entity implements Clickable07, we will check if it is clickable via Clickable07#isClickable. Example: final RSObject[] objects = getPossibleTargets(); if (objects == null || objects.length < 1) return; final RSObject next_target = (RSObject) this.abc_util.selectNextTarget(objects); Action Conditions These are actions which depend on a condition generated by ABCUtil. Note that the conditions generated by each method isn't persistent, and we want a certain level of persistence for each type of action. Therefore, we must store the returned value of the methods for a certain period of time, specified below. HP to Eat At ABCUtil#generateEatAtHP will generate the hitpoints percentage at which we should eat at. We store the generated value and use it until we eat the next food item. At that time, we generate a new value and store it. Example: int eat_at = this.abc_util.generateEatAtHP(); // Global variable, persistent... // Inside of a local method if (getHPPercent() <= this.eat_at) { eatFood(); this.eat_at = this.abc_util.generateEatAtHP(); // Generate a new HP percentage to eat at } Energy to Activate Run At ABCUtil#generateRunActivation will generate the run energy at which we should activate run at. We store the generated value and use it until we turn run on. At that time, we generate a new value and store it. Example: int run_at = this.abc_util.generateRunActivation(); // Global variable, persistent... // Inside of a local method if (!Game.isRunOn() && Game.getRunEnergy() >= this.run_at) { Options.setRunOn(true); this.run_at = this.abc_util.generateRunActivation(); // Generate a new run energy to activate run at } Moving to Anticipated Location When we finish interacting with our latest target/resource, there may or may not be a next target/resource available. If there is, then we simply go to that target/resource as usual and ignore this action condition. However, if there is no next target/resource currently available, then we check this action condition. We check ABCUtil#shouldMoveToAnticipated immediately after we finish up with our latest target/resource. If the method returns true, we move to the location in which we anticipate our next target/resource will spawn. If it returns false, we do nothing. Example: // Here we just finished cutting a yew tree if (!findNextTarget()) { // If we are here, then there does not exist a next target/resource yet if (this.abc_util.shouldMoveToAnticipated()) { // Check if we should move to the anticipated location... performReactionTimeWait(); // Sleep for the generated reaction time moveToAnticipated(); // Move to the anticipated location } // Now we simply wait until a new target/resource spawns // Do not keep checking if we should move to the anticipated location // Only perform this check once after each target/resource becomes unavailable } Resource Switching Upon High Competition ABCUtil#shouldSwitchResources will decide if we should switch targets/resources based on the amount of competing players. We should check this condition every 20-30 seconds, but only if we are not winning very many resources from the other competing players. This is vague because it depends on the script and individual preferences. Example: // Here we start mining a rock long check_time = Timing.currentTimeMillis() + General.random(20000, 30000); while (isMining()) { if (notWinningManyResources() && Timing.currentTimeMillis() >= check_time) { // Check if we should switch resources if (this.abc_util.shouldSwitchResources(getCompetitionCount()) { switchResources(); //Switch resources return; } check_time = Timing.currentTimeMillis() + General.random(20000, 30000); // Generate a new check time } } Next Target Hovering and Menu Opening ABCUtil#shouldHover will decide if we should hover the mouse over our next target. We should use this method to determine if we should hover when we start interacting with each new target entity, and we store the returned value. While interacting with our current target, if the stored value indicates we should hover our next target, then we should do so. Note that we should only employ hovering when the mouse is in the screen boundary. ABCUtil#shouldOpenMenu will decide if we should open the menu for our next target. We should use this method to determine if we should hover when we start interacting with each new target entity, and we store the returned value. While interacting with our current target, if the stored value indicated we should open the menu for our next target, AND if we are hovering the mouse over the next target, then we should open the menu. Menu opening should only be performed if we are also hovering the next target. Note that we should only employ menu opening when the mouse is in the screen boundary. Example: boolean should_hover = false; // Global variable, persistent boolean open_menu = false; // Global variable, persistent... // Inside of a local method if (the_object.click("Chop down")) { this.should_hover = this.abc_util.shouldHover(); this.open_menu = this.abc_util.shouldOpenMenu(); // Generate other conditions for actions handleChopping(); } // Inside of a different local method, handleChoppingwhile(isChopping) { if (Mouse.isInBounds() && this.is_hovering) { hoverNextTarget(); if (this.open_menu) openMenuForNextTarget(); } // Other code } Reaction Times ABC2's reaction time generator relies on about nine different factors, many of which must be specified by the script. There are two different ways to specify these factors: bit flags and properties. With bit flags, you call ABCUtil#generateBitFlags with the necessary options, and that method will generate the bit flags. With properties, you call ABCUtil#getProperties and set the necessary properties with the returned instance of ABCProperties. Generating Reaction Times You must use ABC2 to generate reaction times, instead of using random sleeps. ABC2's reaction time generator was designed to be very generic, allowing it to be used for all things which require a variable response time. However, we are still in need of some human data to allow us to have it totally generic. When generating reaction times for events with a fixed, very low waiting time, the reaction times are often much higher than a human reaction time. Hence, until we collect some more data and adjust our algorithms, ABC2's reaction time generator should be used for the following circumstances: Waiting in response to a condition where we had to wait a variable amount of time typically greater than a second. Examples: Reacting to when our character stops fishing. The response time will be used before we move on to the next fishing spot, or before we walk to the bank. Reacting to when our character stops mining. The response time will be used before we move on to the next rock, or before we walk to the bank. Reacting to when our character kills our target NPC. The response time will be used before we attack our next target, or before we walk to the bank. We currently will not use ABC2's reaction time generator for the following circumstances, until more data has been collected and we have adjusted our algorithms: Waiting in response to finishing an alchemy spell (the waiting period for casting the spell is fixed, and thus not covered by ABC2 yet) Waiting in response to us finishing our wait for items to be deposited to the bank after clicking the "Deposit All" button (once again, the waiting period is fixed). These are only limited scenarios which we specified. There are obviously more scenarios than this, but I'm hoping you're able to figure it out based on the examples. Now, to generate reaction times, you have the chose of two methods: https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateReactionTime-- or https://tribot.org/doc/org/tribot/api/util/abc/ABCUtil.html#generateReactionTime-long- The first method uses properties, and the second uses bit flags, as discussed above. For generating reaction times, there are currently four factors which must be specified by scripts: Waiting Time: The amount of time we were waiting for in order to perform the action we are wanting to do now. Hovering: If we were hovering over the entity we are about to click immediately prior to calling the method. Menu Open: If we have the menu open for the entity we are about to click immediately prior to calling the method. Under Attack: If we are under attack now, or if we were under attack while waiting. Fixed Waiting: Whether the time at which we were waiting can be fixed to a number of client clock cycles or time (currently not used since we lack data for this, but this is here for the future). This will typically not be set because of the reason explained above. Example using bit flags: final int waiting_time = getWaitingTime(); final boolean menu_open = this.abc_util.shouldOpenMenu() && this.abc_util.shouldHover(); final boolean hovering = this.abc_util.shouldHover(); // If the condition is met, we specify the relevant flag, otherwise we set the variable to 0 // When we pass 0 into generateReactionTime as a bit flag option, it will not change anything final long hover_option = hovering ? ABCUtil.OPTION_HOVERING : 0; final long menu_open_option = menu_open ? ABCUtil.OPTION_MENU_OPEN : 0; // Generate the reaction time final int reaction_time = this.abc_util.generateReactionTime(this.abc_util.generateBitFlags(waiting_time, hover_option, menu_open_option)); // Sleep for the reaction time try { this.abc_util.sleep(reaction_time); } catch (final InterruptedException e) { } Example using properties: final int waiting_time = getWaitingTime(); final boolean menu_open = this.abc_util.shouldOpenMenu() && this.abc_util.shouldHover(); final boolean hovering = this.abc_util.shouldHover(); final ABCProperties props = this.abc_util.getProperties(); props.setWaitingTime(waiting_time); props.setHovering(hovering); props.setMenuOpen(menu_open); props.setUnderAttack(Combat.isUnderAttack() || wasJustUnderAttack()); props.setWaitingFixed(false); // Generate the reaction time final int reaction_time = this.abc_util.generateReactionTime(); // Sleep for the reaction time try { this.abc_util.sleep(reaction_time); } catch (final InterruptedException e) { } When using properties, remember to explicitly set all applicable options so that you don't use old data from previous uses. Generating Supporting Tracker Information A core factor in generating reaction times is whether or not the mouse is currently within the game screen boundary, along with other linked factors which I am keeping secret. ABCUtil's background thread will be responsible for manipulating these factors. In order for it to do so, it must know certain information about the activity being performed. We give it this information via ABCUtil#generateTrackers. ABCUtil#generateTrackers generates variables for performing anti-ban while waiting for something. Specifically, variables relating to how often and when to make the mouse leave the game area. This method should be called right after clicking something which requires us to wait a variable amount of time, or a time which we have to try and count off; i.e. where we will produce a variable reaction time. This includes, but is not limited to, clicking a tree, clicking an interface which we have to wai, say, approx. 10 seconds for. This method requires the script to supply two pieces of information: Estimated waiting time: An estimate for the amount of time we will be waiting for, i.e. how long it takes to perform the action at hand. Example: When woodcutting, the estimated waiting time would be an estimate for how long we are going to be chopping the current tree. Typically, using the average waiting time for the specific action is a good estimate. Under Attack: If we think we are going to be under attack for any of the duration of the waiting time. Like generating reaction times, calling this method can either be done using bit flags or properties. Example using bit flags: if (successfullyClickedTree()) { final int est_waiting; if (this.chopping_count > ) est_waiting = (int)(this.chopping_time / this.chopping_count); else est_waiting = 3000; // An arbitrary value, only used at the very beginning of the script this.abc_util.generateTrackers(this.abc_util.generateBitFlags(est_waiting)); while (isChopping()) { if (this.abc_util.shouldLeaveGame()) this.abc_util.shouldLeaveGame(); // Do other things here, such as hovering and menu opening if the mouse is still in the game screen boundary } } Example using properties: if (successfullyClickedTree()) { final int est_waiting; if (this.chopping_count > ) est_waiting = (int)(this.chopping_time / this.chopping_count); else est_waiting = 3000; // An arbitrary value, only used at the very beginning of the script final ABCProperties props = this.abc_util.getProperties(); props.setWaitingTime(est_waiting); props.setUnderAttack(false); props.setWaitingFixed(false); this.abc_util.generateTrackers(); while (isChopping()) { if (this.abc_util.shouldLeaveGame()) this.abc_util.shouldLeaveGame(); // Do other things here, such as hovering and menu opening if the mouse is still in the game screen boundary } } Now you may be wondering where exactly to call this method. Generally, you'd call this after generating a reaction time using ABC2, after we call ABCUtil#sleep for that reaction time, and after we perform the action which we are reacting to. It's important to keep in mind that calling ABCUtil#generateTrackers is very important because it sets up variables which greatly affect reaction times. Also note that we should be calling ABCUtil#shouldLeaveGame and ABCUtil#leaveGame in the period after calling ABCUtil#generateTrackers, as the method is to be used in conjunction with ABCUtil#shouldLeaveGame and ABCUtil#leaveGame. If we do not ever call those two methods, or don't call them often enough, calling ABCUtil#generateTrackers would be essentially useless, and our reaction times wouldn't be the most human-like. Sleeping for the Length of the Reaction Time it is important to use ABCUtil#sleep to perform all of the reaction time sleeps. ABC2's background thread is in charge of making the mouse return to the game screen boundary if the mouse has been outside of the boundary for a certain period of time. Now, the times at which the background thread makes the mouse return has been pre-determined. It's possible that it makes the mouse return while we are sleeping for the duration of the reaction time. If it does this, then why do we have to continue our reaction time sleep if the mouse is moving (i.e. the player is active)? Simply put, when the mouse returns to the game screen, we should stop sleeping the duration of the reaction time because the player is active. When the script calls ABCUtil#sleep, it allows the background thread to interrupt the reaction time sleep immediately after the bot makes the mouse return to the game screen. The method also prevents two mouse movements from happening at the same time, since the background thread doesn't pause the script while moving the mouse back to the game screen. Calculating Anti-Ban Compliance Levels (ABCL) Refer to the first list. Beside each element is an amount of points (Pts). If your script successfully implements the element, then add those points to your score. Scores are out of 100, which determine the ABCL: [99, 100] Points: ABCL 10 [90, 99) Points: ABCL 9 [80, 90) Points: ABCL 8 [70, 80) Points: ABCL 7 [60, 70) Points: ABCL 6 [50, 60) Points: ABCL 5 [40, 50) Points: ABCL 4 [30, 40) Points: ABCL 3 [20, 30) Points: ABCL 2 [10, 20) Points: ABCL 1 [0, 10) Points: ABCL 0 Note: "[" is an inclusive boundary, and ")" is an exclusive boundary. Conclusion There you have it, the guide to implementing Anti-Ban Compliance version two. I hope I have made it clear how to implement ABC2. Make sure to read all of the documentation. I am including a persistent extension of ABCUtil, which makes this utility more like the first version, and easier to use: PersistentABCUtil.java
  5. About a year ago, we launched our Reaction Timing and Other Playing Data project, where we asked our users to play RuneScape for a few hours while running a script which records their reaction times, actions, and other playing data. About 6 months ago, we started statistically analyzing the submitted data in hopes of releasing the most human-like anti-ban the botting scene has come across. Today, we are happy to announce that we've completed this task, and have made some discoveries which will dramatically improve our anti-ban. There are three main improvements we've implemented upon analyzing the submitted data: click point selection, reaction times, and typical human behavior. Click Point Selection The points which bots choose to click play a large role in whether bots look like a human, or a bot. A large problem many of our competitors have is that they use randomization for a lot of things, and think this will help disguise their bots. However, humans aren't random. We all follow similar patterns and trends. Let me show you what I mean. This is a picture of how a typical bot chooses to click inventory items, with standard randomization: This is the method used by a lot of our competitors. Because they use standard pseudo-randomization, every possible point which can be clicked has the same chance of being clicked as any other. This, in essence, is what is means to be random. From the human data we've collected, here is how humans actually choose which points to click: As you can see, there is a major difference between the two. Humans tend to aim for the center of the region they are clicking, and end up clicking a point which is near the center. The points are normally distributed around the center of the region. We know Jagex tracks mouse movements and the points which are clicked. So is it possible to determine if someone is a bot just by how they choose points to click? Totally. The difference between the two pictures is obvious. We originally noticed this difference many years ago, and I made an algorithm which I thought would be more human-like than the standard point selection. Here's the click points which it produces: It's slightly less bot-like compared to standard random point selection, but still far from human-like. It wasn't until I launched the data collection program and analyzed the submitted data that I was able to create a human-like point selection algorithm. Here's what our new algorithm produces: Compare this image to the image of the points which humans chose to click. The difference? There is no difference. I've made a point selection algorithm which accurately models how humans choose points to click. Let me juxtapose the two images: The left image is of the points clicked by humans. The right image is of the points clicked by TRiBot using our new algorithm. Is it possible to determine a bot was active just by looking at the points chosen to be clicked by our new algorithm? Not at all. This is just one area which has been improved because of our data collection project, and one less piece of evidence for Jagex that a bot has been running. Note that our algorithm isn't just for inventory items. It is applied throughout our API, and used for object clicking, NPC clicking, interface clicking, etc. I'd also like to point out that this algorithm was originally released during the summer, but I thought I'd include it in this post since it resulted from the data collection project. Reaction Times The step we've taken which is more dramatic than above involves reaction times. First, let me start off by saying how important having human-like reaction times is when it comes to evading bans. Problem number one is that bots typically have very low reaction times. Most humans aren't able to have these low reaction times, at least for very long. In turn, this increases the amount of XP and items gained while botting to very high levels; levels which aren't human-like. It's very much possible that Jagex examines the playing efficiency of players to determine if the player in question has used bots. They simply have to look for players with very high playing efficiency. The second problem is that reaction times produced by bots are typically evenly distributed between a minimum and a maximum reaction time. Jagex can catch on to this based on the delays between actions via their server, and determine whether a player is botting. Let me now divulge into both problems using the human data we've collected. Most, if not all of our competitors advise scripts to use random delays between actions. Does that sound like a reasonable way to evade Jagex's banning system? Instead of having a constant delay of 550 milliseconds between a pair of actions, having a random delay between 450 and 650 milliseconds between the pair of actions? The problem with that is once again, humans aren't random. Here is the delays resulting from having a random delay between 450 and 650: The delays are evenly distributed between the minimum and maximum, with a mean and median in the center of the min/max, and of about the same value: 550. Using the human data we've collected, here is how actual human reaction times are distributed: The human reaction times are right skewed, and obviously much different from the bot produced reaction times. How different are reaction times generated by bots vs. reaction times of humans? Very different. Is it possible to determine if a player is botting based on the reaction times? Absolutely. Just look at how different the above images are. From this discovery, I sought out to create an algorithm which generated reaction times like a human does. Here's what my reaction time algorithm produces, given the same input factors as the human reaction times: Using nine different factors, my algorithm has successfully re-built the human reaction time for all different click scenarios. If you compare the two histograms above, you'll notice the means and medians are about the same, and the spread of the data is about the same. If Jagex were to analyze the reaction times of a bot using my reaction time algorithm, they would be completely fooled. How is my algorithm so accurate? There are many factors which contribute to the actual reaction time of humans. Humans by definition aren't random. These factors all contribute to the probability of a certain reaction time. Though analyzing the submitted human reaction data, I have identified the nine most significant factors which contribute to the reaction time of a human. These nine factors are all taken into consideration of my algorithm to generate a pseudo-human reaction time. Let's juxtapose all three histograms: Which of the captured reaction times were produced by a human? Which of the captured reaction times were produced by a bot? The first set of reaction times was obviously produced by a bot. But you cannot tell that the third set of reaction times was produced by my algorithm because it closely models the reaction times of a human. RuneScape bots have existed for over a decade, but most of them all still have this problem. We seem to be one of the few botting platforms to have properly addressed this problem. Typical Human Behavior A problem which has been prominent with bots for over the past decade is "typical anti-ban." This is where script developers think checking XP randomly, rotating the camera randomly, opening the music tab randomly, etc. is effective anti-ban. This is not effective anti-ban for two reasons: Humans aren't random. Typical anti-ban is. A pattern will form with typical anti-ban, in that these random actions are performed every X seconds or minutes. Humans don't check their XP programmaticly every 5 minutes. Humans don't randomly rotate their camera every 3 minutes.Human behavior nowadays involves multi-tasking. Humans will often switch tabs to reddit, facebook, etc. Bots don't mimic this behavior.From the human data we've collected, we've discovered how to more accurately model human-behavior. One of the improvements we've made is that our bots will now make the mouse leave the game screen area, to simulate the player using reddit, facebook, etc. And no, we didn't just come up with an algorithm to arbitrarily or randomly decide on when to simulate this behavior. We statistically analyzed the human data to produce an algorithm which accurately models how a human behaves in this area. This is just one of the ways we've improved our bots in simulating human behavior, but is one of the more important aspects. A Note About Character Profiles In case you didn't already know, TRiBot uses character profiles to differentiate all of the RuneScape characters using our bots. A character profile is a unique set of attributes of how the character will play the game, which is generated for each different RuneScape character. Say you are botting on two different RuneScape characters: Mike and Molly. Mike and Molly will have two different, unique character profiles. This will change the way our bots play the game on each of the characters. Character profiles have been integrated with click point selection. Each different RuneScape player will have different ways of choosing points to click, and will still follow the human model. Character profiles have been integrated with reaction times. Each different RuneScape player will have different reaction times based on the factors which contribute to reaction times. Character profiles have been integrated with human behavior simulation. Each different RuneScape player will behave in different ways in terms of doing things other than the current task at hand. So not only did we create models and algorithms to accurately simulate human game play, we extended everything to be based off character profiles, so that no two bots are too much alike. Implementing the Algorithms So now you're wondering whether these algorithms are automatically implemented in every script, or if they have to be manually implemented by scripts. Well, our point selection algorithm was automatically implemented, to be used by every script. But reaction times and human behavior simulation have to be manually implemented by scripts. To allow scripters to implement these algorithms, we have created a new utility: Anti-Ban Compliance 2 (ABC2). The aim of ABC2 is to allow all scripts to implement a standardized anti-ban, backed by character profiles, and most importantly, human data. Read about implementing it here: https://tribot.org/forums/topic/60720-guide-to-implementing-abc2/ So far, the following scripts have implemented ABC2: Delta CookerDelta FisherDelta MinerDelta WoodcutteraAgility [Premium]A Note About Scripts Implementing ABC2 Upon running scripts with ABC2, you'll notice that they have lower XP rates than scripts which don't implement ABC2. Why is this? Because as I've said above, bots are a lot more efficient than humans. To accurately portray a human, bots must be of the same speed as humans. This is the cost of human-like anti-ban. If you don't want to get banned, your bot should behave like a human. If you aren't satisfied with human-like XP rates and resource collection rates, then feel free to use scripts which don't implement ABC2, but you can expect to be banned. Another thing to note is that sometimes ABC2 produces really high reaction times, up to a minute or longer. So if your bot seems to just be idling doing nothing, it's probably because of this. No, those high reaction times aren't a bug. It's how humans play. Humans don't have consistently low reaction times like bots do. Sometimes humans have very high reaction times, and that can be because of many different factors. ABC2 mimics this. Conclusion Thank-you for reading this post. I especially thank all of the people who contributed to the Reaction Timing and Other Playing Data project. We have come a long way in creating the most human-like bots because of the human data we've collected. I cannot stress enough how important statistically analyzing human game play is in creating human-like bots and anti-ban. This isn't it. We will continue collecting different human data for all areas of game play, and will continue making algorithms and models which simulate human behavior. I have a long list of areas which we will improve. TRiBot will always be the leader in human-like botting. By implementing anti-ban based on real human biometric data, we ensure our long term success in the fight against bot detection. Thanks, TRiLeZ, TRiBot Staff