Jump to content

Leaderboard

Popular Content

Showing most liked content since 06/08/23 in all areas

  1. Hello everyone, If you've been around Tribot's community for some time, you've probably noticed we have been operating primarily on Discord for the majority of our communication, discussion, etc. This has lead to the forums becoming quite stale, both in terms of discussion and useful content. This is a shame, because forums are a great way to organization information and discussion. We've noticed a lot of repetition in discord because the topics get lost fast. With all that in mind, I decided it's time for an overhaul. Here is a list of changes to the forum: I removed the old forums entirely. What you're seeing now is a new forum with new infrastructure. Most important threads along with users who posted in them have been migrated, but not everyone. You'll need to re-set your profile pictures. This was done to give us a much better integration with the rest of the new repo/store/website. Completely reorganized sections More discussion forums Updated tutorials A market section A blog section to better communicate Tribot plans/work/etc. So please, set your profile pictures, update your signatures, post an introduction, and post a friendly message in your favorite premium script thread! I hope you all enjoy a modern, clean forum experience. This is not going to replace discord, of course, but from now on we'll be treating the forums as a first class citizen again. In celebration, I will be giving away 100m OSGP to 3 random VIP users (meaning you've purchased Tribot Standard/Premium) who reply to this thread by June 15th! Winners will be contacted by forum private message on June 15th. You will have until June 18th to respond to receive your prize. If no response is given, the winner will be re-rolled. Happy botting! 🙂
    14 likes
  2. A Recap of 2023 The past year has been an interesting one, both for Tribot and botting in general. For Tribot, we kicked off the year with me becoming sole owner. By Spring, we completed our full web overhaul with an entirely new backend, new website, new store, and even new forum implementation. From there, we stabilized a lot of older client features, better secured our ability to update with the game, and refactored a lot of old code. In fact, much of the work in the middle of the year to the end was not nearly as visible as what we did with the web overhaul. I know that can feel frustrating as a customer, so without going into our future plans just yet, please know that this won't be the case for long. We finally expanded our development team a few months ago. While we are not at the capacity we were a few years ago, our efforts are a lot more focused and streamlined. Botting in general has been great. We saw a massive rise in high level PvM botting and account training for that purpose. While we don't have complete stats for the year, I can say for certain that in the past 6 months, you all have botted well over 50 million hours on Tribot. Users of the platform have collectively made trillions of gold this past year alone. Despite the large focus on bossing scripts, they aren't the only players in town. While our revenant, vorkath, zulrah, and phosani nightmare scripts are all near the top of the charts, we also see plenty of success in scripts like nMercher, nGreenDragons, nMagic, ArkSlayer Pro, Elon Lava Dragons, and more. Private scripts also show up in the middle of charts, demonstrating some large farms for the few private requests that scripters accept. While I obviously can't go into much detail on these, we can see that private scripts are still relevant for large farmers. Overall, Tribot is alive and thriving. We have every reason to continue developing and improving things and fully intend on doing so. Thank you all for your participation, support, and interest in what we do and thank you for this great year. Our business is not possible without you. Our Vision for 2024 We want this year to be more flashy than the previous year. A new backend, serious cost savings, and web reliability were all fantastic efforts we completed last year, but they were boring to customers. And while tasks like that will always be around, we hope that our previous work in reducing overhead can help us focus on more products, more features, and performance improvements that every one of you can tangibly benefit from. I'll break this down in to a few high level categories. Scripter Excellence One of Tribot's current strengths is the scripting team. All of the scripters we have are amazing at what they do and are a large part of where we are today. We have always had relatively strict standards when it comes to who we approve, but that can only carry us so far to achieving high quality. This year I want to get more involved in helping the scripting team improve as well as holding everyone accountable. I've started that process by finally posting an official path to scripter. Hopefully this helps up and coming scripters get involved in our process. Our regular scripters have had very little changes and oversight in the past few years. This year I'll be doing a regular scripter audit. This means I'll be evaluating all of our normal scripters again similarly to their first application. I'll look at what community scripts they have published, their condition, their activity, etc. Scripters will need to pass this audit or complete follow ups on their assessment in order to remain scripters. Premium scripters will undergo something similar. Instead of an audit, I will be documenting common issues customers have with scripts, refund requests, and other data I can use to identify premium scripts that may not be up to our standards (don't worry, I'm not blind and know of a couple already). Scripts of this nature will be audited and possibly placed under a quarantine status, where they will remain available for purchase with a large, visible warning and more generous refund policy. They may also possibly be removed from the store if they do not pass the audit and do not have many sales. Outside of scripter processes, I want to hopefully introduce community script bounties, where scripters can get paid to write community scripts or potentially even premium scripts to help fill in some of the gaps we have. I am not fully certain on this idea yet, though. More details will come. If you are a regular user who can write scripts and are interested in writing small-ish community scripts for tribot store credit, please let me know. From the client side, I hope to dedicate time to really solving some of the roadblocks scripters have to ensuring quality. After all, a script is only as good as the client powering it. I'll talk more about that in a separate category. I want to achieve enough quality for you to be as fearless as possible in your purchasing decisions at Tribot, or at the very least well informed. A New Launcher, Jagex Account Support, and (Potentially) New Client You may have heard me talk about it on Discord, maybe some rumours, or maybe you've been around so long that you're deaf to this kind of thing at this point (remember TRibot X?). Well, last year I came up with a plan and design to create a new Tribot client incrementally. This starts with the launcher. The current launcher and all previous versions have all been meant to, well, launch clients. While that makes sense, it could be so much more. Our vision is a centralized process on your machine that acts as the shared brain among all clients running on your system. We all know how frustrating it is that every individual client process has its own tribot login, its own settings, its own account manager. Our plan is to move everything to a central UI so that you can manage everything centrally. What this means is: We no longer have to code fragile distributed process synchronization, which means fewer bugs for you. You no longer have to walk on eggshells when modifying anything while having multiple clients open. You no longer have to load a game client to change settings. We have a foundation for new features like bot managers, a better CLI, more stable tribot account credentials, and more. And most importantly.... Jagex Account Support With a centralized launcher, we can manage Jagex Account Credentials. Similar to the official game launcher, we can keep a persistent logged in state for (multiple) Jagex Accounts and run clients with them. All you need to do is log in manually one time (similar to the Jagex Launcher), and our launcher will automatically log you in thereafter. The main difference will be that our launcher can manage multiple accounts simultaneously so that you can choose when launching a client. What about the new client? This design is a bridge. It will support the current client and a new client as we develop it. While I cannot promise a new client will exist any time in the foreseeable future, a lot of work has already been put into it. A few months ago I dove deep into the Tribot X code that was developed several years ago and can proudly say we have feasible way forward to create a brand new client with heavily reduced resource usage, significant automation capabilities, and support for all current scripts with a way for it to integrate seamlessly into this new launcher. Keep an eye on out in our blogs section for development posts I'll likely make on it in the future. Attention to Longstanding Issues I understand that a lot of users can point out at least one issue Tribot has had for a long time that annoys them. For example, bossing scripts and wilderness scripts in particular that require fast, precise actions have really encountered pain with some of our old mouse code that was written to be humanlike. We already have an ongoing effort for experimenting swapping out the mouse code entirely and intend to progress on it this year to the point where can definitively release it or push it to the new client effort. More immediately, I have already uncovered several performance improvements, particularly with memory usage. Within the next couple months you can expect to see some upgrades to our runtime. While I'm sure many of you think this will be fixed by a new client, I want to be clear in saying that we are working on these independently of a new client. Pushing everything to a giant, longterm project that may or may not be ever completed is not the right thing to do if we can come up with an alternative. These bug fixes are on our radar for the short and medium term. Additionally, I'll be personally going through all of our public and private bug reports to acknowledge them, prioritize them, investigate them, and hopefully solve them or at the very least move them forward. This is not the year bug reports will simply take up space to be dealt with "later". And fitting my vision of flashy changes, I will be focusing my attention on the ones that will most notably impact day-to-day usage of the client. Wrapping Up I hope this post provides some transparency into our plans and passion for Tribot. Our work is never done. Keep in mind this is far from the only thing we are working on this year and that this is not a roadmap, but rather a vision to what we want to focus on. As many know, little things are always coming up that need taken care of and sometimes our priorities are swayed by our availability and capacity to handle them. I will be writing more blog posts in the coming weeks with a more detailed roadmap and potentially preview of the new launcher/client. If not, at least a development blog showing some progress.
    13 likes
  3. As some may or may not know, in the background of everything else going on, I've been rewriting Tribot from scratch. I know, I know, a lot of you have heard that one before. "Good one, Nullable, now fix script download issues". I get it. I even still use the project codename created in 2017 for the first of many supposed "rewrites". But this is real and the best part is that I am still prioritizing development for what you use right now. So at the very least, no harm done. That being said, I am making a lot of progress and I figured some would like to get some details. Injection? Reflection? What are these things? The current version of Tribot is a Reflection bot, for reference. What is Reflection in terms of botting? Reflection refers to the programming mechanism of the same name. It's where, during runtime of the program, code can examine the contents of itself. Since the game runs in the same process, we can use this mechanism to "examine" the game memory and read data. This is allows us to know where the objects and npcs are and stuff like that. The upside of this is that it doesn't modify game bytecode. The downside is that it can be slow. Tribot uses a lot of intelligent caching, though, making it one of the most efficient reflection bots created for the game. Nowadays, we're one of the only reflection bots out there. And Injection? "Injection" refers to the technique of modifying the game bytecode as it loads it. It "injects" friendly names and interfaces into the game's classes so that it can simply call them directly and receive game data. The upside is that it's fast and direct. The downside is that it modifies bytecode. The problem with modifying bytecode is that it's legally dubious and has the potential to be reflected itself. While there is no indication of any sort of reflection-based anti-bot, and patching it would be possible for injection clients, it's always a possibility. So what is Tribot X? Tribot X won't be using either. It will use Compile-Time Wrappers. Not a very catchy name, admittedly. While developing the basis of the new bot, I realized we could have the best of both worlds for how we interact with the game. This technique is actually really simple. The game is just a jar like any other, and can be programmed against. So we do that! public int getSomeValue() { return client.obfuscated_name * multiplier; } And now when we compile and run this, we get the value. Of course, this has lots of problems. I would need a ton of these to get all the data and I would need to change them every time the game updates. Also, there are various other roadblocks that I won't go into for getting this to actually run. We solve the main problem by generating code and compiling it against new game updates. These generated classes act as wrappers and give us the same functionality as injection without needing to inject anything. As such, they are just as fast and require no game modification. We've already written a complete generator for doing this automatically. More details! Since this is my first post on Tribot X, I'll give some one-liners over some of the other random technical details I may not write full posts about. Tribot X has a lot more flexibility in terms of spoofing, and includes the spoofing of runtime information that could be used in the future for bot detection (even though it isn't currently). Tribot's mouse has been completely swapped out and is astronomically more efficient and less prone to error. The current tribot uses an event queue mechanism while the new one uses a single thread with locking to enforce thread safety. By doing so, we reduce the number of threads and overhead. Every method for manipulating the canvas has been optimized. Faster code, less CPU, less RAM. It supports tabs! But really properly this time with perfect isolation and spoofing. The GUI of Tribot X uses Jetpack Compose. The entire bot is written in Kotlin. For really CPU intensive tasks or to share code with our launcher, we have a way to interop Kotlin and Rust code in the client. The architecture of the bot has been entirely changed. Plugins separate from scripts are now a possibility.
    11 likes
  4. It's been a few months since the release of the custom Tribot store and I've had several people interested in how we built it and what technologies we used and why. These topics range from intermediate to pretty complex in terms of development knowledge and I probably am not going to explain them well enough. If you have any questions on any component, please ask in the comments and I'll respond! To give some context, we wanted to essentially rewrite the entire tribot backend. The script uploading, instance management, store, payment system, order system, etc... everything. We estimated that not only could be improve many systems with a rewrite but also reduce costs by a staggering amount. We wanted to rewrite everything and release it with zero downtime. The system we had at the beginning consisted of: Auth0 for account management (keep) Cloudflare for DNS, analytics, and security toggles (keep) Shopify for the entire store/payment system (remove) 3 AWS-managed MySQL databases for the forums and old repo (remove) A PHP webserver for the old repo backend and frontend (remove) A java webserver for issuing session tokens in exchange for Auth0 JWTs (remove) So our task was to migrate 2 mysql databases and all the shopify data while also fundamentally changing some of how our systems worked. For example, we wanted to make the tribot client use stateless auth with the Auth0 JWT rather than simply use it to exchange for a session. Tribot's Tech Stack Infrastructure We chose to move everything to DigitalOcean. They have a fantastic value-to-cost ratio along with being reliable even for critical systems. Database We chose to consolidate all of Tribot's main system data into a single DigitalOcean-managed Postgresql database. I work with distributed data a lot and knew that 1. it's really, really complicated and time consuming to get right and 2. Very few businesses need distributed data storage and Tribot will not be an exception. While I debated back and forth a lot between a nosql database like MongoDB and SQL, I ended up choosing Postgresql due to its performance and flexibility. SQL can be cumbersome to do right, but I decided it was worth it for the benefits. To handle migrations, we use Flyway. Database migrations are a must-have in my opinion. They make it easy to set up test/local databases and provide a standard, safe way to modify the tables. Docker We technically don't have Docker anywhere in the production architecture, but we use dockerfiles to create containers, and docker for local dev. All of our server code runs in containers. Containers are nice because we can control the whole webserver environment from source code. If you're unfamiliar with containers, I highly recommend looking into them if you're interested in web development or backend development. Kubernetes Yes, we run Tribot on a DigitalOcean managed kubernetes cluster. Why? After all it's not like we're doing microservices (that would be extremely unnecessary). But the thing is, Kubernetes is extremely useful even without microservices. I like to consider the architecture of Tribot now to be a "Distributed Monolith", which means our server code is written such that it can run in parallel with itself. So we can run any number of copies of our webserver, which helps with availability. Take this k8s config for example: spec: replicas: 3 selector: matchLabels: app: rune minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 This very small piece of config basically tells my Kubernetes cluster that the "Rune" service (which is what we call our main application) should run 3 processes of itself in parallel. "maxUnavailable: 1" means that when we update, the minimum number of running servers is 2. When we deploy a new version, it will spin up the new processes, wait until they report "ready" for 10 seconds, then kill the old ones, which means 0 downtime. And k8s automatically handles traffic that comes to the Rune service with a load balancer it manages on DigitalOcean. All of that for only 11 lines of YAML config? Yup, Kubernetes is pretty great. If I wanted to run another service or tweak the scaling on anything, it's a simple config change. File Storage Since all of our code runs in containers and has to be stateless in order to run in parallel, it means we can't really use the local file system much. There's always block storage or remote file systems, but for our needs, the easiest thing is using "Object Storage" (like Amazon S3). We chose DigitalOcean Spaces for this. Components Frontend We chose Next.js for the frontend and have it as its own dedicated server. While this could be a full stack service, we wanted most of the logic to be in a different technology and not so coupled to the frontend. We tend to only run 1 Next.js service at a time. Deployments will briefly have 2 running so that there is zero downtime. We wanted to write the UI using React and Material UI. Next.js seemed like a very attractive option as a framework with those technologies. We really liked its ability to combine different forms of html generation, like clientside, serverside, and especially Incremental Static Generation. We wanted something we could ensure has high Search Engine Optimization while still benefiting from the productivity of a javascript framework. Backend ("Rune" Service) This is our distributed monolith web application. It's coded entirely in Kotlin using Vert.x as the webserver. We chose this combination because of Kotlin's fantastic syntax and Coroutines, and Vert.x because it is the most mature non-blocking JVM webserver that supports kotlin coroutines. This non blocking webserver performs really well with a lot of bursty small requests, which is exactly how Tribot tends to scale up when you guys are botting a lot. We also added JOOQ as our database access library. It generates a lot of boilerplate and allows us to avoid writing plain SQL strings, which are prone to bugs as the database changes. Hasura We host a couple replicated Hasura instances in our k8s cluster. This was added near the end of development. This basically acts as a catchall for interacting with our database. It's extremely productive for advanced queries. It was getting very time consuming manually implementing everything the frontend needs in the Rune service. Hasura sped up the end of development significantly. Had I found it sooner, I might have used it for many more database interactions. Cron Trigger We need to run code periodically for things like cleaning up unpaid orders, setting forum ranks, etc. In a normal basic webserver, you might just create a cron job. Well, in a distributed system, that's actually not an easy task. There is no central "server" and the web services can arbitrarily get killed and started. And at any given time there can be running many instances of each service, so we don't want the job running on all of them, but rather, just one of them. I developed a tiny separate app using the Rust language and have it scheduled to execute with Kubernetes built in scheduler. All it does is take in a string argument representing an HTTP endpoint and then it calls it (with some retry logic). So now we can just run "cron jobs" that call our Rune service for functionality using a simple config like: spec: schedule: "*/5 * * * *" # every 5 minutes successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 2 jobTemplate: spec: template: spec: containers: - name: cron-trigger image: ... imagePullPolicy: IfNotPresent args: ["http://[rune-service]/endpoint-to-call"] restartPolicy: OnFailure And the logic of the cron can live in "Rune". Traefik (Reverse Proxy / Load Balancer) Whenever the tribot client or website frontend code calls tribot servers, it actually hits this component first. Traefik is a nice little webserver that lets us describe which service a request should go to. So if you're calling a specific URL, we can fulfill the request with any service we want. It also lets us run many replications of the same service because it will distribute the requests evenly to each of them. A reverse proxy / load balancer is a core component of any distributed system. Repo Compiler When scripters upload scripts, they upload source code. We like to compile scripts on our side to ensure consistency, compatibility, and safety. This application is pretty simple. It calls Rune to ask for a submitted upload to compile. When Rune responds with the download, it also marks the job as "pending". The compiler will spin up a Gradle process to compile the script using its own Gradle template. Once the compiled artifact is done, it will upload it back to Rune, where it gets stored in block storage. Rune, upon that upload, marks the job as complete. It will also tell Rune if the compile failed and why, which makes it mark the job as failed and lets the scripter know. Rune handles silent failures by treating any jobs pending over 15 minutes as available to recompile. We actually don't host this in our Kubernetes cluster. Script compilation is a resource hog. Dentist's AIO Account Builder is massive, for example. I actually self-host this component at home, though if I need, I can easily throw it onto any decently-specced VPS without issue. Putting it all together This architecture gives us a very highly reliable system, with self-healing, high availability, zero downtime deployments, all while being so efficient that it doesn't cost much at all. And while we don't really need horizontal scalability, this system allows us to do so with a simple config change. This definitely isn't everything there is to Tribot's backend. We have metric servers, Cloudflare configurations, Auth0 rules/hooks, and there's also the forums which run on an entirely different system with integrations to this one. If anyone is interested in this kind of thing, let me know in the comments any feedback or questions or requests for more topics on our work in this area, such as how we actually managed to migrate all of our data with 0 downtime or how we coded any particular system.
    9 likes
  5. Having script trials would give customers self-service to determine if a script fits their needs (think about how much you hate using software that doesn't have some sort of self-service). This improves customer experience and reduces support required for scripters to answer basic questions about script functionality. It would also likely reduce refund requests. Trials should be customizable by the script author, they should be able to choose the duration, or even choose to not offer trials at all. Trials should ideally also be locked behind TRiBot VIP. The trial system on the original repository before the Shopify switch worked great and fit all needs.
    8 likes
  6. Hi everyone, I'm happy to announce that @SkrrtNick and @Encoded are now official Tribot developers. They'll be contributing some time to help keep Tribot running smoothly, fix bugs, and develop smaller new features while I continue working on larger efforts. Many of you already know these two. Encoded has been around since 2013 and has done a lot for Tribot, as a scripter, dev, and ex-owner. SkrrtNick is one of Tribot's largest community contributors in the past couple years.
    8 likes
  7. Hello everyone, We're doing a small giveaway this month to show appreciation to all our users who've made this a good year for Tribot. Prizes: $25 in Tribot store credit $10 in Tribot store credit 30 days Tribot Premium Membership $5 in Tribot store credit You must have made at least one Tribot purchase this year to enter. Each prize will be drawn in that order. To enter, simply reply to this thread with either your favorite Tribot script or the script you most want to try soon. You're not required to explain why, but it's always welcomed! By doing so, you'll automatically be entered for all the drawings for this giveaway. Additional Bonus Giveaway: We will also be giving away 7 days of Tribot Premium Membership, open to all Tribot users who post here even if you haven't made a purchase. The deadline to enter is by end of day next Friday (10/20) Thank you and good luck!
    7 likes
  8. You can think of these blogs as a snapshot into the high-level work that we're doing at Tribot at the time of post, rather than a traditional roadmap with priorities/deadlines/etc. The reason for this format is because of the sporadic nature of the way we operate. I still want a structured way to communicate what's going on, though. Active projects: Forum Revitalization The new forums are here but there's still more work to do. More guides, more tutorials, more content, and especially more integration. This is likely to be passively worked on as time permits, likely over a longer period of time. New client launcher The launcher we have now is great, but to truly take tribot to the next level of features, we need something that can manage all the clients running on your PC at once, handling auth, providing cleaner CLI interfaces, and better organization of data. I'm working on prototypes of a background process that can be used to manage all your running clients from a single interface, launch new ones, etc. This singular point of contact will open a lot of doors for future features. Tribot Premium Membership scripts and open source scripts We want to start offering more for our premium subscribers. While community scripts are great, quality is not guaranteed. We want tribot membership to be worth it no matter what you bot. Looking Glass Investigation I haven't forgotten about LG. This feature has always been rough at best, but now it's degraded to the point where the go-to advice is "don't use LG". I'm going to look into fixing this soon, at least on Windows for Runelite, if possible. Inactive/Upcoming/Backlogged projects: Jagex Account support I've already made a proof-of-concept for running tribot with a Jagex account. It's entirely doable, but quite a bit different due to the login happening before the client launches. The new tribot launcher will help a lot with supporting this, so I'm keeping this inactive until Jagex starts forcing Jagex accounts or the new launcher is complete. More script hooks/functionality With bossing scripts on the rise, scripters really want more powerful features, such as tick listeners. This may be something I implement in the near/medium future. More website features Forum integration Now the the forums are migrated and not going anywhere for a long time, it's probably worth adding more forum thread buttons/links to the store/website. This isn't a priority, though. Script addons Recurring payments Discord account linking Looking Glass redesign/rewrite Client rewrite This list isn't exhaustive and of course bugs/issues are always on the priority list, but I won't go into them in this post as they are too granular. This is only for high level items. Once this list starts changing a decent bit I'll post more blog updates that cover the changes in priority, however most of the details will be in my dev blog, which is more technically-focused. Feel free to make suggestions here. I won't be responding to all comments, but I do read them. Thank you 🙂
    7 likes
  9. Quick script I've updated for the masses. Makes Teleport tabs on W330 in POHs. https://tribot.org/user/community-scripts?page=1&q=tab&id=613 Requirements: Start with staff of air, noted soft clay, law runes (and any other required room), and coins in your inventory. Notes: Does not restock. Let me know of any errors on discord (cass2186) and I'll do my best to fix them in a reasonable amount of time.
    6 likes
  10. In addition to the roadmap and official announcements, I thought I'd add another blog category for talking about incremental progress that isn't as visible. For those who saw the 2024 update in the announcements, those items listed are exactly what I'm working on. Stability is at the forefront of efforts currently and much of that is going to be enabled by the new launcher that I'm sure you've heard me talk about before. Stability means different things for different people. For some people, the most important stability issue is mouse movement inconsistencies. For others, it's script instancing. For others, downloads. And for others, it's jagex account support. For some it's even that the current launcher downloads don't behave properly with their machine/ISP. Our current efforts are on fixing all of these holistically. We're always looking quick wins but we also need to pay off years of technical debt. New Tribot Launcher I've talked about this a lot in the past. I'm proud to say we're currently allowing some MacOS users the ability to beta test a very light version of it to tackle the jagex account issues. But also, I'm working on a solution that can benefit everyone. The overall idea is to start moving features from the client itself into a constantly running launcher. By having the account manager here, it will make it much easier to... well... manage accounts. This is especially important for Jagex Accounts. The idea behind this is to make the account manager easy to use whether you have 1 account or 5000 accounts. What's done so far: Vastly improved persistent (local) storage for jagex accounts, regular accounts, characters, proxies, and client settings Bidirectional communication between the new launcher and Tribot clients Launcher that gets minimized to the taskbar properly on all systems, and only takes <10mb of RAM while running in the background. Jagex account login support with the ability to store the session such that re-login is not required. What's left: Bulk launch support Data import Auto-updates Polishing Once those items are done, we can have a full 1.0 release to replace old launcher. From there, we can expand into real bot farm management and automation features. About script downloading issues Over the past couple months, a lot of users have had intermittent issues with downloading scripts and client updates. It seems like lately there's been a lot of service degradation with our CDN hosting, which is unfortunate. I plan on creating a custom download server that handle caching and secure downloads better. I also plan on hosting launcher dependencies locally or through github as the regular servers for those also don't always perform adequately. A new tribot client? I actually made a ton of progress on a new client a couple months ago. Full hook support, a fast and stable mouse, keyboard input, much lower resource usage, etc. I'm putting this work on the backburner to focus on the launcher, but am hoping to pick it up in the next couple months. It's an enormous amount of work to make a new client that supports so many scripts that use APIs made over a decade ago, but we're finally at a point where the path forward is clear enough to realistically achieve it. We have no shortage of ideas on how to make the best OSRS bot possible. But technical debt makes it difficult to make these ideas come to life. We brought forward a ton of new features last year by paying off our server side tech debt, and we plan on doing that this year with the client. Once the new launcher is further along, I'll be writing a dev blog with all the technical details.
    5 likes
  11. TL;DR - Tribot now supports Jagex Accounts What is a Jagex Account? Over the past several months, Jagex has been rolling out their new account system for logging into the game. Previously, every OSRS character had a separate login you entered after loading the game. Now with Jagex Accounts, you can have one account with multiple characters that you log into before launching the game. When you launch the game, the previous "login" process is now just a button that enters the game world. This new system forces two factor authentication. This feature is now required on all new OSRS characters. As it stands on January 2024, regular runescape accounts made before this change can still be logged in the previous way. This new account system conforms to most modern standards compared to regular runescape accounts and is now very similar to login systems you use in other games and websites. In fact, it's similar to how you login to Tribot as we use similar modern standards. How does this affect Tribot? As of today, Tribot supports Jagex Account login while still preserving support for regular runescape accounts. Since regular accounts can still use the old tools and there are probably tons of those stockpiled, we will not be modifying the account manager or removing the option to start a client without a jagex account. Instead, we added the feature separately. You can launch a client with a Jagex Account here: This supports both email and authenticator two-factor-authentication. What about the Account Manager? The Account Manager is largely coded around the ability to log in while in-game. Since Jagex accounts can't do that, we are going to leave it completely unmodified. Meaning, you will not be using it at all for Jagex Accounts and will only want to use it if you still have regular Runescape accounts. For now, you can use the Bulk Launcher feature of our tribot launcher which can manage and launch Jagex account clients fully automatically. This is especially good for larger farms. Do we have to login manually every time? No, we have two solutions for that. The tribot command line arguments: --jagex-email --jagex-password --jagex-totp --jagex-display-name And the Bulk Launcher, which supports these fields so that you can manage and launch jagex account farms automatically with a GUI. Jagex email and password are self-explanatory, but the totp argument is for 2fa. The value of this argument should be the authenticator secret that can be accessed when setting up 2fa on the account. It will ask you to scan a QR code. Under that there will be a way to reveal the plain secret. Do that, save the secret, and then scan the QR code or do what you need to generate a code to complete the process. It should go without saying that this data is extremely sensitive. If someone gets these 3 values, they will own your jagex account. Please keep them very secure. Our implementation does not store this information nor does it send any of it to our servers.
    5 likes
  12. Message Listener Thread [16:05:30] Exception in thread "TRiBot 07 Message Listener" [16:05:30] org.tribot.api.TribotInterruptException: Thread interrupted [16:05:30] at obf.NA.XC(uc:183) [16:05:30] at org.tribot.api.General.sleep_definite(su:255) [16:05:30] at org.tribot.api2007.MessageListener$Listener.run(vz:182) [16:05:30] at java.base/java.lang.Thread.run(Thread.java:834) [16:05:30] Caused by: java.lang.InterruptedException: sleep interrupted [16:05:30] at java.base/java.lang.Thread.sleep(Native Method) [16:05:30] at obf.NA.XC(uc:7) [16:05:30] ... 3 more ABCUtil Thread [13:56:12] Exception in thread "TRiBot ABCUtil Thread" [13:56:12] org.tribot.api.TribotInterruptException: Thread interrupted [13:56:12] at obf.NA.XC(uc:183) [13:56:12] at org.tribot.api.util.abc.ABCUtil.run(cy:1623) [13:56:12] at java.base/java.lang.Thread.run(Thread.java:834) [13:56:12] Caused by: java.lang.InterruptedException: sleep interrupted [13:56:12] at java.base/java.lang.Thread.sleep(Native Method) [13:56:12] at obf.NA.XC(uc:7) [13:56:12] ... 2 more Also tribot stops scripts on the EDT so if the script takes awhile to end it freezes up (prevalent now that tribot switched how it stops scripts). [16:10:47] The system event queue seems to have locked up. Attempting to recover it. [16:10:47] The system event queue locked up, but it has since recovered. Debugging information: (java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=scripts.napi.tribot.w$$Lambda$3191/0x00000007c10a2c40@447b696a,notifier=null,catchExceptions=false,when=1706195161225] on sun.awt.windows.WToolkit@56867384) (java.util.concurrent.locks.ReentrantLock@1ce1c0df[Unlocked]))(java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=scripts.napi.tribot.w$$Lambda$3191/0x00000007c10a2c40@447b696a,notifier=null,catchExceptions=false,when=1706195161225] on sun.awt.windows.WToolkit@56867384) [16:10:47] 0 - [email protected]/java.lang.Thread.sleep(Native Method) [16:10:47] 1 - app//obf.NA.XC(uc:7) [16:10:47] 2 - app//obf.jF.stopScript(mj:1477) [16:10:47] 3 - app//org.tribot.script.Script.stopScript(ii:69) [16:10:47] 4 - app//obf.RE.Nb(ul:410) [16:10:47] 5 - app//obf.Jg.zk(od:1914) [16:10:47] 6 - app//obf.Jg$$Lambda$326/0x00000007c045b440.actionPerformed(Unknown Source) [16:10:47] 7 - [email protected]/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) [16:10:47] 8 - [email protected]/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308) [16:10:47] 9 - [email protected]/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) [16:10:47] 10 - [email protected]/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) [16:10:47] 11 - [email protected]/javax.swing.AbstractButton.doClick(AbstractButton.java:369) [16:10:47] 12 - [email protected]/javax.swing.AbstractButton.doClick(AbstractButton.java:349) [16:10:47] 13 - scripts.napi.tribot.w$$Lambda$3191/0x00000007c10a2c40.run(Unknown Source) [16:10:47] 14 - [email protected]/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [16:10:47] 15 - [email protected]/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [16:10:47] 16 - [email protected]/java.awt.EventQueue$4.run(EventQueue.java:721) [16:10:47] 17 - [email protected]/java.awt.EventQueue$4.run(EventQueue.java:715) [16:10:47] 18 - [email protected]/java.security.AccessController.doPrivileged(Native Method) [16:10:47] 19 - [email protected]/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [16:10:47] 20 - [email protected]/java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [16:10:47] 21 - app//obf.LE.dispatchEvent(lj:84) [16:10:47] 22 - [email protected]/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [16:10:47] 23 - [email protected]/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [16:10:47] 24 - [email protected]/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [16:10:47] 25 - [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [16:10:47] 26 - [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [16:10:47] 27 - [email protected]/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    4 likes
  13. What are Tribot Scripters? Tribot scripters are members of the community who have demonstrated proficiency in writing scripts from all areas. They know the API, know how to create GUIs, know how to handle script arguments, and have the ability to create overall quality scripts and content. Regular scripters are still just community members that have provided at least one script for the community to use freely and have passed the application to become one. Premium Scripters are scripters who have successfully passed the application to get a script approved for sale. These members are official Tribot staff and contractors who have demonstrated not only technical capability, but also the ability to talk with customers, be friendly, and be helpful. They are capable of handling the responsibility of an official staff position and contract with our company. Benefits of becoming a Scripter Regular scripter rank provides free Tribot Premium Membership benefits (unlimited bots, use of community scripts, etc). They have access to upload scripts to our repository for community or even private usage. They also get access to a scripter+ only discord channel and forum where we collaborate on tribot as a whole and make decisions. Some regular scripters also get access to make some open source tribot contributions/fixes for their scripts to benefit from. Premium scripter rank provides all of that and the ability to sell their scripts on Tribot's marketplace and earn profits from them. Additionally, premium scripters get a larger say in how we operate and conduct business. They get access to all semi-open-source tribot code and can apply directly to be a Tribot client/web developer. How to become a Scripter In order to become a scripter, you must write at least one script that you plan on releasing publicly to the community script repository on Tribot. For writing scripts, you can find tutorials in this section. At least one of these scripts must contain the following: A GUI (Swing, JavaFX, or Jetpack Compose) Script arg handling Complex enough to be somewhat configurable (a simple one-location iron miner is not enough, but an AIO miner that supports 10 locations could be) From there, you can apply by creating a support ticket in this section with the following: An upload of your script source code (github link, zip file, etc) Why you want to become a scripter Any additional content you've created for Tribot (guides, open source scripts, helpful advice you've given) We will take into consideration your script, code, and general community conduct. Scripter applications may get delayed based on availability and/or the need for more scripters. For premium scripter, you can contact me directly after you have become a scripter and we can discuss what you can do to become premium. This is usually just writing a premium script, but the content matters depending on our need and the market. It also depends on your eligibility to be a contractor.
    4 likes
  14. Hello! I am Encoded. I joined TRiBot in March of 2013 and have been a scripter for over 10 years. I was a developer from September 2018 until April 2021 when I took over co-ownership of TRiBot along with Nullable. I was a co-owner for a year and a half before stepping down as I found myself spending more time on administrative work than development and that’s not where my interests lie. I'm currently employed as a software engineer for a SaaS company in San Francisco, CA doing full stack development using Spring/Angular. I started playing RuneScape in 2006 and quit about 9 months later after discovering World of Warcraft. I later returned in 2009 when I got into botting and was a part of the pure clan scene until EoC. I then quit until OSRS came out and I've only botted the game since. I started at wBot, but came to TRiBot once wBot got shut down as TRiBot was the only client with working random event solvers (randoms weren't dismissible back then). TRiBot was where I learned to write scripts and was the start of my programming career. I was involved in the development of RuneLite for about a year starting in 2017 until Jagex got involved. I like to credit myself with the creation of OpenOSRS as it was my fork with the banned plugins that led to the creation of OpenOSRS and subsequently all the other RuneLite/OpenOSRS forks, but I had no direct involvement with the development of OpenOSRS and if it wasn't my fork, it would have been someone else's. While it’s been a few years since I’ve last created a new script, I still strive to maintain my current scripts. And who knows, maybe there will be a game update that peaks my interest and I’ll release something new.
    4 likes
  15. Hello everyone, I've been a member of Tribot for over 10 years now. I joined in early 2013 shortly after the release of OSRS. I was in high school at that point and had done a very small amount of RS bot scripting for RS2 and programming in general, and knew the potential of having my own scripting business. Tribot was (and still is) the best client around. I became a scripter soon after joining, learning how to code along the way. I left Tribot for about 2 years during college due to lack of time, but came back in 2017 after I graduated and found a job as a full time software engineer. In 2018, I became a part time developer for Tribot. After years of helping improve Tribot, @TRiLeZ left the business to @Encoded and I. As of now, I'm the sole owner of Tribot. I still work as a professional software engineer in the US, working primarily on distributed web systems for SaaS. While I don't always have the most free time, I enjoy running Tribot as a business and software product.
    4 likes
  16. Yo! Been a tribot user for a long time, best scripts in the game. Good to be here!
    4 likes
  17. Welcome to AIO Account Builder yet to be AIO RuneScape... Activate Script Supported Tasks: https://tribot.org/store/products/6-AIO-Account-Builder Features: 1-Ge support 2-Custom Gear Profile for each task 3-Each task can be fully customized ( food type, min and max food Count, gear profile , stamina or energy potion, fill the rest on inventory with food or not ) 4-All skills have 10 Tasks each to be manipulated 5-Shuffle task to randomize the task orders 6-Anti profiling system 7-MiniBreak system 8-Discord notifications (Webhooks) through messages or taking images 9-MiniBreak while walking 10-GUI save/Load profile 11-Arguemnt support Bug Report: 1-Please post here or contact me on discord or join my discord server https://discord.com/invite/9keC2Dv9wM 2- Make sure to include gif of the bug and both bot and client debug 3-Include any details u can provide to help me understand what was going on GUI: xr6MtOZBpL.mp4.503137a9baf4d56e0efeea7297dab6c0.mp4.5333515a3dff8045c0f1dcf6746fc68b.mp4
    3 likes
  18. Gods Scurrius Link to Purchase Kills Scurrius for massive amounts of experience, comparable or more than NMZ! This script can be ran on any account including ironman. I recommend wearing as much prayer bonus gear as you have to maximize your use of prayer potions. - 1 tick giant rat killing with bone weapons equipped - Supports melee, range, magic (with a charged Bone staff) - Supports spec weapons - Perfect prayer switching and debris dodging - GUI (Save/Load) - CLI (Argument support) - Mini-break System - World Hopping - Grand Exchange restocking supplies, decanting, selling loot - Auto upgrading spine to bone weapon once you get the drop Argument support: simply put the name of the saved profile you want to use in the argument box, for example if you wanted to load the last settings, put "last" in the argument box. Can be ran on accounts as low as 40 attack 35 strength and maybe even lower stats for xp up to 25-30k xp/hr (Some of the best in the game at that level) You can expect anywhere from 25-100k+ xp/hr when running this boss, the main reward is experience and the drops are minimal. Example gear and inventory: Fill out GUI options, press start script and watch the experience roll in. NOTE: To run on an ironman, you need to have Varrock teleport tablets, running the script on a HCIM is not recommended as you could disconnect and die still. Requirements: - 43+ Prayer - 40+ & 35+ Attack/Strength - 50+ Range - Gear to kill Scurrius - Prayer potions or super restore potions - Food - Stat boosting potions if desired (Super strength, ranging, etc) - Varrock teletabs MAGIC SUPPORT: Magic is only supposed via the Bone staff, you will need to charge the staff and set it as your weapon and it will train magic as well. Note: You may be able to run the script with lower stats than listed but these are the recommended stats. At low level stats, you won't get many if any Scurrius kills/hr however you will gain fast experience (experience at low levels mainly comes from killing the giant rats since you will 1 hit them with a 15 no matter your levels) I've been able to run it on an account with 1/1/1 att/str/def 24 hp with 43 prayer + a dagger (++). Experience was slow but now that account is at 85/85/85 and still going. Future features coming soon: Automatic bone weapon upgrading when you get a spine Task to turn in additional spines for experience lamps (5k xp in all combat stats, 3.5k xp in prayer per lamp) More in-depth ironman support GE Restocking on out of supplies Toggle for use of offensive prayers (~10% increase in xp/hr but uses more prayer potions) Bone staff recharging Proggies: This account was started from 40/30/30 attack/str/def
    3 likes
  19. Welcome To G.Revenant Purchase Script Features: Intelligent anti-PK. Craw, MSB, Melee, BP support as weapons GE restocking. Buying supplies & selling loot. Ava’s-Accumulator restocking. Gear restocking. Highly customizable -> Gear, Mobs, Food, Revenant ether amount, Restocking limits, Inventory. Ferox Enclave. Mini-break system. Muling. Auto bonding. GUI profiling. Arguments support for CLI. Requirements: none just the ability to use any weapon Help and Suggestions: Join my discord for any suggestions and bug reports. https://discord.gg/9keC2Dv9wM HighScore: http://www.dentist-scripts.com/dentist/grevenant/highscores.php Proggies:
    3 likes
  20. Features: https://tribot.org/user/community-scripts?id=566 Does Tutorial island. Does NOT NAME CHARACTERS. This is to hopefully avoid abuse and reduce the inevitable bans on tutorial island. If you wish to run lots of tutorial accounts without manual intervention, I recommend using Elon's Account builder which supports tutorial island. Arguments: "Fixed" - will set to fixed mode at the beginning of tutorial island "Slow" - will prolong sleeps slightly longer to try and reduce bans "Afk" - will randomly afk during tutorial "Skip" - will skip the GUI and run default settings Bugs: Please report bugs to me on discord: Cass2186#1679 I'll do my best to fix them ASAP, please expedite this by providing debugs/screenshots when relevant. Unfortunately, I can't help without these and a description of the issue. Bans: Tutorial is a high ban rate activity. Please rest your accounts after running them for at least 24h before putting wealth on them.
    3 likes
  21. Introduction I felt that Tribot needed a tutorial on how to write a script using the new SDK to assist those who may be trying to learn. I'm not claiming to be an authority on the best way to do things, I am just hoping to help you get on the right track I've tried to capture as much as I can in this thread, but even still I have most definitely missed things - if there's anything you'd like to see added or if you have any questions please drop me a message or comment on this thread. Cheers Pre-Requisites: A basic knowledge of java Unlike other clients, the Tribot SDK makes use of Optionals so it’s important you have a basic understanding of how Optionals work and how they are different to nullable objects. I recommend checking out this link if you need to get your head around them https://www.baeldung.com/java-optional I can recommend using the oracle java tutorials at https://docs.oracle.com/javase/tutorial/ or doing the mooc.fi java programming course https://java-programming.mooc.fi/ Either Tribot VIP standard or premium Intellij IDEA Frameworks: There are a number of scripting frameworks that have been open sourced and are available in the tutorial section of the forums, the options I am aware of are: Task by Encoded Node by Worthy Decision Trees by Nullable Behaviour Trees (kotlin) by Nullable The frameworks vary in complexity and some are easier to grasp than others, in the context of beginning scripting I think you should look into each one and decide what is the easiest for you to begin with. As this is a beginners tutorial, for the sake of simplicity I will be using Encoded’s Task framework. Important links: The Docs: https://runeautomation.com/docs/sdk/kdocs/ The Gradle Template: The Query System: Setting up our environment: Creating a library for our framework Create a place for your new script Add the framework to your new script Planning the script Collecting data Setting up an Enum to handle states Storing Variables Creating the Gathering Tasks Turning in the Quest Putting it together Adding a Paint Video of the final product You can also get my source here: https://github.com/SkrrtNick/a-cooks-tutorial
    3 likes
  22. Mort Mycelium - The Ultimate OSRS Money Making Bot Features: Ring of Dueling Integration: Quick and efficient travel using your dueling ring. Prayer Restore: Never run out of prayer. The bot automatically detects and refills your prayer, ensuring continuous operation. Drakan's Medallion Support: Travel swiftly with the Drakan's Medallion. Get to Ver Sinhaza in no time! Unique Anti-Ban: My proprietary anti-ban system mimics human behavior, reducing the risk of bans significantly. I've incorporated random mouse movements, varied task durations, and unpredictable breaks, ensuring that every botting session is unique. How to Use: Ensure you have a Drakan's Medallion and a Ring of Dueling and Silver sickle (b)/Ivandis flail in your inventory or bank. Position your character at a safe location. Launch the Mort Mycelium bot from your script manager. Monitor the bot from time to time, and enjoy the gains! Download link: Mort Mycelium
    3 likes
  23. Script now open beta please report any bugs u face so i can fix asap Script Lick ( Click Here )
    3 likes
  24. On this thread I will do my best to post daily updates of my pures progression just to keep myself motivated and provide insight to potential and current botters. 06/14/2023
    3 likes
  25. Looking forward to continuing improvement of the Tribot botting experience.
    3 likes
  26. Thank you @Nullable! I am very excited to be joining tribot as a developer 🙂
    3 likes
  27. These are option related goodies that I think we are missing, a lot of it is quite new. Some of them like disabling GE warnings are pretty nice if you want to do anything with the Grand Exchange. It's easy to extend and add your own options too! Any questions or concerns please let me know 😄 import lombok.RequiredArgsConstructor; import org.tribot.script.sdk.*; import org.tribot.script.sdk.query.Query; import org.tribot.script.sdk.types.Widget; public class OptionsUtility { public static boolean isDisableLevelUpInterfaceEnabled() { return GameState.getVarbit(9452) == 1; } public static boolean setDisableLevelUpInterfaceEnabled(boolean enabled) { if (enabled == isDisableLevelUpInterfaceEnabled()) return true; boolean priorValue = isDisableLevelUpInterfaceEnabled(); if (!setSetting(AllSettingsTabs.INTERFACES, "Disable level-up interface")) { return false; } return Waiting.waitUntil(3000, ()-> OptionsUtility.isDisableLevelUpInterfaceEnabled() != priorValue); } public static boolean isShowActivityAdviserEnabled() { return GameState.getVarbit(5368) == 0; } public static boolean setShowActivityAdviserEnabled(boolean enabled) { if (enabled == isShowActivityAdviserEnabled()) return true; boolean priorValue = isShowActivityAdviserEnabled(); if (!setSetting(AllSettingsTabs.INTERFACES, "Show Activity Adviser")) { return false; } return Waiting.waitUntil(3000, ()-> OptionsUtility.isShowActivityAdviserEnabled() != priorValue); } public static boolean isAcceptTradeDelayEnabled() { return GameState.getVarbit(13130) == 0; } public static boolean setAcceptTradeDelayEnabled(boolean enabled) { if (enabled == isAcceptTradeDelayEnabled()) { return true; } boolean priorValue = isAcceptTradeDelayEnabled(); if (!setSetting(AllSettingsTabs.INTERFACES, "Accept trade delay")) { return false; } return Waiting.waitUntil(3000, ()-> OptionsUtility.isAcceptTradeDelayEnabled() != priorValue); } public static boolean isGrandExchangeBuyWarningEnabled() { return GameState.getVarbit(14700) == 0; } public static boolean setGrandExchangeBuyWarning(boolean enabled) { if (enabled == isGrandExchangeBuyWarningEnabled()) return true; boolean priorValue = isGrandExchangeBuyWarningEnabled(); if (!setSetting(AllSettingsTabs.WARNINGS, "Show warning when a buy offer price is too high in the Grand Exchange")) { return false; } return Waiting.waitUntil(3000, ()-> OptionsUtility.isGrandExchangeBuyWarningEnabled() != priorValue); } public static boolean isGrandExchangeSellWarningEnabled() { return GameState.getVarbit(14701) == 0; } public static boolean setGrandExchangeSellWarning(boolean enabled) { if (enabled == isGrandExchangeSellWarningEnabled()) return true; boolean priorValue = isGrandExchangeSellWarningEnabled(); if (!setSetting(AllSettingsTabs.WARNINGS, "Show warning when a sell offer price is too low in the Grand Exchange")) { return false; } return Waiting.waitUntil(3000, ()-> OptionsUtility.isGrandExchangeSellWarningEnabled() != priorValue); } public static boolean setEscapeClosing(boolean enabled) { if (enabled == Options.isEscapeClosingEnabled()) return true; boolean priorValue = Options.isEscapeClosingEnabled(); if (!setSetting(AllSettingsTabs.CONTROLS, "Esc closes the current interface")) { return false; } return Waiting.waitUntil(3000, ()-> Options.isEscapeClosingEnabled() != priorValue); } @RequiredArgsConstructor public enum AllSettingsTabs { ACTIVITIES("Activities", 0), AUDIO("Audio", 1), CHAT("Chat", 2), CONTROLS("Controls", 3), DISPLAY("Display", 4), GAMEPLAY("Gameplay", 5), INTERFACES("Interfaces", 6), WARNINGS("Warnings", 7), POPOUT("Popout", 8), ; private final String text; private final int openVarbit; public boolean isOpen() { return Options.isAllSettingsOpen() && GameState.getVarbit(9656) == openVarbit; } public boolean open() { if(!openAllSettings()){ return false; } if (isOpen()) { return true; } return Query.widgets() .inIndexPath(134) .textEquals(text) .isVisible() .findFirst() .filter(Widget::click) .filter(i -> Waiting.waitUntil(2000, this::isOpen)) .isPresent(); } } public static boolean openAllSettings(){ if(Options.isAllSettingsOpen()){ return true; } if (!Options.closeHouseOptionsTab() || !GameTab.OPTIONS.open()) { return false; } return Query.widgets() .inIndexPath(116) .textEquals("All settings") .isVisible() .findFirst() .filter(Widget::click) .filter(i -> Waiting.waitUntil(2000, Options::isAllSettingsOpen)) .isPresent(); } private static boolean setSetting(AllSettingsTabs allSettingsTabs, String text) { if(!allSettingsTabs.open()){ return false; } return Query.widgets() .inIndexPath(134) .textEquals(text) .findFirst() .map(i -> { return i.scrollTo() && i.click(); }) .orElse(false); } }
    3 likes
  28. ... and there's more! import lombok.Getter; import java.util.function.BooleanSupplier; public class Option { private String name; private boolean valueToSet; @Getter private boolean isAllSettings; private BooleanSupplier isEnabled; private BooleanSupplier action; public Option(boolean valueToSet, BooleanSupplier isEnabled, BooleanSupplier action) { this.valueToSet = valueToSet; this.isEnabled = isEnabled; this.isAllSettings = false; this.action = action; } public Option(boolean valueToSet, boolean isAllSettings, BooleanSupplier isEnabled, BooleanSupplier action) { this.valueToSet = valueToSet; this.isEnabled = isEnabled; this.isAllSettings = isAllSettings; this.action = action; } public boolean valueToSet() { return valueToSet; } public boolean isEnabled() { return isEnabled.getAsBoolean(); } public boolean shouldChange() { return isEnabled() != valueToSet(); } public boolean changeSetting() { return action.getAsBoolean(); } } import org.tribot.script.sdk.Camera; import org.tribot.script.sdk.Log; import org.tribot.script.sdk.Options; import org.tribot.script.sdk.Waiting; import org.tribot.script.sdk.antiban.PlayerPreferences; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class OptionsHelper { private List<Option> options; public OptionsHelper(List<Option> options) { this.options = options; } public static class OptionsBuilder { private List<Option> options = new ArrayList<>(); public OptionsBuilder setWindowMode(Options.ResizableType resizableType) { options.add(new Option(true, false, () -> Options.getResizableModeType() == resizableType, () -> Options.setResizableModeType(resizableType))); return this; } public OptionsBuilder setDisableLevelUpInterfaceEnabled(boolean enable) { options.add(new Option(enable, true, OptionsUtility::isDisableLevelUpInterfaceEnabled, () -> OptionsUtility.setDisableLevelUpInterfaceEnabled(enable))); return this; } public OptionsBuilder setAcceptAidEnabled(boolean enable) { options.add(new Option(enable, true, Options::isAcceptAidEnabled, () -> Options.setAcceptAid(enable))); return this; } public OptionsBuilder disableSounds() { options.add(new Option(false, true, Options::isAnySoundOn, Options::turnAllSoundsOff)); return this; } public OptionsBuilder setEscapeClosing(boolean enable) { options.add(new Option(enable, true, Options::isEscapeClosingEnabled, ()-> OptionsUtility.setEscapeClosing(enable))); return this; } public OptionsBuilder setShowActivityAdviserEnabled(boolean enable) { options.add(new Option(enable, true, OptionsUtility::isShowActivityAdviserEnabled, () -> OptionsUtility.setShowActivityAdviserEnabled(enable))); return this; } public OptionsBuilder setAcceptTradeDelayEnabled(boolean enable) { options.add(new Option(enable, true, OptionsUtility::isAcceptTradeDelayEnabled, () -> OptionsUtility.setAcceptTradeDelayEnabled(enable))); return this; } public OptionsBuilder setGrandExchangeBuyWarning(boolean enable) { options.add(new Option(enable, true, OptionsUtility::isGrandExchangeBuyWarningEnabled, () -> OptionsUtility.setGrandExchangeBuyWarning(enable))); return this; } public OptionsBuilder setGrandExchangeSellWarning(boolean enable) { options.add(new Option(enable, true, OptionsUtility::isGrandExchangeSellWarningEnabled, () -> OptionsUtility.setGrandExchangeSellWarning(enable))); return this; } public OptionsHelper build() { return new OptionsHelper(options); } } public boolean setOptions() { if (options.isEmpty()) return true; Collections.shuffle(options); boolean allSettingsFirst = PlayerPreferences.preference("all.settings.first", g->g.uniform(0, 100)) > 50; if (allSettingsFirst){ options.sort(Comparator.comparing(Option::isAllSettings).reversed()); } for (Option option : options) { if(option.shouldChange()){ if (!option.changeSetting()) { return false; } Waiting.waitNormal(300,55); } } if(options.stream().noneMatch(Option::shouldChange)){ if(Options.isAllSettingsOpen()){ Options.closeAllSettings(); } return true; } return false; } } Usage is easy: val options = new OptionsHelper.OptionsBuilder() .setAcceptTradeDelayEnabled(true) .setGrandExchangeBuyWarning(true) .setWindowMode(Options.ResizableType.FIXED) .disableSounds() .setEscapeClosing(true) .build(); options.setOptions(); I'm certain it can be improved upon but it should make for a good start 🙂
    3 likes
  29. Really interesting read. Loving the blog posts!
    3 likes
  30. I've added some more forum integration. Now your username in the client syncs with your forum username. You'll also notice that we have working subscriber ranks.
    3 likes
  31. Ooh nice! Good luck with your botting adventure 🤩
    3 likes
  32. It's been a while since our forums actually integrated with the rest of the system. For over a year the VIP/Tribot Subscriber sync stopped working as we changed stores. Part of the new forums was moving everything over from AWS to a Digital Ocean droplet. On its face this seems like a downgrade, but this forum software really wasn't meant to be deployed in a distributed way. We can achieve all the same benefits in a much cheaper way, which is why I did it like this. One very important benefit here is the ability to access the database directly from our other systems that sit on different machines. That, along with the forum API, I'll be implementing a few features in the next week or so: Tribot subscriber rank sync. If you are a tribot subscriber, your forum rank will show it Discord webhooks so that our discord users have better visibility to new forum posts A giveaway function to pick random winners for any given thread Our main codebase is a distributed monolith, meaning it's one "application" that we deploy as multiple processes onto separate machines simultaneously. The code for all this will live there and talk to the forums. I'll likely implement the sync as both something that happens when someone's VIP is purchased, as well as a nightly cron that removes the rank for those who aren't subscribed. The cron gets executed as a Kubernetes job. All it actually does is call a given endpoint on our monolith system to actually run something. A lot more complicated than a traditional linux cron job, but that's distributed programming for you. Luckily I have that system already built out, so adding more cron functions is quite easy. If anyone has any more forum integration ideas, feel free to post them here!
    3 likes
  33. Hey fellas. Its good to have this forum back up and running. I have been using TriBot for years and have never looked back. The community is great and staff is amazing. Looking forward to the new beginning of the forum. If anyone has any questions or needs any help feel free to reach out to me without hesitation.
    3 likes
  34. In order to login to the new forum you have to clear your tribot cookies. Watch the video below how to do this. Reload the page afterwards.
    3 likes
  35. 50+ Range 45+ Prayer 1m - 4m+ GP/HR Advanced Anti-PK Restocking Muling Dynamic Spots (rotate rev spot depending on certain conditions) Practical Easy to Use GUI Fully Customization Gear and Inventory (Supports Automatic Gear Buying) Auto Bonding All Ether Weapons Supported Discord Web hook support (Notifications On Script end and Loot) Fight Back Anti-PK (includes spec support dragon dagger & dark bow) Advanced Eating support (includes combo food, brews & eat at different values for anti-pk & pve) Bank At Trip Profit PK Loot Key Support (Includes Selling All The Items Received From PK Loot Key!) Bank At Food/Prayer Count Option Advanced Looting Advanced World Hopping Settings Supported Amulet of Avarice Supported + Skull At Npc Mode Supported Much More Is Supported Recommend Joining My Discord To Get More Info Or Purchasing The Script
    2 likes
  36. Can train multiple different OSRS skills for experience and profit. Link to store: aTrainer AIO - Tribot for OSRS® After purchase you will find the script under the TOOLS category. Supported skills: FISHING COOKING WOODCUTTING FIREMAKING FLETCHING MINING SMITHING Main features: Multiple full scripts in one package Can train certain skills together For example: fish and cook, chop and make fire, chop and fletch, mine and smelt Task queue that you can use to train skills to specific levels, for a certain time or to certain resource amounts Using queue is optional. Each skill can be used on its own. Forestry support for woodcutting Rising roots, struggling sapling, flowering bush, leprechaun, beehive, friendly ent, poachers, ritual, pheasant Very customizable Support for custom locations and custom location profiles How to setup: Skill information: Progress reports: Arguments: last = will start queue or a single task depending on which you started the last time you used the script queue:profilename = will start queue with that profile taskname:profilename = will start single skill task with that profile (for example woodcutting:profilename) profilename = will find the first profile with that name (make sure not to have multiple with same name) random:profile1,profile2,profile3 = will start random profile You can also use last as profilename to load a specific task with last settings. (for example woodcutting:last) Fastest way to get support is to go to my discord and contact me there: https://discord.com/invite/yFVmK4qEeR
    2 likes
  37. Re-written for an optimal and safe Herblore experience Features Mixes all 2-ingredient Potions Mixes all Unfinished Potions Cleans all Herbs Full Amulet of Chemistry support Automatic stopping when out of any ingredients or amulets Support for pressing "esc" to close the bank interface Unique, multi-method Premium-level antiban system User-selectable reaction-times Simple UI, simple paint Intuitive GUI Shows profit/loss accurately, even when using the Amulet of Chemistry Stable Working 2023 Repository Link Please note, no new features will be added to this script - the intention is to offer a very high quality script for free use for the community, not offer Premium-only features and tread on the toes of other hard-working scripters. Bug reports are always welcome though and will be resolved quickly!
    2 likes
  38. Hi, Clients just updated and now it's working, I appreciate it! Thanks
    2 likes
  39. Depending on how fast I can get through the tutorials and absorb the API, I'm down to give this a shot in the near future. I did this manually a few days ago (shocking I know, I actually played the game for a while haha). I'd be lying if a Jad script wasn't floating around in my head as a good idea.
    2 likes
  40. This is a silly script just to see if I can make a chat bot in RS using this client. I'm sure this can be improved upon. Feel free to let me know how! I just started learning java recently and have made a few simple scripts, but wanted to see if I could put chatGPT into a script. Here it is: package scripts; import org.jetbrains.annotations.NotNull; import org.tribot.script.sdk.*; import org.tribot.script.sdk.input.Keyboard; import org.tribot.script.sdk.interfaces.PlayerMessageListener; import org.tribot.script.sdk.query.PlayerQuery; import org.tribot.script.sdk.script.TribotScript; import org.tribot.script.sdk.script.TribotScriptManifest; import org.tribot.script.sdk.query.Query; import org.tribot.script.sdk.types.Player; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.security.Key; @TribotScriptManifest(name = "GPT Test Script", author = "Me", category = "Practice", description = "GPT Testing") public class GPTTestScript implements TribotScript { boolean talkingToSomeone; String lastMessage; private static final String API_URL = "https://api.openai.com/v1/chat/completions"; String player; String message; PlayerMessageListener playerMessage = new PlayerMessageListener() { @Override public void onPlayerMessage(@NotNull String s, @NotNull String s1) { player = s; message = s1; } }; @Override public void execute(final String args) { while (true) { MessageListening.addPlayerMessageListener(playerMessage); playerMessage.onPlayerMessage(player,message); if (!talkingToSomeone) { // can enable these to chat in the game and ask people to chat //Keyboard.typeString("Talk to me plz! Put '..' in the message to chat with me!"); //Keyboard.pressEnter(); } //looking for a message with ".." so we aren't responding to every message that we get. This can be configured if (message != null && message.contains("..") && message != lastMessage) { talkingToSomeone = true; Log.debug("Player: " + player); Log.debug("Sent message: " + message); Keyboard.typeString(player + " " + chatGPT("Respond with a few words" + message)); Keyboard.pressEnter(); //Log.debug("Response: " + chatGPT("Respond with a few words" + message)); lastMessage = message; } else { talkingToSomeone = false; //Waiting.waitNormal(10000,1500); } Waiting.waitUniform(500,800); } } public String chatGPT(String message) { String url = "https://api.openai.com/v1/chat/completions"; String apiKey = "APIKEYHERE"; // YOUR API key goes here String model = "gpt-3.5-turbo"; // current model of chatgpt api try { // Create the HTTP POST request URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Authorization", "Bearer " + apiKey); con.setRequestProperty("Content-Type", "application/json"); // Build the request body String body = "{\"model\": \"" + model + "\", \"messages\": [{\"role\": \"user\", \"content\": \"" + message + "\"}]}"; con.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); writer.write(body); writer.flush(); writer.close(); // Get the response BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // returns the extracted contents of the response. return extractContentFromResponse(response.toString()); } catch (IOException e) { throw new RuntimeException(e); } } // This method extracts the response expected from chatgpt and returns it. public String extractContentFromResponse(String response) { int startMarker = response.indexOf("content") + 11; // Marker for where the content starts. int endMarker = response.indexOf("\"", startMarker); // Marker for where the content ends. return response.substring(startMarker, endMarker); // Returns the substring containing only the response. } }
    2 likes
  41. ARK GOTR best script ive used
    2 likes
  42. I decided to put this together over the course of a couple hours one afternoon to alleviate the pain of manually checking proxies before using them to ensure that they were not already blocked by Jagex. I'm not a Python person, so it probably won't contain project conventions that you would typically see in such a project. This tool will validate the list of proxies that you provide, and generate two files with the results. One file is a csv containing all of the valid proxies in the list provided, formatted to be imported directly into Tribot. The other file is a report type analysis file, letting you know which proxies were valid and which proxies were blocked by Jagex. Right now it only validates authenticated proxies, and only supports reading one proxy string format. It's saved me a ton of time when rotating large numbers of proxies. Every rotation I export the proxies from the site, copy them into the proxies file, run the program and I know immediately which ones are the dead proxies to avoid. I figured it might be handy for anyone else looking to validate a large number of proxies against Jagex servers in a short period of time. The GitHub contains a README explaining how to setup / run the program with some other information. Let me know if there is anything unclear, and I'll help out where I can. https://github.com/SecretScripting/proxy-validator
    2 likes
  43. great bot. live your best life. its not fully customizable like claimed and doubt there will be support to assist that
    2 likes
  44. Very handy since you can do multiple skills with just one script. It has alot of customization too. Used it the whole BETA and got 0 bans.
    2 likes
  45. I wrote these so you can recover if you need to cast a spell that is being filtered. Hope it's helpful 🙂 import lombok.AllArgsConstructor; import lombok.val; import org.tribot.script.sdk.GameState; import org.tribot.script.sdk.Magic; import org.tribot.script.sdk.Waiting; import org.tribot.script.sdk.WidgetAddress; import org.tribot.script.sdk.query.Query; import org.tribot.script.sdk.types.Widget; import java.util.Arrays; public class SpellFilter { private static final WidgetAddress spellFilters = WidgetAddress.create(() -> Query.widgets().inRoots(218).isDepth(2).textEquals("Spell Filters").isVisible().findFirst()); private static final int SPELL_FILTERS_ROOT = 218; private static final WidgetAddress spellFilterButton = WidgetAddress.create(() -> Query.widgets().inRoots(SPELL_FILTERS_ROOT).isDepth(3).textEquals("Filters").isVisible().findFirst()); /** * Checks if any spell filter is enabled * * @return true if a spell filter is enabled, false otherwise */ public static boolean isSpellsFiltered() { return Arrays.stream(Filter.values()).anyMatch(Filter::isFiltered); } /** * Opens the spell filters widget * * @return true if the spell filters widget is opened, false otherwise */ public static boolean openSpellFilters() { if (Magic.isSpellFiltersOpen()) { return true; } if (!org.tribot.script.sdk.GameTab.MAGIC.open()) { return false; } if (!Magic.isSpellFiltersOpen() && !spellFilterButton.lookup().map(Widget::click).orElse(false)) { return false; } return Waiting.waitUntil(4000, Magic::isSpellFiltersOpen); } /** * Toggles the specified spell filter * * @param filter the filter to toggle * @return true if the filter is toggled, false otherwise */ public static boolean toggleFilter(Filter filter) { if(!openSpellFilters()){ return false; } val priorState = filter.isFiltered(); if(!spellFilters.lookup().flatMap(i -> i.getChild(filter.widgetIndex)).map(i -> i.click("Change")).orElse(false)){ return false; } return Waiting.waitUntil(4000, ()-> filter.isFiltered() != priorState); } @AllArgsConstructor public enum Filter { COMBAT_SPELLS(6605, 0), TELEPORT_SPELLS(6609, 1), UTILITY_SPELLS(6606, 2), MISSING_LEVEL(6607, 3), MISSING_RUNES(6608, 4), MISSING_REQUIREMENTS(12137, 5), ICON_RESIZING(6548, 6); private final int varbit; private final int widgetIndex; public boolean isFiltered() { return GameState.getVarbit(varbit) == 1; } } } I also have the varbits and an isFiltered method for prayer, I didn't get as far as making a toggle, but I could if anyone needs it 🙂 @AllArgsConstructor public enum Filter { LOWER_TIERS(6574), LOWER_TIERS_MULTISKILL(6575), RAPID_HEALING(6576), MISSING_LEVEL(6577), MISSING_REQUIREMENTS(6578); private final int varbit; public boolean isFiltered() { return GameState.getVarbit(varbit) == 1; } }
    2 likes
  46. Great post, I find the format of these blog updates to be an effective way to keep us informed about the ongoing and planned projects. Having read your post, I'd like to put forward a suggestion that could potentially make scripting more user-friendly and innovative. A Behavior Tree GUI scripting utility could be a valuable addition. Similar to systems found in popular game engines like Unreal Engine, this could offer a more intuitive and interactive way to design and understand bot behaviors. It would most likely require a lot of dedication and substantial time investment. However, the potential benefits could be substantial, particularly in terms of making scripting more accessible and enabling scripters to create more complex and efficient bots, and it would of course just be awesome to use.
    2 likes
  47. 2 likes
×
×
  • Create New...