Leaderboard
-
Czar
Global Moderator423Points23726Posts -
Khaleesi
Developer133Points27832Posts -
dannychongas
Members48Points129Posts -
skillerkidos1
Java Lifetime Sponsor41Points1607Posts
Popular Content
Showing content with the highest reputation since 07/29/25 in Posts
-
๐ Perfect Czar Free Trials & Demos ๐ MOST POPULAR ๐ HIGHEST QUALITY ๐ MOST TOTAL USERS ๐ LOWEST BAN-RATES ๐ 24/7 SUPPORT ๐ SINCE 2015 ๐ MANY SKILLS ๐ MOST VIEWS ๐ MOST REPLIES ๐
๐CzarScripts #1 Bots ๐ ๐ LATEST BOTS ๐ If you want a trial - just post below with the script name, you can choose multiple too. ๐ Requirements ๐ Hit 'like' ๐ on this thread77 points
-
Czar Quester
13 pointsList of Quests supported (79): if you have any quest requests, please post below!! The list will grow always!! WARNING: Please make sure your account can actually defeat npcs (if applicable) (highly recommend magic spellcasting) Also note: if you have completed a quest, it will be hidden from the setup window for less confusion!! Animal magnetism Barcrawl Below ice mountain Biohazard Black knights fortress Bone voyage (you need 100+ kudos) Big Chompy Bird Hunting (BETA) Children of the sun Clock tower Cooks assistant Creature of fenkenstrain Darkness of hallowvale Death plateau Death to the dorgeshuun Demon slayer Depths of Despair Digsite Dorics quest Dragon slayer i Druidic ritual Dwarf cannon Eagles peak Elemental workshop i Elemental workshop ii Enlightened Journey Ernest the chicken Fairytale i (if you get unlucky 3 random non-GE-buyable items, may not be possible!) Fight arena Fishing contest Gertrudes cat Ghosts ahoy Goblin diplomacy Hazeel cult Holy grail Horror from the deep In aid of the myreque In search of the myreque Jungle potion The knights sword Lost city The lost tribe Merlins crystal Monkey madness i (BETA, you need 200k coins for puzzle) Monks friend Murder mystery Nature spirit Observatory quest One small favour Pirates treasure Plague city Priest in peril Prince ali rescue Queen of Thieves Recruitment drive Restless ghost RFD: Another Cook's Quest RFD: Freeing General Wartface Romeo and juliet Rune mysteries Sea slug Shadow of the storm Sheep herder (BETA) Sheep shearer Shilo village Sins of the father (BETA, no mirror for bossfight) Spirits of the elid A taste of hope The feud The golem The grand tree The tourist trap (no safespotting) Tree gnome village (need 43 prayer+, no safespotting) Tribal totem Troll stronghold Underground pass Vampyre slayer Wanted Watchtower Waterfall Witchs house Witchs potion X marks the spot Zogre Flesh Eaters This is still a new script, so if you ever find any bugs or errors, please use the template below and it will be fixed immediately. Bug Report Template: If ... something is missing - What is the new feature you'd like? - Basic description of what the script should do? - Basic actions for the script: 'Use item on item' etc? If ... you'd like a quest to be added - Quest name, and any useful tips I should know If ... the script gets stuck or freezes on a tile (or continuous loop): - Which exact tile does the script get stuck on? (exact tile, not 'near the draynor village'), screenshots please - Which teleports did you have? - Did you have any coins or shantay pass in inventory? Usually these will help the bot If ... bot has a logic bug (e.g. dies while safespotting) - What is the bug - How did you make the bug happen - Which stage of the quest did you start the bot on? Usually it's best to let the bot start the quest - (optional) recommendation for the bug, e.g. 'make the script walk back' or something - Tried client restart? - Any screenshots or relevant logs (bottom right to toggle) - Which exact setup options are enabled? Afk mode, cannon mode, etc etc. Bot Preview:13 points
-
OSBot Update โ Transition to the New Native (C++) Client
Dear Community, We know this transition brings big changes and we truly appreciate your understanding and continued support. The team has poured countless hours into building something better for all of us, and weโre excited for whatโs ahead. We do understand the frustration with the transition and we wish there was another way to transition. This was the only way possible to keep OSBot open. The current Java/Stealth client has been temporarily brought back online, but it will break permanently soon. This will mark the definitive end of support for the Stealth/Java version of OSBot. Stable 2.7.71 is the final Java release. Our team is now fully focused on developing a brand-new native C++ client, designed to support the official OSRS client. This has been a major undertaking, with @Patrick, @Khaleesi, and @Zach completely rewriting the OSBot client from the ground up. We plan to release it soon (no ETA is available yet). Important notes on scripts: Existing Java scripts will not be compatible with the new native client and will not carry over. We cannot require or expect script writers to rewrite their entire repositories for free. Many scripts were developed and sold in Java for the previous clientโsome have been available in the Script Store for nearly 10 years. This transition decision was made by the OSBot staff, not individual script writers. If you recently purchased a script (within the last few weeks), feel free to contact us via the refund section for a refund. Qualifying requests will be processed within a week. Membership changes: The new native client will be available free for 1 client instance, including access to around 10 free scripts. The current VIP category will be renamed to C++ VIP. Perks will include: Unlimited clients Access to local and private scripts ALL VIP scripts New color on the forums and discord (will go live within 24 hours) This will function like the free version of our previous SDN, but with higher quality standards now that Khaleesi has taken over curation to ensure they meet OSBot's desired level of quality. We will be phasing out the Sponsor and Lifetime Sponsor tiers. All Lifetime Sponsors will receive a 20% discount on C++ VIP forever. Every Lifetime Sponsor who direct messages me and requests it will also get 1 month of free VIP (no time limit on redemptionโyou can wait 6 months or longer until the VIP script repository has grown to your liking!). We truly appreciate your patience and support during this major transitionโit's a significant step forward for OSBot. Thanks, The OSBot Team12 points
-
Progamerz Giants' Foundry
11 pointsProgamerz Giants' Foundry Buy now($8.99): Store Or Like the post and comment below to get 12 hours trial Join the Discord Server for faster support and bug fixes.(No trials will be given through discord) Features: Simple and easy to use GUI Fully customizable input materials Efficient and precise stage switching Uses the best mould setup to get more points and experience Supports ice gloves and water buckets Custom break manager Automatic stop conditions Instructions: Make sure the client is in fixed mode and not resizable. Make sure to start the script with the weapon equipment slot empty. The script will automatically know it should use a bucket of water if ice gloves or smiths gloves (i) are not equipped when starting the script. Enjoy the gains CLI Instructions Screenshots:11 points
-
Czar Revenants
11 pointsPRICE NOW 24.99$ LIFETIME, NO MORE MONTHLY! NEW! ADDED GRAND EXCHANGE BUYING/SELLING ADDED FIGHT BACK TO PKERS Screenshots BEST RECORD: 121 HOURS! Disclaimer: We cannot guarantee that you won't be pked ever. Setup Preview: Features coming soon: Muling Auto-bonding Imbuing MSB After Death Progressive Levelling11 points
-
Perfect Thiever AIO
9 pointsThis is an AIO (All-in-one) bot that has almost every thieving style except blackjack, ask for a free trial by liking thread or making a post! Vyres and elves are now supported! Both can make solid profit per hour, decent passive income! BIG THANK YOU TO ALL OUR SUPPORTERS! WE ARE THE MOST SOLD THIEVING BOT IN OSBOT HISTORY. MOST REPLIES, MOST USERS, LONGEST PROGGIES #1 Thiever | Most Overall Sales | Most Total Replies | Most Results | 10+ Years Maintained | 'the intelligent choice' by Czar SUPPORTS VYRES 224M made in a single sitting of 77 hours 1.1B made from elves and vyres!! ELVES SUPPORTED TOO! (NEW) 2.1m/hr, 6 crystals in 7 hrs 99 THIEVING MANY MANY TIMES, 35M EXP IN ONE BOTTING RUN!! 99 thieving in ~43k xp (12 minutes remaining)! Just got 99 proggy! Gratz to @iz0n THIEVING PET AT LVL 22 FROM TEA STALLS 11.5 HOURS, WITH PET TOO!! 610k/hr getting 99s on deadman worlds!9 points
-
Czar Guardians of the Rift
8 pointsThe most complete, most features, Guardians of the Rift Bot anywhere on the market, provably so! by Czar New record is 285 hours!!!!!!!!!! Full feature list (All-in-one solution) - Completes Rune Mysteries, Enter the Abyss, Temple of the Eye, 10 runecrafting - Supports filling/emptying all essence pouches, and repairing (both npc contact and cordelia repair) - Supports ALL pouches, including Colossal Pouch - Upgrade pickaxe - Loot chest and buy, wear robes - Minigame teleport + webwalk from anywhere in the game - Uses catalytic talismans whenever possible - Deposits runes at pool, or drops them if UIM - Assembles guardians if limit isn't reached - Places cells as soon as available - Screenshot on pet drop - Custom breaks per games played randomly (e.g. 10-25 games -> trigger breaks) - Hop worlds if not already in an official world - CLI Support - Bot manager support - Mine until portal appears option (strategy) - Unlocks pouches as you progress - Account builder ready, start from tutorial island!! - Buys raiments of the eye robes automatically - Prioritises portals for better essence - Automatically loots rewards from the guardian chest - Supports talismans and drops useless items to save space for more XP - UIM and GIM support, can share a bank too! - Unlocks Cordelia repair option too (25 initial cost, 1 pearl after) - Repairs barriers - Buys everything needed - Does all the quests required - Choose how long to run the bot, how long to take breaks for, when to start/stop - World hopping support, prioritises official GOTR worlds too! - Saving/loading profiles for quicker setup, easiest on OSBot, compatible with bot manager, queue, CLI too! - Balances points automatically, or choose elemental/catalytic only - Repairs pouches via Cordelia! new! - Smart scheduling, you can choose to stop at needle + full set, or even 99! - Opens intricate pouches new! - Uses reward lamps on runecrafting new! - Food while questing! (even buys wines!!) new! - Smart world hop system, detects low pop worlds! new! - Added new wiki strategy to get more points! new! - Automatically builds colossal pouch for you! new!8 points
-
OSBot Native - Beta Release Now Live
7 points๐ OSBot Native Beta Release Now Live!Weโre excited to officially launch our OSBot Native Beta Version! This beta phase is focused on testing performance, stability, and gathering community feedback before the full public release. ๐น Beta Information๐ Beta Client Download: Download button or here ๐ Access Requirement: VIP+ Rank Only ๐ Purchase VIP Rank: Get it here ๐ Add Scripts to your account here โถ๏ธ How to runDownload OSBot Beta client here Have Microsoft Visual C++ 2015โ2022 Redistributable installed 64-bit: https://aka.ms/vs/17/release/vc_redist.x64.exe 32-bit: https://aka.ms/vs/17/release/vc_redist.x86.exe If your OS is Win 11, make sure to "Unblock" the file. (Right click -> Properties -> Check the Unblock box at the bottom) Make sure your Diplay settings are at 100% on your monitors Open up an Official game client through Jagex/Bolt launcher if you have a jagex account, open OSClient.exe for legacy accounts Login to you OSBot account using your username Connect to your game client Enjoy! ๐ฏ Important NoticeAll scripts will be completely free during the beta phase for testing purposes. This allows VIP+ members to: Test all available scripts Report bugs and issues Suggest improvements Help optimize performance Your feedback is extremely valuable and will directly impact the final release quality. Any issues/bugs encountered can be discussed with the developer of the script you are testing or can be posted here Thank you for being part of the beta and helping us improve the product. Stay tuned for updates and future announcements!7 points
-
๐ Perfect Czar Free Trials & Demos ๐ MOST POPULAR ๐ HIGHEST QUALITY ๐ MOST TOTAL USERS ๐ LOWEST BAN-RATES ๐ 24/7 SUPPORT ๐ SINCE 2015 ๐ MANY SKILLS ๐ MOST VIEWS ๐ MOST REPLIES ๐
New discord is up now!!7 points
-
Perfect Agility AIO
6 pointsBrought to you by the #1 most sold script series on the market. Come and see why everyone's choosing Czar Scripts! This is the most advanced Agility bot you will find anywhere. BUY NOW $9.99 NEW! Added Both Wyrm Courses! SCRIPT INSTRUCTIONS Optimal Setup for the bot: Please set the mouse zoom to far away (to the left, like below) so that more obstacles can be seen in the view, and so the script can be more stable and reliable Also, make sure to have roofs toggled off (either go to settings tab or type ::toggleroof) for optimal results6 points
-
Perfect Wintertodt
6 pointsBy Czar 99 in one go!!! Multiple 99s in 1 sitting!!!!! Features List - Supports 4 locations, with randomisation options (Randomise all, randomise north-only, randomise south-only) - Supports taking the axe for woodcutting, if not already equipped/held - Supports taking all equipment including Tinderbox, knife, unfinished potions from crates - Prepares for matches early, and waits around the brazier if you selected to light them (For +25 initial points) - Supports waiting at the safezone after winning the match (at 500 points) to preserve food - Supports training agility via the northern agility steppe - Knows exactly which external actions interrupt your current action, and plans accordingly - Identifies cold snaps and either avoids them completely, or randomises between avoiding and tolerating them - Allows you to fletch logs before burning them for a more balanced experience gain - Choose to optionally switch to other sectors if pyromancer is dying - Identifies pyromancer health, brazier repaired, brazier lit at all times - Knows exactly how many points our current inventory holds (in terms of burning logs) - Gets 1-50 firemaking: locked to maximum of 50 firemaking, and locked to Grand Exchange only. - Buys a player-owned-house via the Varrock Estate agent if you don't already own one (Optional) - Identifies if the account has visited Zeah before, and plans ahead. - Will travel to Zeah by ship to unlock it for newer accounts (Highly useful for goldfarming!) - Resupplies food, jewellery and teleports via the Grand Exchange - Teleports to Grand Exchange supported: Ring of wealth, Varrock teleport tab, Varrock spell (runes only!), Amulet of glory, Home teleport (Lumbridge/Edgeville) - Teleports to Wintertodt Camp supported: Games necklace, walking - Allows you to filter and join matches when a certain % of the game is already active, so wait for next match if below X% - Either holds onto crates, banks them or opens them - up to you! - Supports choosing your own food, choosing when to eat (eat %), choosing minimum to leave match for, and amount to withdraw - Upgrades to pyromancer gear when applicable - Identifies when you get a Phoenix pet - Buys warm clothing that your account is able to wear, filters by skill requirement. - Stop notifications tab (similar to Perfect Fighter): allows you to choose when to stop the bot, or when to alert/notify you - Stop the script at ANY moment in time, after X minutes/hours/seconds, after X wins, after X item gained (pet too!), after X experience gained & more! Buying Warm Clothing (4 missing pieces)! Results6 points
-
Perfect Fighter AIO
5 pointsIf you want to try this premium bot for free, you can ask for a 24 hour free trial below, just select & give this thread a 'like'! Perfect Fighter AIONative C++ FeaturesGemstone crab Choose NPC via nearby Choose NPC via pre-defined list Default presets (always adding more!) for various NPCs Custom fightbox mode Looting Food/Food amount Banking Custom bank triggers: bank when no food, no prayer pots, no combat pots, inventory full, no magic runes, & more! CLI Support (Launch bots from command prompt!) Bot Manager support (perfect for automatic goldfarms, and scaling seamlessly)! Setup & ConfigurationThis bot uses a custom setup interface which is hosted on the web, feel free to browse around the different settings available. If you'd like anything added, please let us know! https://rust-setup-gui.onrender.com/fighter ๐ธ Screenshots ๐ธ5 points
-
Czar Motherlode
5 pointsNative C++ Feature List: Supports All Areas (upper/lower) Supports upper hopper Supports repairing struts (always on) Supports dropping gems Supports dragon pickaxe special5 points
-
Perfect Fighter AIO
5 pointsNEW! Added Gemstone Crab! 81 Hours at Cows Brutal Black Dragon support Sulphur Nagua support Blue Dragon 99 ranged 99 Ranged at Gemstone Crab 81 Range F2p Safespotting Hill Giants Hotkey List // F1 = set cannon tile // F2 = hide paint // F3 = Set afk tile // F4 = reset afk tile // F6 = Set safespot tile // F7 = activate tile selector // F8 = Reset tile selector // F9 and F10 used by the client, EDIT: will re-assign as they are no longer used by client // F11 = Set breaks tile // F12 = Reset breaks tile User Interface Banking Tab Demo (handles everything with banking) You can copy inventory (to avoid adding individual items...), you can insert item names which have Auto-Fill (for you lazy folk!) and you can choose whether to block an item and avoid depositing it in bank, ideal for runes and ammo. Looting Tab Demo (From looting to alchemy, noted/stackable items too) You can choose whether to alch an item after looting it simply by enabling a checkbox, with a visual representation. All items are saved upon exiting the bot, for your convenience! Tasking Demo (Not to be confused with sequence mode, this is an individual task for leveling) You can set stop conditions, for example to stop the bot after looting a visage, you can have a leveling streak by changing attack styles and training all combat stats, you can have windows alert bubbles when an event occurs and an expansive layout for misc. options! Prayer Flick Demo (Just example, I made it faster after recording this GIF) There are two settings: Safe mode and efficient mode, this is safe mode: Fight Bounds Demo Allows you to setup the fight bounds easily! Simplified NPC chooser Either choose nearby (local) NPCs or enter an NPC name to find the nearest fight location! Simple interface, just click! Level Task Switch Demo (Switching to attack combat style after getting 5 defence) You can choose how often to keep levels together! e.g. switch styles every 3 levels Cannon Demo (Cannon is still experimental, beta mode!) Choose to kill npcs with a cannon, recharges at a random revolution after around 20-24 hits to make sure the cannon never goes empty too! Results Caged Ogres: How does this bot know where to find NPCs? This bot will find far-away npcs by simply typing the NPC name. All NPCs in the game, including their spawn points have been documented, the bot knows where they are. You can type 'Hill giant' while your account is in Lumbridge, and the bot will find it's way to the edgeville dungeon Hill giants area! Here is a visual representation of the spawn system in action (this is just a visual tool, map mode is not added due to it requiring too much CPU) Fight Area Example (How the bot searches for the npc 'Wolf') Walking System The script has 2 main walking options which have distinctive effects on the script. The walking system is basically a map with points and connections linking each point. It tells the script where to go, and decides the routes to take when walking to fightzones. Walking system 1 This uses a custom walking API written by myself and is constantly being updated as new fightzones are added. Pros: - Updates are instant, no waiting times - More fightzones are supported Cons: - Sometimes if an object is altered, the changes are not instant - Restarting the script too many times requires loading this webwalker each time which adds unnecessary memory (there is no way to make it only load at client startup since I don't control the client) Walking system 2 This is the default OSBot webwalking API - it is relatively new and very stable since the developers have built it, but is currently lacking certain fightzones (e.g. stronghold) and other high level requirement zones. It is perfect for normal walking (no object interactions or stairs, entrances etc) and never fails. Pros: - Stable, works perfect for normal walking - All scripters are giving code to improve the client webwalker - More efficient when restarting the script since it is loaded upon client start Cons: - No stronghold support yet - Some new/rare fightzones not supported yet - If there is a game-breaking update or an unsupported fightzone, it may take some time to add/repair (less than 24 hours usually) So which system should I choose? Whichever one suits your chosen fightzone best! There really shouldn't be any problems - the sole purpose of these options are for backup and emergency purposes, if the script ever messes up there is always the next option to select. Note: If the script ever fails, there will be immediate updates to fix the walking systems! Script Queue/Bot Manager: Script ID is 758, and the parameters will be the profile name that you saved in the fighter setup! Bug Report templates: New feature request - What is the new feature - Basic description of what the script should do - Basic actions for the script: 'Use item on item' etc. For when the script gets stuck on a tile (or continuous loop): - Which exact tile does the script get stuck on? (exact tile, not 'near the draynor village') - Plugin or normal script? - Did you try all 3 walking options? Script has a logic bug (e.g. dies while safespotting) or (cannon mode doesn't pickup arrows) - What is the bug - How did you make the bug happen - (optional) recommendation for the bug, e.g. 'make the script walk back' or something - Tried client restart? - Normal script or a plugin? - Which exact setup options are enabled? Afk mode, cannon mode, etc etc.5 points
-
๐ฅ KHAL SCRIPTS TRIALS ๐ฅ HIGHEST QUALITY ๐ฅ BEST REVIEWS ๐ฅ LOWEST BANRATES ๐ฅ TRIALS AVAILABLE ๐ฅ DISCORD SUPPORT ๐ฅ ALMOST EVERY SKILL ๐ฅ CUSTOM BREAKMANAGER ๐ฅ DEDICATED SUPPORT
4 points
- OSBot Native - Stable Public Release Now Live!
๐ OSBot Native โ Stable Public Release Now Live!Weโre excited to officially launch the OSBot Native Stable Version! This release marks the transition from beta to a fully optimized and publicly available client, following extensive testing, feedback, and performance improvements. ๐ท Release Information๐ Client Download: Download button or here ๐ Get Scripts: Add scripts to your account on the SDN page or in the Store ๐ฏ Whatโs NewImproved performance and stability Major Beta-reported bugs fully resolved, Minor improvements will follow soon Optimized script execution and CPU usage Smoother and more reliable client experience Better debug tools for developers โถ๏ธ How to RunDownload the OSBot Native client Have Microsoft Visual C++ 2015โ2022 Redistributable installed โธ 64-bit: https://aka.ms/vs/17/release/vc_redist.x64.exe โธ 32-bit: https://aka.ms/vs/17/release/vc_redist.x86.exe If youโre using Windows 11, make sure to Unblock the file (Right click โ Properties โ Check โUnblockโ at the bottom) Set your Display settings to 100% on all monitors Make sure your OSBot folder is not Read only (C:\Users\USERNAME\OSBot) Launch the official game client via Jagex/Bolt launcher (Jagex accounts) or open OSClient.exe for legacy accounts Login using your OSBot username Connect to your game client Enjoy! ๐ฏ Important NoticeAll scripts are now fully functional in the live environment. We still encourage users to: Test scripts thoroughly and report to the script developer Report any bugs or inconsistencies Suggest client improvements Help us continue optimizing performance Your feedback remains incredibly valuable in refining future updates. ๐ฌ Feedback & SupportIf you encounter any issues: Reach out to the script developer Or post directly in the community forums Post in the OSBot Discord "Client-and-script-bugs" ๐ Thank YouA huge thank you to everyone who participated in the beta phaseโyour feedback helped shape this release. Stay tuned for future updates and new features!4 points- [AI] - Script Factory 3.0
4 pointsScript Factory 3.0 The most advanced Script ever made ๐Powered by AI๐ Click here to learn more! made with โค๏ธ4 points- Guide to run multiple clients with sperate proxy.
Here is a guide to get to my current setup, there is many ways to achieve something similar or better, the goal for this to help people that are not sure where to get started to get a base setup, take the things from this guide you can use, and add to it so it fits for you, this is how I do it, not the most optimal way <3 Tools we need: Proxifier https://www.proxifier.com/ Sandboxie https://sandboxie-plus.com/downloads/ Download and install both. Decide on a naming system that works for you, I will be using os1 os2 os3 ... This should be something simple. Jagex Launcher, we do need to make a copy for each client we want to run, for now make 2 copies of First we will setup our proxies so we don't have to worry about them later. Match the naming you choose, I use numbers same as os1 os2 os3 .. Proxifier: We will add 2 proxies and 2 rules as a start, and copy them to make the rest, this is why your naming need to be simple. Lets add our proxy servers to Proxifier A windows will open: Here we press Add and add 2 proxies (Ignore mine, when you are done, you should see 2 on the list), we will automate the process <3 This part I can't help with, check where you got your proxies from and figure out how you should connect to them. you can add a label in the Advanced settings in the window above (not needed, but recommended, to easy see what proxy is for what client) We will now add 2 matching rules. Here we will add rules for the 2 proxies. Make a rule for your sandbox (we will set that up next) The folder you want to use is the one with DefaultBox in it: Here we use the same naming as you choose at the start. mine are os1 os2 os3. You don't need to have the sandboxes created yet. Now with 2 proxies added, and 2 rules for each proxies added, we will export our settings, add how many we want, then import again. Export: Place it somewhere, so you know where it is. You should now have a .ppx file, we can open this with our favorit notepad wannabe (or just Notepad) Here you can see the proxies we added, you should see 2 And the rules: We now need to add the rest of the proxies and rules, I will do this with AI, you can copy/pate, or make a simple tool that do it, if you don't want to use AI. Any AI should do fine, for this demo I will use Deepseek https://chat.deepseek.com/ as it's free but slow (This is slow, I do recommend a better model if adding many at a time), but any AI should do this fine. I used this command to add 50 proxies and rules "Keep the same structure, but add another 50 proxies and matching rules to this: {Content of the .ppx file} " It should then reply with a filled out list, we can now replace this with what was in our .ppx file We can now go back into proxifier and import the new .ppx file Sandboxie: This is a more simple setup, reason we do this is to easily be able to have proxifier work we different clients, and I like to have my clients separated like this. Lets start with making our base sandbox (a clean client), This can be skipped and you can make your client sandbox directly. For this base setup we will install OSRS to our new sandbox, so we have a clean install we can copy. Install osrs, make it as ready as you want for a new client. We can now make a copy of this folder: Create a sandbox with the same name, as this is matching our proxifier rules. We now need to open the matching JagexLauncherXX.exe In the sandbox we made for it, starting osrs with that client and you should see the connections in proxifier So after this long setup. When you want a new client: 1) copy your default sandbox, to the next in your naming system. 2) create a sandbox in sandboxie with matching name. 3)make a copy of JagexLauncher, matching your naming system, start it in the newly created sandbox. I'm currently making a tool to automate all this, and more, if you are interested in a tool like that, got idea or help testing it join my Discord <34 points- Script Factory 3.0 โ A New Era Begins
Weโre excited to officially announce Script Factory 3.0 โ a next-generation evolution of the platform, purpose-built for the new native C++ OSBot client. Development is already underway, and this isnโt just an incremental upgrade. Script Factory 3.0 represents a complete ground-up rewrite designed to modernize the entire system while preserving everything users love about Script Factory and Script Factory 2.0. A Fresh Foundation One of the biggest changes is the transition from Java to Rust. This move allows us to dramatically improve performance, safety, and efficiency while giving us tighter control over memory and execution behavior. The result is a leaner core with lower overhead, faster runtime performance, and improved long-term stability. Smarter Architecture Script Factory 3.0 introduces a redesigned architecture built for robustness and scalability. The new structure makes scripts easier to manage, update, and deploy, while reducing unnecessary complexity under the hood. Weโre focusing heavily on maintainability โ both for developers extending the system and for users running it day to day. Familiar Power, Modern Execution While the internals are being rebuilt, our goal remains clear: preserve the features and workflows the community already relies on. Everything that made Script Factory and Script Factory 2.0 effective โ automation tools, extensibility, and usability โ is being carried forward and enhanced. What This Means Going Forward By aligning Script Factory 3.0 with the native C++ OSBot client and a modern Rust backend, weโre laying the groundwork for a faster, more stable, and future-proof ecosystem. This release is about longevity, performance, and creating a foundation that can grow with the platform. Weโve only just broken ground, but the direction is set โ and weโre excited to bring Script Factory into its next chapter. Stay tuned for progress updates as development continues. - ProjectPact4 points- Perfect Runecrafter AIO
4 pointsThe only Runecrafting bot you will need Purchase this INSANE bot here You can setup a master account (preferably your main account, can be any account) and a worker account (a throwaway bot account, or any account) will trade the master account and go to bank to get more runes etc. The main account (master) does not need to bot, and can be achieved through the normal RS client without a bot client. Supports: Air runes (1) (normal) & (abyss) Mind runes (2) (normal) & (abyss) Water runes (5) (normal) & (abyss) Earth runes (9) (normal) & (abyss) Mud runes (13) (earth altar) Lava runes (23) (fire altar) Fire runes (14) (normal) & (abyss) Body runes (20) (normal) & (abyss) Cosmic runes (27) (normal) & (abyss) Chaos runes (35) (normal) & (abyss) Astral runes (40) (normal) & (abyss) Nature runes (44) (normal) & (abyss) Law runes (54) (normal) & (abyss) Blood runes (abyss) & (zeah) Auto Arceuus Favour Solver Gets 100% arceuus favour for you Auto GE Restocking Sells runes, buys more supplies automatically Auto-equips chosen armour/robes Use Blood Essences Death Handler gets items from Death's office and repeats (Abyss) Glory mode, ferox mode, house spell/tabs Avoids pkers and hops worlds Uses mouse invokes for quicker runecrafting (stealth) Muling (BETA) will give money to your mules every X hours or profit Creates colossal pouch if you have the needle Results and screenshots4 points- [Getting started] Rust Project Setup - RustRover IDE
Requirements: OSBot VIP C++ rank or higher is required to run local scripts. Rust project setup I will be using Rustrover as IDE, feel free to use VSCode or whatever you feel comfortable with. So make sure you have rustrover installed (Free license): https://www.jetbrains.com/rust/ 1. Start a new project 2. Give the project a proper name ("test_setup" for my case) Should be your scripters name No capital letters No spaces, replace spaces with an underscore 3. Toolchain = stable-x86_64-pc-windows-msvc 4. Project template = Library Result should be something like this: 5. Remove the "src" folder 6. Create a new folder with your script name (test_script) No capital letters No spaces, replace spaces with an underscore 6.1 Create a new folder called โsrcโ in this folder 6.1.1. Create a new Rust file called โlibโ inside the script โsrcโ folder 6.2 Create a โCargo.tomlโ file inside the script folder (or copy paste it from below) 7. Open up the Root โCargo.tomlโ file (Bottom one in the image) 7.1 Empty the file and insert this code block: [workspace] members = [ "test_script"]8. Open up the scripts โCargo.tomlโ file (the one under test_script) 8.1 Insert this code block: [package] name = "test_script" version = "0.1.0" edition = "2021" [dependencies] osbot_api = { git = "https://github.com/OSBotNative/stub_api", features = ["script"] } [lib] crate-type = ["cdylib"] 8.2 Refresh your Cargo, this should look like this (If this is not the case remove all in there and add your project, โtest_setupโ in this case and press refresh) 9. Adding a skeleton to your script, Open up the โlib.rsโ file in your scripts folder and add this code block: use osbot_api::api::script::script::Script; use osbot_api::api::script::script_metadata::{ScriptCategory, ScriptMetadata}; use osbot_api::log::info; #[no_mangle] pub extern "C" fn metadata() -> ScriptMetadata { ScriptMetadata { name: "Test Script".to_string(), author: "Khaleesi".to_string(), version: 1.00, info: "Test script - My First Script".to_string(), logo: "https://i.imgur.com/QkTUq3l.png".to_string(), category: ScriptCategory::Other, } } #[osbot_api::script_exports] pub struct KhalTest {} impl Script for KhalTest { //Constructor in case you want to initialize some variables defined in the struct fn new() -> Self { Self {} } //Method called on script start fn on_start(&mut self, params: Option<String>) { info!("Starting {} V{:.2} - {}", metadata().name, metadata().version, metadata().author); } //main script loop fn on_loop(&mut self) -> i32 { info!("Running {}", metadata().name); 50 } //Method called on script start fn on_stop(&mut self) { info!("Stopping {}", metadata().name); } //Required for Message listener, you can define what messageTypes to listen for fn get_chat_message_types(&self) -> Vec<ChatMessageType> { vec![ChatMessageType::Game, ChatMessageType::Spam] } //Message listener if needed fn on_chat_message(&mut self, chat_message_type: ChatMessageType, chat_message: &RSChatMessage) { } }10. Using dependencies between your scripts to minimize code duplication 10.1 Create a new folder on root level "script_dependencies" (No other names allowed) 10.2 Create a "src" and "Cargo.toml" file just like your script setup 11.3 Open up the "Cargo.toml" and add this code block: [package] name = "script_dependencies" version = "0.1.0" edition = "2021" [dependencies] osbot_api = { git = "https://github.com/OSBotNative/stub_api", features = ["script"] } 11.4 Open up the Root level "Cargo.toml" and add "script_dependencies" to the members block: [workspace] members = [ "test_script", "script_dependencies" ]12 How to use the dependencies folder 12.1 create some folder to group certain helper functions, utils, ... 12.2 Rust is using a module system (kind of like maven) so you will have to some mod.rs files inside those folder to expose your modules 12.3 Inside the mod.rs files, expose your helper files inside that folder pub mod interation_utils; 12.4 Update the lib.rs file inside the "script_dependencies" folder to expose your modules you just created pub mod interaction; pub mod inventory; pub mod utils; 12.5 Update scripts "Cargo.toml" to use the dependencies project Add the script_dependencies under [dependencies] together with the osbot_api [package] name = "test_script" version = "0.1.0" edition = "2021" [dependencies] osbot_api = { git = "https://github.com/OSBotNative/stub_api", features = ["script"] } script_dependencies = { path = "../script_dependencies" } [lib] crate-type = ["cdylib"] 13. so if you want to start creating a new script, create a folder just like before Create scripts folder. src folder with lib.rs and Cargo.toml file Add the script module to [workspace] Cargo.toml file 14. Building your script, this will be done on a build server that runs in the cloud: If you do not have an builder account yet, make a request here: https://osbot.org/forum/forum/253-builder-access-requests/ 14.1 The whoe process explained below can be automated by reading this: https://osbot.org/forum/topic/203533-native-automated-compiler/ 14.2 To be able to build your script or scripts we will need a zip file of your project, target folder excluded! There is a maximum set on the server so it should fail automatically when you try this, but don't! What to include: every script folder + script_dependecies folder + cargo.toml (the top layer one) 14.3 go to the script builder website and login with your account. 14.4 Here you will be able to upload the zip file you just created, after uploading press the rebuild button and it should start rebuilding. 14.5 You can also see how busy the server is by check the Queue. 14.6 While the build is running you can click on the Logs button to check what's going on. 14.7 Refresh the page, your script will show up soon if your build was successfull, else you can check the logs why the build failed 14.8 After that just download your script or all of them with the download all button 14.9 Places the dll files in your osbot/scripts folder and it should be visible inside the client after a refresh4 points- Perfect Hunter AIO
4 pointsAdded BETA testing for Hunter Rumours! Can I use this bot with Bot Manager or CLI? Yes, you must save a profile in the Hunter setup menu (top left) and then the name of this file is your parameters. Can I request a new feature to this bot? Yes, all feedback is welcome and I am happy to always add new features! Which features are being worked on at the moment? I am working on automatic muling, and selling items to GE. And a buyer for the quest items for Eagles' peak.4 points- Perfect Prayer AIO
4 points6.99$ Lifetime access You Get: - Gilded altar with Phials un-noting - Chaos Altar with banking (Warning: You will die to PKers) - Ectofuntus (Dueling ring method only) - Shop Buyer (Port Khazard, only buys Pot and Slime) - Loot & Bury - Bank & Bury (added all bones, all ashes scattering too!)4 points- Perfect Construction AIO
4 pointsNEW!! ADDED OAK DUNGEON DOORS!! GUI Preview: Features - 100+ construction items - Scheduling/queuing, choose to stop at X level, and switch to different furniture at X levels - Buys house before starting - Custom break manager - Mouse invokes (stealth) - Oak dungeon doors - Myth cape rack - Oak larders - Builds rooms automatically - Supports all servants/butlers, demon butler - Double fetch mode - Bell pull mode - Hide roofs/mute audio - Money bag mode Screenshots4 points- KO Sailing
4 pointsKO Sailing Currently Supports Salvaging All loctions Alching Salvaging station support Crew support Working on Courier tasks4 points- [Stable] 2.7.57
4 pointsHey, API CHANGES: - Updated the API to reflect the latest game changes. WEB WALKER: - Fixed a couple random links. MISC: - Minor bug fixes. - The OSBot Team4 points- Czar NMZ
3 pointsIf you want to try this premium bot for free, you can ask for a 24 hour free trial below, just select & give this thread a 'like'! Czar Nightmare ZoneNative C++ FeaturesPrayer flick support Fills coffer automatically Equip armour Choose prayers Banking support Special attacks Custom Dream Selection Absorptions, Overloads, Super ranging/maging Power-ups Combat style switching (train levels for goals) Locator Orb support Dwarven Rock Cake support Gallery3 points- Czar Gemstone Crab
3 pointsIf you want to try this premium bot for free, you can ask for a 24 hour free trial below, just select & give this thread a 'like'! Czar Gemstone CrabNative C++ FeaturesSupports combat style switching Supports goal milestones, bot trains stats in different sequences Modes available: Train top-bottom, evenly (choose X levels), lowest skill first Potion boost support Chases the gemstone crab all the time Zooms out camera if using resized/fullscreen Setup & Configuration Screenshots Highest Record (April 25 2026) 81 HOURS!!! ๐ Bug Report Template3 points- OSBot Native 3.03 Update
3 pointsOSBot Native 3.03 UpdateWeโre continuing improvements with OSBot Native 3.03, focusing on Webwalker expansion, developer tooling, UI improvements, and API stability. WebwalkerAdded additional webwalking links to improve overall map coverage. Continued refinement of path connections. Webwalker remains a work in progress as we expand and optimize routes. Scripter ToolsImproved scripter debug tools for better development visibility. Enhanced debugging clarity and usability for script troubleshooting. UIAlready connected clients will now have a โConnectedโ tag displayed for clearer status visibility when connecting other clients. APIFixed several minor bugs across the API. Improved overall API stability and consistency.3 points- Perfect Woodcutter
3 pointsNEW: Released Chop & Firemake plugin Added 8 Forestry events!!!!!!!! Easy 99, Next! Map Chooser System Progress Results! Help How to use this with Bot Manager? Script ID is 631, and the parameters will be the profile you saved in the setup window, e.g. oak15.txt I want a new feature added? Make a post below and I am always listening, within reason! The bot is doing something I don't like? Make a post below and I will adjust the code to match your play style!3 points- [Stable] 2.7.71 - end of life
3 pointsHey, This is likely to be the last OSBot v2 release. The next one will be OSBot v3 for the new Official Client. We're unsure on how secure this version is so use with caution. See you soon for OSBot v3 - The OSBot Team3 points- OSBot Native - Beta Release Now Live
3 pointsgave the new client a try for the hell of it, three accounts banned already. safer my ass. money grab is more like it3 points- Perfect Pest Control
3 points24 hour progress report!! Setup Window Highly intuitive and visual, and easy to use! Portal Prediction knows which portals are going to drop - prioritises them! Full Void in <24 hours It takes only 850 points for full void, go go go! Screenshots & Results3 points- Perfect Motherlode Miner
3 pointsNEW! supports new south + east shortcuts, new hopper (upstairs), and mouse invokes!!! (just like runelite!) 'the intelligent choice' By Czar 34-99 Mining on video!! Agility Shortcut Setup Window Preview 70 hours run time https://i.imgur.com/wiF6VPO.png3 points- Czar Star Miner
3 pointsRequirements - 10 Mining You can then leave the bot running and enjoy the stardust & profit/hr. Nothing else is needed! Features Coming Soon - Automatic Buying Rewards - Automatic Buying More Teleports - 1-10 Miner training - Automatic Selling Gems Setup Preview Gallery3 points- APA Script Trials
3 pointsโโโโโโโโโโโโโโ PREMIUM SUITE โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ FREE / VIP+ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Sand crabs - $4,99 | Rooftop Agility - $5,99 | AIO Smither - $4,99 | AIO Cooker - $3,99 | Unicow Killer - ยฃ3,99 | Chest Thiever - ยฃ2,99 | Rock crabs - $4,99 | Rune Sudoku - $9,99 โก โ AIO Herblore - FREE & OPEN-SOURCE | Auto Alcher - FREE | Den Cooker - FREE | Gilded Altar - FREE | AIO Miner - VIP+ โก โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ What is a trial? A trial is a chance for you to give any of my scripts a test run. After following the instructions below, you will receive unrestricted access to the respective script for 24 hours starting when the trial is assigned. Your trial request will be processed when I log in. The trial lasts for 24 hours to cater for time zones, such that no matter when I start the trial, you should still get a chance to use the script. Rules: Only 1 trial per user per script. How to get a trial: 'Like' this thread AND the corresponding script thread using the button at the bottom right of the original post. Reply to this thread with the name of the script you would like a trial for. Your request will be processed as soon as I log in. If i'm taking a while, i'm probably asleep! Check back in the morning Once I process your request, you will have the script in your collection (just like any other SDN script) for 24 hours. Private scripts: Unfortunately I do not currently offer private scripts. ________________________________________ Thanks in advance and enjoy your trial! -Apaec.3 points- Perfect Magic AIO
3 points#1 SOLD MAGIC SCRIPT #1 MOST FEATURES MAGIC SCRIPT ESC MODE, HOVER-CLICK, NEAREST ITEM CLICK, FLAWLESS JMod nearby and we still alive. Anti-ban and Optimal script usage Anti-ban: - Don't go botting more than 3 hours at once, take breaks! Otherwise the ban-rate is highly increased! - Bans also depend on where you bot, for the best results: bot in unpopular locations Banking-related spells are the lowest ban-rate (spells which require banking or can be casted near a bank, e.g. superheating, maybe alching, jewelry enchanting etc etc) since you can just go to a full world and blend in with other non-bots (humans), for example: world 2 grand exchange If casting spells on npcs, then unpopular locations reduce the banrate by alot, So make sure not to go to botting hotspots otherwise you may be included in ban waves. - Some good areas used to be (until some got popular): grizzly bear, yanille stun-alching, any overground tiles (upstairs etc) but once the areas are overpopulated, try to go to another location which is similar to the aforementioned locations. This is a very popular thread with many many users so if a new location is mentioned, the location will be populated very quickly so I can only suggest examples of good locations - Don't go botting straight after a game update, it can be a very easy way to get banned. Wait a few hours! If you ever get banned, just backtrack your mistakes and avoid them in the future: you cannot be banned without making botting mistakes. Keep in mind you can be delay-banned from using previous scripts, so don't go using free/crap scripts for 24 hours then switching to a premium script, because the free/crap previous script can still get you banned! For more anti-ban information, see this thread which was created by an official developer: http://osbot.org/forum/topic/45618-preventing-rs-botting-bans/3 points- Czar Demonic Gorillas
3 pointsUpcoming Features: - Under development: Automatic GE Restocking - Under development: Walk-away prayer prediction (gorillas) - Under development: Tormented Demon mode (need acc) Bug Report Template This is still a new script, so if you ever find any bugs or errors, please use the template below and it will be fixed immediately. If ... something is missing - What is the new feature you'd like? - Basic description of what the script should do? - Basic actions for the script: 'Use item on item' etc? If ... you'd like a feature to be added - Any useful tips I should know If ... the script gets stuck or freezes on a tile (or continuous loop): - Which exact tile does the script get stuck on? (exact tile, not 'near the draynor village'), screenshots please If ... bot has a logic bug (e.g. dies while safespotting) - What is the bug - How did you make the bug happen - (optional) recommendation for the bug, e.g. 'make the script walk back' or something - Tried client restart? - Any screenshots or relevant logs (bottom right to toggle) - Which exact setup options are enabled? Progress Reports3 points- Czar Mixology
3 pointsRequirements - P2p account - 60 Herblore - Children of the Sun quest complete (takes 5 mins) And you'll wanna have these items in bank: - 1k Tarromin - 1k Toadflax - 1k Lantadyme You can then leave the bot running and enjoy the profit/hr. Nothing else is needed! Features Coming Soon - Automatic GE Restock for Herbs - Grimy Cleaning - Solver for COTS quest (already inside my quester bot) Gallery3 points- Khal Wintertodt
3 points- Automated Compiler
2 pointsNative Script Auto Compiler One Command to Build & Download Your Script Download: Click Here last updated: 04-13-2026 (v1.2.2) Update Log --- WHAT IT DOES --- Run one command and it will: - Package your script + dependencies + Cargo.toml into a ZIP - Upload it, trigger a rebuild, and wait for it to finish - Download the compiled DLL into compiler/downloads/ - Clean up the temp ZIP when done --- SETUP --- 1. Extract the compiler/ folder into your project root (same level as Cargo.toml): my_project/ โโโ Cargo.toml โโโ script_dependencies/ โโโ my_script/ โโโ compiler/ 2. Install Python 3 if you don't have it: Python Installation Steps - Windows: https://www.python.org/downloads/ (check "Add to PATH") - macOS: brew install python3 - Linux: sudo apt install python3 python3-venv 3. Open a terminal in the compiler/ folder and run: Terminal Commands python3 -m venv .venv # macOS / Linux .venv/bin/pip install requests colorama python-dotenv # Windows .venv\Scripts\pip install requests colorama python-dotenv 4. Copy .env.example to .env and fill in your credentials: .env Credentials USERNAME=your_username PASSWORD=your_password That's it. Everything else is auto-detected. --- USAGE --- From your project root: Usage # macOS / Linux compiler/.venv/bin/python compiler/osbot_auto_build.py # Windows compiler\.venv\Scripts\python compiler\osbot_auto_build.py If you have multiple scripts, it will show a menu. You can also pass the name directly: compiler/.venv/bin/python compiler/osbot_auto_build.py my_script Your compiled DLL will be saved to compiler/downloads/. --- NOTES --- - Your source files are never modified or deleted - Works on Windows, macOS, and Linux - If a DLL already exists, it gets overwritten with the new build - Do not share your .env file โ it contains your credentials2 points- OSBot Native - Beta Release Now Live
2 pointsHello, The general situation with the client is clear to me, but what should the user (me) do? I spent +- 200 EUR on various scripts, in particular on KHAL scripts. I have never purchased VIP, but now if you look at what scripts are available when purchasing VIP, it becomes funny, where is everything else? As a regular and active user of OSBOT, I have to pay 10 EUR per month for what? for 5-6 unimportant scripts?2 points- OSBot Native - Beta Release Now Live
2 pointswhats with these scripts? GOTR script randomly stops, the fishing bot doesnt run at all? am i doing something wrong? the only thing that runs good is agility and cooking script..2 points- AI generated Native documentation
2 pointsI definitely wrote this all myself and didnt use AI OSBOT API - Complete Function Reference & Use CasesTable of ContentsPlayers API NPCs API Objects API World & Map API Interactions API Ground Items API Walking & Movement Utilities & Helpers Display & Viewport Management Coordinate Projection System Camera System Rendering & Screen Coordinates Minimap Rendering Geometric Utilities Painting & Overlay Examples Players APILocation: src/api/scene/players.rs Functions for accessing and managing player entities in the game world. Core Functionsplayers_get_local_player() -> Option<RSPlayer>Returns your own player character. Returns: Option<RSPlayer> - Your player if logged in, None otherwise Use Cases: Getting your current position to calculate distances Checking your current status (health, animation, etc.) Verifying game state before performing actions Setting up path-finding from your location Example: if let Some(local_player) = players_get_local_player() { let my_x = local_player.get_x(); let my_y = local_player.get_y(); println!("I am at ({}, {})", my_x, my_y); } players_get_local_player_index() -> i32Returns the index of your player in the players array. Returns: i32 - Array index of local player Use Cases: Iterating through all players efficiently Filtering your player from a list of all players Internal API operations players_get_at_index(index: i32) -> Option<RSPlayer>Retrieves a player at a specific array index. Returns: Option<RSPlayer> - Player at index if valid, None otherwise Use Cases: Iterating through all players in the world Following up on index-based queries players_get_all() -> impl Iterator<Item = RSPlayer>Returns an iterator over all players currently visible. Returns: Iterator yielding all RSPlayer instances Use Cases: Finding all players in a specific area Counting players near a location Checking for friends or clan members Detecting multi-logging Example: let player_count = players_get_all().count(); println!("There are {} players visible", player_count); // Find players near a specific position if let Some(local_player) = players_get_local_player() { let nearby = players_get_all() .filter(|p| { let distance = ((p.get_x() - local_player.get_x()).pow(2) + (p.get_y() - local_player.get_y()).pow(2)) .sqrt() as i32; distance < 50 }) .count(); } players_get_all_in_worldview(world_view: RSWorldView) -> impl Iterator<Item = RSPlayer>Returns players in a specific world view (instance/world). Parameters: world_view - The world view to query Returns: Iterator yielding RSPlayer instances in that world view Use Cases: Working with instanced content (dungeons, raids) Multi-world scenarios Filtering players by location group NPCs APILocation: src/api/scene/npcs.rs Comprehensive functions for finding, filtering, and interacting with NPCs. Finding Functionsnpcs_find_closest_by_id<T: Into<IdArgs>>(args) -> Option<RSNpc>Finds the nearest NPC matching a specific ID. Parameters: args - NPC ID(s) to search for Returns: Option<RSNpc> - Closest matching NPC or None Use Cases: Locating a specific NPC banker or shop keeper Finding the nearest vendor Pathfinding to quest NPCs Example: // Using single ID if let Some(banker) = npcs_find_closest_by_id(1634) { println!("Banker at ({}, {})", banker.get_x(), banker.get_y()); } // Using multiple IDs (any match) if let Some(npc) = npcs_find_closest_by_id(vec![1, 2, 3]) { println!("Found NPC near me"); } npcs_find_closest_by_name<T: Into<NameArgs>>(args) -> Option<RSNpc>Finds the nearest NPC by name. Parameters: args - NPC name(s) to search for Returns: Option<RSNpc> - Closest matching NPC or None Use Cases: Finding specific NPCs by their display name Quest NPCs by name Named vendors or quest givers Example: if let Some(guard) = npcs_find_closest_by_name("Guard") { // Interact with guard } npcs_find_closest_conditional(predicate) -> Option<RSNpc>Finds the nearest NPC matching a custom predicate. Parameters: predicate - Function returning true for desired NPCs Returns: Option<RSNpc> - Closest matching NPC or None Use Cases: Complex filtering logic (level, stats, actions available) Finding NPCs with specific properties Advanced queries Example: let mage = npcs_find_closest_conditional(|npc| { npc.get_name().contains("Mage") && npc.has_action("Talk-to") }); npcs_find_closest_to_by_id(to: Position, args) -> Option<RSNpc>Finds an NPC by ID closest to a specific position. Parameters: to - Target position args - NPC ID(s) Returns: Option<RSNpc> - Closest NPC to position Use Cases: Finding NPCs near specific landmarks Multi-step navigation Location-based logic npcs_find_all_by_id<T: Into<IdArgs>>(args) -> impl Iterator<Item = RSNpc>Returns all NPCs matching given ID(s). Returns: Iterator yielding all matching RSNpc instances Use Cases: Counting NPC spawns Area analysis Monitoring NPC locations npcs_get_at_index(index: i32) -> Option<RSNpc>Gets NPC at specific array index. Use Cases: Iterator-based access Indexed lookups npcs_get_all() -> impl Iterator<Item = RSNpc>Returns all NPCs currently visible. Use Cases: Scanning entire world for NPCs Statistical analysis Debug/monitoring npcs_get_all_in_worldview(world_view: RSWorldView) -> impl Iterator<Item = RSNpc>Returns NPCs in a specific world view/instance. Use Cases: Instance-specific logic Multi-world support Objects APILocation: src/api/scene/objects.rs Comprehensive interface for locating and interacting with game objects. Object Type Flagsconst OBJECTS_GROUND_DECORATION_FLAG: i32 = 1 << 0; // Ground items const OBJECTS_WALL_DECORATION_FLAG: i32 = 1 << 1; // Wall decorations const OBJECTS_WALL_OBJECT_FLAG: i32 = 1 << 2; // Doors, walls const OBJECTS_INTERACTABLE_OBJECT_FLAG: i32 = 1 << 3; // Climbable, usable const OBJECTS_ALL_OBJECTS_FLAG: i32 = 0xF; // All types Finding Functionsobjects_find_closest_by_id(flags, args) -> Option<Box<dyn Object>>Finds nearest object by ID with type filtering. Parameters: flags - Object type filter (use macros for convenience) args - Object ID(s) Returns: Option<Box<dyn Object>> - Closest matching object Use Cases: Finding doors, ladders, or staircases Locating interactive furniture Navigation obstacles Example: // Find nearest door if let Some(door) = objects_find_closest_by_id( OBJECTS_WALL_OBJECT_FLAG, 1234 ) { // Interact with door if let Some(action_pos) = door.get_interaction_point() { // Navigate to and use door } } // Macro shorthand - searches all object types if let Some(obj) = objects_find_closest_by_id!(5678) { println!("Found object"); } objects_find_closest_by_name(flags, args) -> Option<Box<dyn Object>>Finds nearest object by name. Example: if let Some(ladder) = objects_find_closest_by_name( OBJECTS_INTERACTABLE_OBJECT_FLAG, "Ladder" ) { println!("Found ladder at ({}, {})", ladder.get_x(), ladder.get_y()); } objects_find_closest_conditional(flags, predicate) -> Option<Box<dyn Object>>Finds object matching custom logic. Use Cases: Complex object filtering Specific object states Multiple criteria Example: let obj = objects_find_closest_conditional( OBJECTS_ALL_OBJECTS_FLAG, |obj| { obj.get_name().contains("Gate") && obj.has_action("Open") } ); objects_find_by_id(plane, flags, args) -> Option<Box<dyn Object>>Finds first object matching criteria on specific plane. Parameters: plane - Floor level (0-3) flags - Object type filter args - Object ID(s) Returns: Option<Box<dyn Object>> Use Cases: Specific floor navigation Multi-level dungeon exploration objects_find_all_by_id(plane, flags, args) -> Vec<Box<dyn Object>>Finds all objects matching ID on specific plane. Use Cases: Finding all doors/gates Counting object instances Mapping obstacle locations objects_find_at_position_conditional(position, flags, predicate) -> Option<Box<dyn Object>>Finds object at exact tile position. Parameters: position - Target tile coordinate flags - Object type filter predicate - Custom filter function Returns: Option<Box<dyn Object>> Use Cases: Checking what's at a specific tile Validation before movement Pre-interaction checks objects_get_at(x, y, plane, flags) -> TileObjectsGets all objects at a tile (returns grouped by type). Returns: TileObjects struct containing: ground_decoration: Option<RSGroundDecoration> wall_decoration: Option<RSWallDecoration> wall_object: Option<RSWallObject> interactable_objects: Vec<RSInteractableObject> Example: let tile_objects = objects_get_at!(10, 20, 0); // All object types if let Some(wall) = tile_objects.get_wall_object() { println!("There's a wall here"); } objects_get_all(plane, flags) -> impl Iterator<Item = TileObjects>Returns all tiles with objects on specified plane. Use Cases: Mapping entire region Obstacle analysis Path validation World & Map APILocation: src/api/scene/world_view.rs, src/api/scene/map.rs World View Functionsworld_view_get_world_view() -> RSWorldViewGets the current active world view (viewport). Returns: RSWorldView - Current visible world state Use Cases: Getting base coordinates Querying visible region World state verification Example: let world = world_view_get_world_view(); let base_x = world.get_base_x(); let base_y = world.get_base_y(); let plane = world.get_plane(); println!("Currently viewing region at ({}, {}), plane {}", base_x, base_y, plane); world_view_get_base_x() -> i32Gets base X coordinate of current world view. world_view_get_base_y() -> i32Gets base Y coordinate of current world view. world_view_get_plane() -> i32Gets current floor/plane (0-3). Use Cases: Floor-specific logic Multi-level navigation Height-based decisions world_view_get_global_world_view() -> RSWorldViewGets the global/main world view. world_view_get_local_world_view() -> Option<RSWorldView>Gets local/instanced world view if in instance. Map Functionsmap_get_hint_arrow() -> RSHintArrowGets the hint arrow data (if active). Use Cases: Quest tracking Following game-provided guidance Navigation assistance map_get_destination() -> Option<Position>Gets player's current walking destination (if any). Returns: Option<Position> - Target position if walking Example: if let Some(dest) = map_get_destination() { println!("Walking to ({}, {})", dest.x, dest.y); } else { println!("Not walking"); } Reachability Functionsmap_can_reach_local_position(position) -> boolChecks if a local position is reachable. Parameters: position - Position to check Returns: bool - True if reachable without obstacles Use Cases: Path validation before walking Obstacle detection Navigation planning map_can_reach_object(object) -> boolChecks if an object is reachable. Use Cases: Pre-interaction checks Navigation validation Obstacle avoidance map_can_reach_npc(npc) -> boolChecks if an NPC is reachable. map_can_reach_player(player) -> boolChecks if another player is reachable. map_can_reach_ground_item(item) -> boolChecks if a ground item is reachable. Distance Functionsmap_find_local_distance_to_position(position) -> i32Calculates distance to a position. Returns: i32 - Distance in tiles (or -1 if unreachable) Example: if let Some(target) = objects_find_closest_by_id!(1234) { let dist = map_find_local_distance_to_object(&target); if dist > 0 && dist < 20 { // Object is close and reachable } } map_find_distance_to_object(object) -> i32Gets distance to an object. map_find_distance_to_position(position) -> i32Gets distance to a position. Pathfinding Functionsmap_find_local_path_to_position(position) -> Option<Vec<Position>>Calculates a walkable path to position. Returns: Option<Vec<Position>> - Path if found, None if blocked Use Cases: Advanced navigation Multi-step movement planning Obstacle navigation map_find_path_to_object(object) -> Option<Vec<Position>>Calculates path to an object. map_find_local_path_position_to_position(from, to) -> Option<Vec<Position>>Finds path between two positions. Example: if let Some(path) = map_find_local_path_to_position(&target_pos) { println!("Found path with {} steps", path.len()); } map_get_wilderness_level() -> i32Gets current wilderness level (0 if not in wilderness). Use Cases: PvP content detection Risk assessment Wilderness-specific logic Interactions APILocation: src/api/scene/interactable.rs Interactable TraitObjects implementing the Interactable trait provide methods for interaction: pub trait Interactable { fn contains(&self, point: (i32, i32)) -> bool; // Point in bounds? fn get_central_point(&self) -> (i32, i32); // Center position fn get_interaction_point(&self) -> (i32, i32); // Click position fn is_visible(&self) -> bool; // Currently visible } InteractArgs Configurationpub struct InteractArgs { min_camera_distance: i32, // Minimum distance from camera walk_to: bool, // Whether to walk to object move_camera: bool, // Whether to adjust camera } Use Cases: Controlling interaction behavior Camera management during interactions Movement prerequisites Example: let mut args = InteractArgs::default(); args.set_min_camera_distance(5) .set_walk_to(true) .set_move_camera(true); Ground Items APILocation: src/api/scene/ground_items.rs Functions for finding and managing items on the ground. Finding Functionsground_items_find_closest_by_id<T: Into<IdArgs>>(args) -> Option<RSGroundItem>Finds the nearest ground item by ID. Returns: Option<RSGroundItem> - Closest matching item Use Cases: Finding dropped valuable items Looting specific items Resource gathering Example: if let Some(item) = ground_items_find_closest_by_id(1234) { println!("Found item at ({}, {})", item.get_x(), item.get_y()); } ground_items_find_closest_by_name(args) -> Option<RSGroundItem>Finds nearest ground item by name. ground_items_find_closest_conditional(predicate) -> Option<RSGroundItem>Finds nearest item matching predicate. Example: let valuable = ground_items_find_closest_conditional(|item| { item.get_quantity() > 1000 && item.get_name().contains("Ore") }); ground_items_find_closest_to_by_id(to, args) -> Option<RSGroundItem>Finds item by ID closest to position. ground_items_find_by_id(args) -> Option<RSGroundItem>Finds any item matching ID (not necessarily closest). ground_items_find_all_by_id(args) -> impl Iterator<Item = RSGroundItem>Returns all items matching ID. Use Cases: Counting dropped items Tracking item distribution Mass looting operations ground_items_get_all(plane) -> impl Iterator<Item = RSGroundItem>Gets all ground items on a plane. Example: let item_count = ground_items_get_all(plane).count(); println!("There are {} items on this floor", item_count); ground_items_get_all_at_local(local_x, local_y, plane) -> impl Iterator<Item = RSGroundItem>Gets all items at a specific tile. Use Cases: Pile checking Loot verification Tile analysis Walking & MovementLocation: src/api/walking.rs Core Walking Functionswalking_get_run_energy() -> i32Gets current run energy percentage. Returns: i32 - 0-100 percentage Use Cases: Energy-aware movement decisions Stamina potions usage Performance optimization walking_is_run_enabled() -> boolChecks if running is currently enabled. Returns: bool - True if running walking_set_run(enabled: bool) -> boolToggles run mode on/off. Parameters: enabled - True to enable run, false to disable Returns: bool - Success Example: if walking_get_run_energy() > 50 { walking_set_run(true); } else { walking_set_run(false); } walking_walk_path(path: &Vec<Position>) -> boolWalks along a predetermined path. Parameters: path - Vector of positions to walk Returns: bool - Success Use Cases: Following calculated paths Multi-step navigation Safe route following walking_traverse(args: &mut WalkingArgs) -> boolAdvanced walking with configuration options. Parameters: args - Configuration struct (see below) Returns: bool - Success WalkingArgs Configurationpub struct WalkingArgs { path: Vec<Position>, area: Option<Area>, destination: Option<Position>, break_condition: Option<Box<dyn Fn() -> bool>>, min_destination_threshold: i32, min_minimap_threshold: i32, min_run_energy: i32, use_minimap: bool, } Methods: new_with_path(path) - Initialize with explicit path new_with_area(area) - Initialize with area to reach new_with_destination(pos) - Initialize with target position set_break_condition(fn) - Stop if condition becomes true set_min_destination_threshold(i32) - Distance to destination set_min_minimap_threshold(i32) - Minimap range threshold set_min_run_energy(i32) - Minimum energy before running set_use_minimap(bool) - Use minimap for movement Example: let mut args = WalkingArgs::new_with_destination(&target); args.set_use_minimap(true) .set_min_destination_threshold(5) .set_min_run_energy(30) .set_break_condition(|| { // Stop walking if we're under attack if let Some(player) = players_get_local_player() { player.get_interacting_entity().is_some() } else { false } }); walking_traverse(&mut args); Utilities & HelpersMenu & InteractionThe API provides comprehensive menu interaction for selecting game options. Common Functions: menu_is_open() - Check if menu is visible menu_get_count() - Get number of menu options menu_get_items() - Get all menu items menu_interact(vars, option, actions) - Click menu option Use Cases: Handling context menus Selecting dialogue options Confirming actions BankingLocation: src/api/ui/bank.rs Common Functions: bank_is_open() - Check if bank is open bank_deposit_by_id(id, amount) - Deposit items by ID bank_withdraw_by_id(id, amount) - Withdraw items bank_get_amount_by_id(id) - Check item quantity Example: if bank_is_open() { bank_withdraw_by_id(1234, 10); // Withdraw 10 items bank_deposit_all_by_name("Ore"); } InventoryLocation: src/api/ui/tab/inventory.rs Common Functions: inventory_contains_by_id(id) - Check for item inventory_get_count() - Total items inventory_drop_by_id(id) - Drop item inventory_interact(item, action) - Use item Complete Example: Gathering Scenariouse osbot_api::api::scene::*; use osbot_api::api::ui::bank::*; fn gather_and_bank() -> bool { // 1. Get local player position let Some(player) = players_get_local_player() else { return false; }; // 2. Find nearest ore rock let Some(ore) = objects_find_closest_by_name( OBJECTS_INTERACTABLE_OBJECT_FLAG, "Ore" ) else { return false; }; // 3. Check if reachable if !map_can_reach_object(&ore) { return false; } // 4. Calculate path and walk if let Some(path) = map_find_local_path_to_object(&ore) { walking_walk_path(&path); } // 5. Interact with ore menu_interact( &ore.get_menu_vars(), &Some("Mine".to_string()), &None, ); // 6. Wait for mining loop { if inventory_is_full() { break; } } // 7. Find and open bank let Some(bank) = objects_find_closest_by_name( OBJECTS_INTERACTABLE_OBJECT_FLAG, "Bank" ) else { return false; }; bank_open(); // 8. Deposit ore bank_deposit_all_by_name("Ore"); true } OSBOT API - Rendering & Paint DocumentationOverviewThe rendering system in OSBOT API provides tools for visualizing game elements, converting world coordinates to screen coordinates, and managing the camera viewport. This is essential for creating overlays, debugging tools, and understanding the 3D-to-2D projection pipeline. Display & Viewport ManagementLocation: src/api/display.rs The display system manages the game window, viewport dimensions, and coordinate transformations. Core Display Functionsdisplay_get_display_mode() -> DisplayModeRetrieves the current display mode setting. Returns: DisplayMode enum DisplayMode::Fixed - Fixed screen layout (1:1 pixel ratio) DisplayMode::ResizableClassic - Resizable classic interface DisplayMode::ResizableModern - Resizable modern interface Use Cases: Adapting UI rendering to interface style Adjusting overlay positioning Handling different screen layouts Example: match display_get_display_mode() { DisplayMode::Fixed => { // Fixed UI - known dimensions }, DisplayMode::ResizableClassic | DisplayMode::ResizableModern => { // Resizable UI - adapt positions dynamically } } display_is_modern_mode() -> boolQuick check if using modern resizable interface. Returns: bool - True if in modern resizable mode display_get_viewport() -> ViewportGets the current viewport information. Returns: Viewport struct containing: width: i32 - Viewport width in pixels height: i32 - Viewport height in pixels depth: i32 - Viewport depth (for 3D calculations) Use Cases: Calculating overlay positions Centering UI elements Responsive rendering Example: let viewport = display_get_viewport(); let center_x = viewport.get_width() / 2; let center_y = viewport.get_height() / 2; println!("Viewport: {}x{}", viewport.get_width(), viewport.get_height()); display_get_viewport_width() -> i32Gets viewport width in pixels. display_get_viewport_height() -> i32Gets viewport height in pixels. display_get_viewport_depth() -> i32Gets viewport depth for 3D projection calculations. display_get_canvas_width() -> i32Gets the full canvas width (including UI panels). display_get_canvas_height() -> i32Gets the full canvas height (including UI panels). Use Cases: Full-screen overlay rendering Calculating UI element positions Positioning elements relative to game window display_get_root_widget_id() -> i32Gets the root UI widget ID for the current display mode. Returns: i32 - Widget ID (varies by mode) Fixed mode: 548 Resizable classic: 161 Resizable modern: 164 Use Cases: Widget hierarchy traversal UI element identification display_get_minimap_widget() -> Option<RSWidget>Gets the minimap widget reference. Returns: Option<RSWidget> - Minimap widget if accessible Use Cases: Getting minimap bounds for overlay Minimap-based rendering Display Utilitiesdisplay_is_point_in_polygon(point, vertices) -> boolChecks if a point is inside a polygon. Parameters: point: (i32, i32) - Point to check vertices: &[(i32, i32)] - Polygon vertices Returns: bool - True if inside polygon Use Cases: Click detection on complex shapes Collision detection with objects Boundary checking Example: let vertices = vec![(0, 0), (100, 0), (100, 100), (0, 100)]; let mouse_pos = (50, 50); if display_is_point_in_polygon(mouse_pos, &vertices) { println!("Click is inside the rectangle"); } Coordinate Projection SystemLocation: src/api/util/projection/ The projection system converts 3D world coordinates into 2D screen coordinates for rendering. ProjectionInfoprojection_info_get() -> &'static ProjectionInfoGets the cached projection information for the current frame. Returns: &ProjectionInfo - Immutable reference to projection data Use Cases: World-to-screen conversions Camera state queries Rendering calculations Properties accessed via ProjectionInfo: get_plane() -> i32 - Current floor level get_heightmap() -> &Heightmap - Elevation data get_camera() -> &CameraInfo - Camera position/angle get_viewport() -> &Viewport - Screen dimensions is_valid() -> bool - Check if data is current Example: let projection = projection_info_get(); println!("Current plane: {}", projection.get_plane()); println!("Camera at: ({}, {})", projection.get_camera().get_x(), projection.get_camera().get_y()); Viewport Structpub struct Viewport { width: i32, height: i32, depth: i32, } Methods: get_width() -> i32 - Viewport width get_height() -> i32 - Viewport height get_depth() -> i32 - Viewport depth HeightmapThe heightmap contains elevation data for all tiles in the visible region. Location: src/api/scene/heightmap.rs Heightmap Methodspub fn get_width(&self) -> i32; pub fn get_height(&self) -> i32; pub fn get_tile_height(&self, x: i32, y: i32, plane: i32) -> i32; pub fn get_tile_setting(&self, x: i32, y: i32, plane: i32) -> i8; Use Cases: Getting ground elevation for NPCs/objects Water level detection Slope calculations Example: let heightmap = projection.get_heightmap(); let ground_height = heightmap.get_tile_height(100, 100, 0); println!("Ground elevation at (100, 100): {}", ground_height); Camera SystemLocation: src/api/camera.rs The camera system controls the 3D perspective and view orientation. Camera Informationcamera_get_camera_info() -> CameraInfoGets complete camera state information. Returns: CameraInfo struct containing: x: i32 - Camera X position y: i32 - Camera Y position z: i32 - Camera Z position (height) pitch: i32 - Vertical angle (0-2047, normalized) yaw: i32 - Horizontal angle (0-2047, normalized) scale_z: f32 - Vertical scaling factor Example: let camera = camera_get_camera_info(); println!("Camera position: ({}, {}, {})", camera.get_x(), camera.get_y(), camera.get_z()); println!("Camera angle: yaw={}, pitch={}", camera.get_yaw(), camera.get_pitch()); Camera State Queriescamera_get_pitch() -> i32Gets camera vertical angle (pitch). Returns: i32 - Pitch in game units (0-2047) Range: 22 (bottom) to 67 (top) camera_get_yaw() -> i32Gets camera horizontal angle (rotation). Returns: i32 - Yaw in game units (0-2047) Use Cases: Understanding current view direction Calculating relative angles to objects Direction-aware rendering camera_get_x() -> i32Camera world X coordinate. camera_get_y() -> i32Camera world Y coordinate. camera_get_z() -> i32Camera world Z coordinate (height). camera_get_scale_z() -> f32Zoom level scaling factor. Use Cases: Zoom-based rendering adjustments Perspective calculations camera_get_pitch_angle() -> i32Gets pitch angle in degrees. camera_get_yaw_angle() -> i32Gets yaw angle in degrees. Use Cases: Human-readable angle values UI display of camera angles Camera Angle Constantsconst CAMERA_MAX_PITCH: i32 = 67; // Maximum upward angle const CAMERA_MIN_PITCH: i32 = 22; // Maximum downward angle Camera Controlcamera_move_pitch_angle(pitch: i32) -> boolAdjusts camera vertical angle. Parameters: pitch: i32 - Change in pitch (positive = up, negative = down) Returns: bool - Success Example: // Rotate camera upward camera_move_pitch_angle(10); // Rotate camera downward camera_move_pitch_angle(-10); camera_move_yaw_angle(yaw: i32) -> boolRotates camera horizontally. Parameters: yaw: i32 - Change in yaw (positive = right, negative = left) camera_to_top() -> boolMoves camera to maximum height angle. camera_to_bottom() -> boolMoves camera to minimum height angle. camera_move_to_entity<T: Entity>(entity: &T) -> boolOrients camera to look at an entity. Parameters: entity - Target entity to look at Returns: bool - Success Use Cases: Focus on NPCs during interaction Looking at players Combat monitoring Example: if let Some(npc) = npcs_find_closest_by_id(1234) { camera_move_to_entity(&npc); } camera_move_to_position(position: &Position) -> boolOrients camera toward a position. Parameters: position - Target world position camera_move_to_angle(yaw: i32, pitch: i32) -> boolSets camera to specific angles. Parameters: yaw - Target yaw angle pitch - Target pitch angle camera_can_use_mouse_control() -> boolChecks if middle-mouse camera control is enabled. Use Cases: Detecting player-controlled camera Preventing automation conflicts camera_get_yaw_to(origin: &Position, position: &Position) -> i32Calculates yaw angle from one position to another. Returns: i32 - Required yaw to face target Use Cases: Calculating relative angles Predictive camera positioning camera_get_pitch_to(origin: &Position, position: &Position, height: i32) -> i32Calculates pitch angle from position to target. Parameters: origin - Starting position position - Target position height - Height difference Returns: i32 - Required pitch to face target Rendering & Screen CoordinatesLocation: src/api/display.rs Converting world coordinates to screen coordinates is essential for all overlay rendering. Screen Coordinate Conversiondisplay_get_screen_coordinates(grid_x, grid_y, plane, elevation, projection_info) -> (i32, i32)Converts world coordinates to screen coordinates. Parameters: grid_x: i32 - World X coordinate grid_y: i32 - World Y coordinate plane: i32 - Floor level (0-3) elevation: i32 - Z height above ground projection_info: &ProjectionInfo - Camera/viewport data Returns: (i32, i32) - Screen X and Y coordinates Use Cases: Placing overlays on entities Drawing lines to targets Rendering visual indicators Example: let projection = projection_info_get(); let screen_coords = display_get_screen_coordinates( 100, // world X 100, // world Y 0, // ground plane 64, // elevation (entity height) projection ); println!("Entity appears at screen: {:?}", screen_coords); display_get_model_screen_coordinates(model, grid_x, grid_y, plane, elevation, projection_info) -> Vec<(i32, i32)>Converts model vertices to screen coordinates. Parameters: model: &Model - 3D model data grid_x, grid_y, plane, elevation - World position projection_info - Camera/viewport data Returns: Vec<(i32, i32)> - Screen coordinates for all vertices Use Cases: Drawing bounding boxes around models Rendering detailed object overlays Complex shape rendering Interaction Point Calculationdisplay_get_interaction_point(bounds: (i32, i32, i32, i32)) -> (i32, i32)Calculates interaction point from screen bounds. Parameters: bounds - (x, y, width, height) screen rectangle Returns: (i32, i32) - Interaction point within bounds Use Cases: Finding click target within object bounds Randomizing click positions Geometric Utilitiesdisplay_calculate_triangle_area(p1, p2, p3) -> f32Calculates area of a triangle. Parameters: p1, p2, p3: (i32, i32) - Triangle vertices Returns: f32 - Triangle area Use Cases: Weighted random point selection Area-based calculations display_point_in_triangle(point, a, b, c) -> boolChecks if point is inside triangle. Parameters: point - Test point a, b, c - Triangle vertices Returns: bool - True if inside Use Cases: Click detection on triangular areas Complex shape testing display_get_random_point_in_triangle(p1, p2, p3) -> (i32, i32)Generates random point within triangle. Returns: (i32, i32) - Random point inside triangle Use Cases: Randomized click positions on objects Area-based mouse movement Example: let triangle_vertices = [(0, 0), (100, 0), (50, 100)]; let random_click = display_get_random_point_in_triangle( triangle_vertices[0], triangle_vertices[1], triangle_vertices[2] ); Polygon Utilitiesdisplay_is_inside_convex_polygon(polygon, point) -> boolChecks if point is inside convex polygon. Parameters: polygon: &[(i32, i32)] - Polygon vertices point: (i32, i32) - Point to test Returns: bool - True if inside display_calculate_convex_hull(points: Vec<(i32, i32)>) -> ConvexHullCalculates convex hull from points. Returns: ConvexHull - Resulting convex hull structure Use Cases: Generating object bounding shapes Click region optimization Clipping Spacedisplay_get_world_screen_area() -> ClippingSpaceGets the screen area containing world view. Returns: ClippingSpace - Screen clipping region Methods: contains(x: i32, y: i32) -> bool - Check if point is visible Use Cases: Clipping rendering to viewport Visibility culling Minimap RenderingLocation: src/api/ui/minimap.rs The minimap is a bird's-eye view of the game world. Converting between world and minimap coordinates is essential. Minimap Stateminimap_get_pitch() -> i32Gets minimap vertical rotation. minimap_get_yaw() -> i32Gets minimap horizontal rotation. Returns: i32 - Angle (0-2047) minimap_get_zoom() -> i32Gets minimap zoom level. Returns: i32 - Zoom factor minimap_get_angle() -> i32Gets effective minimap angle (accounting for rotation). Returns: i32 - Combined angle Use Cases: Calculating minimap point positions Adjusting rendering for map rotation Minimap Coordinate Conversiondisplay_get_minimap_coordinates(local_x, local_y) -> (i32, i32)Converts world coordinates to minimap coordinates. Parameters: local_x: i32 - Local X coordinate local_y: i32 - Local Y coordinate Returns: (i32, i32) - Minimap screen coordinates Use Cases: Drawing indicators on minimap Minimap-based overlays Example: if let Some(player) = players_get_local_player() { let local_x = player.get_local_x(); let local_y = player.get_local_y(); let minimap_pos = display_get_minimap_coordinates(local_x, local_y); println!("Player on minimap: {:?}", minimap_pos); } display_get_minimap_coordinates_from_args(bounds, zoom, angle, player_x, player_y, target_x, target_y) -> (i32, i32)Advanced minimap coordinate calculation with explicit parameters. Parameters: minimap_bounds: (i32, i32, i32, i32) - Minimap screen area minimap_zoom: i32 - Zoom level minimap_angle: i32 - Rotation angle player_local_x, player_local_y - Player position position_local_x, position_local_y - Target position Returns: (i32, i32) - Minimap screen coordinates Minimap Range Queriesminimap_is_position_in_minimap_range(player_position, position) -> boolChecks if position is visible on minimap. Parameters: player_position - Player's position position - Position to check Returns: bool - True if within minimap render distance Use Cases: Determining if entities are map-visible Minimap icon rendering decisions minimap_get_max_range() -> i32Gets maximum minimap visibility range. Returns: i32 - Range in tiles minimap_is_position_on_map(position) -> boolChecks if position appears on minimap currently. Returns: bool - True if on visible map area Minimap Interactionminimap_click_position(position: &Position) -> boolClicks a position via minimap (fast travel). Parameters: position - Position to click Returns: bool - Success Use Cases: Quick navigation using minimap Long-distance movement Example: let target = Position::new(100, 100, 0); if minimap_is_position_in_minimap_range(&player_pos, &target) { minimap_click_position(&target); } minimap_hover_position(position: &Position) -> boolHovers mouse over a minimap position. Returns: bool - Success Use Cases: Previewing positions before clicking Hover-based interactions Painting & Overlay ExamplesConvexHull RenderingLocation: src/api/scene/convex_hull.rs The ConvexHull structure represents a 2D object outline projected to screen coordinates and can be rendered. pub struct ConvexHull { points: Vec<(i32, i32)> // Screen coordinates } impl ConvexHull { pub fn render(&self, painter: &Painter, color: Color32); pub fn render_offset(&self, painter: &Painter, offset: (i32, i32), color: Color32); } Methods: contains(point) -> bool - Check if point inside hull get_central_point() -> (i32, i32) - Center of hull get_interaction_point() -> (i32, i32) - Interaction target is_visible() -> bool - Currently on screen Example: Drawing Object Overlaysuse eframe::egui::{Color32, Painter}; fn render_entity_overlay( painter: &Painter, entity: &impl Entity, color: Color32 ) { let projection = projection_info_get(); // Get screen coordinates let screen_pos = display_get_screen_coordinates( entity.get_x(), entity.get_y(), projection.get_plane(), entity.get_height(), projection ); // Draw circle at position painter.circle( Pos2::new(screen_pos.0 as f32, screen_pos.1 as f32), 10.0, color, Stroke::new(2.0, Color32::WHITE) ); } Example: Rendering a Pathfn render_walking_path( painter: &Painter, path: &Vec<Position>, color: Color32 ) { let projection = projection_info_get(); let mut screen_points = Vec::new(); for position in path { let screen = display_get_screen_coordinates( position.x, position.y, projection.get_plane(), 0, projection ); screen_points.push(Pos2::new(screen.0 as f32, screen.1 as f32)); } // Draw line connecting all points for i in 0..screen_points.len() - 1 { painter.line_segment( [screen_points[i], screen_points[i + 1]], Stroke::new(2.0, color) ); } } Example: Minimap Indicatorsfn render_minimap_targets( painter: &Painter, targets: &Vec<Position>, color: Color32 ) { for target in targets { if minimap_is_position_in_minimap_range( &players_get_local_player().unwrap().get_position(), target ) { let minimap_pos = display_get_minimap_coordinates( target.x, target.y ); painter.circle( Pos2::new(minimap_pos.0 as f32, minimap_pos.1 as f32), 4.0, color, Stroke::new(1.0, Color32::WHITE) ); } } } Display Mode HandlingFixed vs Resizable LayoutThe display system supports three different UI layouts that affect coordinate calculations: match display_get_display_mode() { DisplayMode::Fixed => { // Coordinates are fixed (640x480 viewport) // UI elements have fixed positions // No scaling needed }, DisplayMode::ResizableClassic => { // Classic tabbed interface that can be resized // Use display_get_root_widget_id() = 161 // Calculate positions relative to viewport }, DisplayMode::ResizableModern => { // Modern side-panel interface (2015+ style) // Use display_get_root_widget_id() = 164 // More complex layout with docked widgets } } Performance ConsiderationsProjection CachingThe ProjectionInfo is cached and updated per frame: // Cached internally - cheap to call let projection = projection_info_get(); // Reuse for multiple conversions for entity in entities { let screen = display_get_screen_coordinates( entity.get_x(), entity.get_y(), projection.get_plane(), entity.get_height(), projection // Reuse cached projection ); } Viewport QueriesViewport information is queried frequently: // Cache these values if using multiple times let viewport_width = display_get_viewport_width(); let viewport_height = display_get_viewport_height(); // Use cached values for calculations let center_x = viewport_width / 2; let center_y = viewport_height / 2; Clipping and CullingAlways check visibility before rendering: let clipping = display_get_world_screen_area(); if clipping.contains(screen_x, screen_y) { // Only render if within visible area painter.circle(...); } Common Rendering PatternsPattern 1: Draw NPC at Positionlet npc = npcs_find_closest_by_id(1234).unwrap(); let projection = projection_info_get(); let screen = display_get_screen_coordinates( npc.get_x(), npc.get_y(), projection.get_plane(), 64, projection // NPC height ); painter.circle(Pos2::new(screen.0 as f32, screen.1 as f32), 5.0, Color32::RED, Stroke::new(1.0, Color32::WHITE)); Pattern 2: Minimap Markerif minimap_is_position_in_minimap_range(&player_pos, &target) { let minimap = display_get_minimap_coordinates(target.x, target.y); painter.circle(Pos2::new(minimap.0 as f32, minimap.1 as f32), 3.0, Color32::BLUE, Stroke::new(1.0, Color32::WHITE)); } Pattern 3: Distance-Based Coloringfn get_distance_color(distance: i32) -> Color32 { match distance { 0..=10 => Color32::RED, 11..=20 => Color32::YELLOW, 21..=50 => Color32::GREEN, _ => Color32::GRAY, } } OSBOT API - Text & Image Rendering GuideOverviewThe rendering documentation I provided covers geometric rendering (circles, lines, shapes) using the egui framework, but does not explicitly cover text and image rendering for overlays. However, the API provides the foundation through two key mechanisms: egui UI Framework - For text, images, and UI elements Script Rendering Hooks - Where you can draw custom overlays Text & Image Rendering ArchitectureThe Rendering PipelineThe API uses egui (from the eframe crate) as its rendering backend. You get access to rendering through the Script trait's rendering callbacks. Script Trait Rendering MethodsLocation: src/api/script/script.rs The Script trait provides two rendering entry points: pub trait Script { // ... other methods ... /// Called every frame to render custom UI fn on_render(&self, ui: &mut egui::Ui) { // Your overlay rendering goes here } /// Called every frame to render debug overlays fn on_debug_render(&self, ui: &mut egui::Ui) { // Debug-specific rendering } } These methods receive a mutable reference to egui::Ui, which is the primary interface for rendering text, images, and UI elements. Text RenderingBasic Text RenderingUsing egui::Ui: impl Script for MyScript { fn on_render(&self, ui: &mut egui::Ui) { // Display simple text label ui.label("Simple text overlay"); // Display colored text ui.colored_label(egui::Color32::RED, "Red text"); // Display text with custom font size ui.label(egui::RichText::new("Large text").size(20.0)); } } Text with Colorsuse eframe::egui::{Color32, RichText}; fn on_render(&self, ui: &mut egui::Ui) { // Red text ui.label(RichText::new("Health: Low").color(Color32::RED)); // Green text ui.label(RichText::new("Status: Safe").color(Color32::GREEN)); // Yellow text with larger font ui.label(RichText::new("Warning!").color(Color32::YELLOW).size(18.0)); } Monospace/Code Textfn on_render(&self, ui: &mut egui::Ui) { // Monospace font (good for coordinates, numbers) ui.label(RichText::new("X: 100, Y: 200").monospace()); // Combine styles ui.label(RichText::new("Position: 100, 200") .monospace() .color(Color32::CYAN) .size(14.0) ); } Heading Stylesfn on_render(&self, ui: &mut egui::Ui) { ui.heading("Main Title"); // Large heading ui.subheading("Subtitle"); // Medium heading } Text Layout & Positioninguse eframe::egui::{Rect, Vec2, Align2}; fn on_render(&self, ui: &mut egui::Ui) { // Position text at specific screen location let screen_rect = ui.available_rect_before_wrap(); // Top-left corner ui.painter().text( egui::Pos2::new(10.0, 10.0), Align2::LEFT_TOP, "Text at top-left", egui::FontId::default(), Color32::WHITE ); // Top-right corner ui.painter().text( egui::Pos2::new(screen_rect.right() - 10.0, 10.0), Align2::RIGHT_TOP, "Text at top-right", egui::FontId::default(), Color32::WHITE ); } Text Alignment Optionsuse eframe::egui::Align2; // Align2(horizontal, vertical) options: // LEFT_TOP, CENTER_TOP, RIGHT_TOP // LEFT_CENTER, CENTER, RIGHT_CENTER // LEFT_BOTTOM, CENTER_BOTTOM, RIGHT_BOTTOM Dynamic Text with Variablesfn on_render(&self, ui: &mut egui::Ui) { if let Some(player) = players_get_local_player() { let name = player.get_name(); let x = player.get_x(); let y = player.get_y(); ui.label(format!("Player: {}", name)); ui.label(format!("Position: ({}, {})", x, y)); } } Multi-line Textfn on_render(&self, ui: &mut egui::Ui) { let text = "Line 1\nLine 2\nLine 3"; ui.label(text); } Image RenderingScreen Capture as TextureThe API provides a screen capture function that converts game frames to textures: Location: src/api/util/screen_capture.rs pub fn screen_capture_capture_game_image(title: String, ui: &egui::Ui) -> Option<TextureHandle> pub fn screen_capture_capture_game() -> Option<(i32, i32, Vec<u8>)> screen_capture_capture_game_image(title, ui) -> Option<TextureHandle>Captures the game screen and returns as an egui texture. Parameters: title: String - Label for the captured texture ui: &egui::Ui - UI context for texture registration Returns: Option<TextureHandle> - Handle to rendered texture, or None if capture failed Use Cases: Displaying game state snapshots Debug visualization of game frames Recording/replay features screen_capture_capture_game() -> Option<(i32, i32, Vec<u8>)>Captures raw game frame data. Returns: Option<(width, height, pixel_data)> - Image dimensions and RGBA pixel data Use Cases: Processing game frames programmatically Converting to custom image formats Analysis and debugging Rendering Captured Imagesuse eframe::egui::TextureHandle; fn on_render(&self, ui: &mut egui::Ui) { // Capture the game screen if let Some(texture) = screen_capture_capture_game_image("game_view".to_string(), ui) { // Display as image ui.image(&texture, egui::Vec2::new(640.0, 480.0)); } } Using External Image Filesuse eframe::egui::{ColorImage, TextureHandle, TextureOptions}; use image::ImageReader; use std::io::Cursor; fn on_render(&self, ui: &mut egui::Ui) { // Load image from file if let Ok(img) = ImageReader::open("path/to/image.png") { if let Ok(rgba) = img.decode().map(|i| i.to_rgba8()) { let size = [rgba.width() as usize, rgba.height() as usize]; let pixels = rgba.into_raw(); // Convert to egui ColorImage let color_image = ColorImage::from_rgba_unmultiplied( size, &pixels ); // Register texture let texture = ui.ctx().load_texture( "my_image", color_image, TextureOptions::LINEAR ); // Display ui.image(&texture, egui::Vec2::new(200.0, 200.0)); } } } Advanced Rendering PatternsPattern 1: HUD Overlay with Textfn on_render(&self, ui: &mut egui::Ui) { // Top-left corner HUD egui::Window::new("HUD") .fixed_pos(egui::Pos2::new(10.0, 10.0)) .show(ui.ctx(), |ui| { if let Some(player) = players_get_local_player() { ui.label(format!("Position: ({}, {})", player.get_x(), player.get_y())); ui.label(format!("Health: {}", 64)); // Placeholder } }); } Pattern 2: Debug Overlayfn on_debug_render(&self, ui: &mut egui::Ui) { egui::Window::new("Debug") .resizable(true) .show(ui.ctx(), |ui| { ui.label(format!("FPS: {}", 60)); // Would be dynamic ui.label(format!("Entities: {}", players_get_all().count())); if let Some(player) = players_get_local_player() { ui.group(|ui| { ui.label("Player Info:"); ui.label(format!(" Position: ({}, {})", player.get_x(), player.get_y())); ui.label(format!(" Combat Level: {}", player.get_combat_level())); }); } }); } Pattern 3: Info Panel with Formattingfn on_render(&self, ui: &mut egui::Ui) { egui::Frame::dark_canvas(ui.style()) .margin(egui::Vec2::splat(10.0)) .show(ui, |ui| { ui.heading("Bot Status"); ui.separator(); ui.horizontal(|ui| { ui.label("Status:"); ui.colored_label(Color32::GREEN, "Running"); }); ui.horizontal(|ui| { ui.label("Progress:"); ui.colored_label(Color32::YELLOW, "50%"); }); }); } Pattern 4: Coordinate Display at World Positionfn on_render(&self, ui: &mut egui::Ui) { if let Some(player) = players_get_local_player() { let projection = projection_info_get(); // Convert world to screen coordinates let screen = display_get_screen_coordinates( player.get_x(), player.get_y(), projection.get_plane(), 64, projection ); // Draw text at that screen position ui.painter().text( egui::Pos2::new(screen.0 as f32, screen.1 as f32), egui::Align2::CENTER_CENTER, format!("{}, {}", player.get_x(), player.get_y()), egui::FontId::default(), Color32::WHITE ); } } Complete Example: Full-Featured Overlayuse osbot_api::prelude::*; use eframe::egui::{Color32, RichText, Pos2, Align2}; struct MyScript { // Script state } impl Script for MyScript { fn new() -> Self { MyScript {} } fn on_start(&mut self, params: Option<String>) { println!("Script started!"); } fn on_loop(&mut self) -> i32 { // Main loop logic here 100 // Sleep for 100ms } fn on_render(&self, ui: &mut egui::Ui) { // Main HUD window egui::Window::new("Overlay") .fixed_pos(Pos2::new(20.0, 20.0)) .default_width(300.0) .show(ui.ctx(), |ui| { ui.heading("Bot Control Panel"); ui.separator(); // Player info section if let Some(player) = players_get_local_player() { ui.group(|ui| { ui.label(RichText::new("Player Information") .color(Color32::CYAN).underline()); ui.label(format!("Name: {}", player.get_name())); ui.label(format!("Level: {}", player.get_combat_level())); ui.label(format!("Position: ({}, {})", player.get_x(), player.get_y())); }); } ui.separator(); // World info section let projection = projection_info_get(); ui.group(|ui| { ui.label(RichText::new("World Information") .color(Color32::CYAN).underline()); ui.label(format!("Plane: {}", projection.get_plane())); ui.label(format!("Viewport: {}x{}", display_get_viewport_width(), display_get_viewport_height() )); }); ui.separator(); // Entity counts ui.group(|ui| { ui.label(RichText::new("Entities") .color(Color32::CYAN).underline()); ui.label(format!("Players: {}", players_get_all().count())); ui.label(format!("NPCs: {}", npcs_get_all().count())); }); }); // Draw coordinates at specific screen positions if let Some(player) = players_get_local_player() { let projection = projection_info_get(); let screen = display_get_screen_coordinates( player.get_x(), player.get_y(), projection.get_plane(), 64, projection ); ui.painter().text( Pos2::new(screen.0 as f32, (screen.1 - 20) as f32), Align2::CENTER_TOP, player.get_name(), egui::FontId::default(), Color32::WHITE ); } } fn on_debug_render(&self, ui: &mut egui::Ui) { egui::Window::new("Debug Info") .fixed_pos(Pos2::new(20.0, 400.0)) .show(ui.ctx(), |ui| { ui.label("Camera Info:"); let camera = camera_get_camera_info(); ui.label(format!("Position: ({}, {}, {})", camera.get_x(), camera.get_y(), camera.get_z())); ui.label(format!("Pitch: {}, Yaw: {}", camera.get_pitch(), camera.get_yaw())); }); } fn can_start(&self) -> bool { true } fn is_running(&self) -> bool { true } fn is_alive(&self) -> bool { true } } Available egui ComponentsThe egui framework provides many components you can use in rendering: Text Componentsui.label() - Simple text ui.heading() - Large heading ui.subheading() - Medium heading ui.monospace_multiline_text() - Code/data display RichText - Styled text (colors, sizes, fonts) Layout Componentsui.horizontal() - Side-by-side layout ui.vertical() - Top-to-bottom layout ui.group() - Grouped content with background egui::Window - Floating window egui::Frame - Bordered frame ui.separator() - Visual divider Input Componentsui.button() - Clickable button ui.checkbox() - Toggle checkbox ui.slider() - Value slider ui.text_edit_singleline() - Text input Visual Elementsui.painter().circle() - Draw circle ui.painter().line_segment() - Draw line ui.painter().rect() - Draw rectangle ui.painter().text() - Positioned text ui.image() - Display image/texture Color32 Predefined Colorsuse eframe::egui::Color32; // Common colors Color32::WHITE Color32::BLACK Color32::RED Color32::GREEN Color32::BLUE Color32::CYAN Color32::MAGENTA Color32::YELLOW Color32::GRAY Color32::DARK_GRAY Color32::LIGHT_GRAY // Custom color (RGBA) Color32::from_rgba_unmultiplied(r, g, b, a) Painter & Advanced DrawingFor more complex rendering, use the Painter directly: fn on_render(&self, ui: &mut egui::Ui) { let painter = ui.painter(); // Draw shapes painter.circle_filled( egui::Pos2::new(100.0, 100.0), 10.0, Color32::RED ); // Draw text at arbitrary position painter.text( Pos2::new(50.0, 50.0), Align2::CENTER_CENTER, "Custom text", egui::FontId::default(), Color32::WHITE ); // Draw rectangle painter.rect_filled( egui::Rect::from_two_pos( Pos2::new(0.0, 0.0), Pos2::new(100.0, 100.0) ), 0.0, Color32::BLUE ); }2 points- Czar Barrows
2 pointsNEW! Added Grand Exchange auto-restocking! Perfect for goldfarms!! Features Coming Soon: - Deathwalk support - Salamander support - More ironman routes for barrows How to use Bot Manager or Script Queue: Script ID is 1181 Script Parameter is the saved profile name, e.g. hello123.txt2 points- Perfect Blast Furnace
2 pointsRUNNING 4 SESSIONS PER NODE NODE [2] WITH 4 MORE BOTS Showcase: 8 bots same time generating ~2.8m/hr which equals to roughly ~67m/day! 1 MULE PER MACHINE FAQ What is the script ID? 782 Can I run this bot with the Bot Manager? Yes, the parameters will be the saved file name in the setup window, you will see once you run the bot. Can I request features added to this bot? Yes, I am always listening to requests and adding new features all the time!2 points- Khal AIO Thieving
2 pointsWant to buy with OSGP? Contact me on Discord! Detailed feature list: - NEW!! Added Wealthy citizens! - NEW!! Added Wealthy citizens house thieving mode! - Supports all Npcs in multiple locations - Masters farmer support - Vyres and Elves support !! - Banking support - Tons of food supported - Dodgy necklace support + bank amount - Gloves of silence support - Shadow veil support - Rune pouch support - Gem bag support - Swap gear mode at vyres - Supports most stalls - Steal 1 Drop 1 mode - Worldhopping - Supports most chest - Safecracking at Rogues' den - Wire thieving at Dorgesh-Kaan - CLI support for goldfarmers Custom Breakmanager: - Setup Bot and break times - Randomize your break times - Stop script on certain conditions (Stop on first break, Stop after X amount of minutes, Stop when skill level is reached) - Worldhopping - Crucial part to botting in 2023! Script queueing: - Support queueing multiple script in a row - All Khal scripts support flawless transitions in between scripts - Start creating your acc in a few clicks from scratch to multiple 99's - Flawless CLI support - Learn more here: How to use CLI parameters: - Example Usage: -script 1141:ScriptFile.BreakFile.DiscordFile SAVEFILE = Saved Filename BREAKFILE = Breakmanager Filename - SAVEFILE: Save file can be created in the GUI. Navigate to the tab you want to run and press "Save As CLI file". Please choose your filename wisely (No special characters) - BREAKFILE (Optional): Breakfile can also be create in the GUI, set the breaksettings you wish to use and press "Save new CLI BreakFile". Please choose your filename wisely (No special characters) - Final form (Note that with some bot manager you do not need to specify '-script 1141'): -script 1141:TaskList1.4515breaks (With breaks) -script 1141:TaskList1.4515breaks.discord1 (With breaks & discord) -script 1141:TaskList1..discord1 (NO breaks & discord, leave 2nd parameter empty) Proggies:2 points- Perfect Miner AIO
2 pointsNEW CURRENT RECORD: 294 HOURS RUNTIME! Shoutout to @Ruutihattu NEW: Sandstone mining + hopper support Humidify/water circlet/bandit unnote Ardy cloak tele support Setup Screen Preview Results 84 HOURS ON NEW LEVEL 20 ACCOUNT Suicided account with mirror mode near rock crabs, 81 mining! I will probably go for 99 Even supports Ancient Essence Crystal mining! Preview: Mine 1 drop 1 item drop pre-hover feature:2 points- Inventory to entity interactions / invokes
And once you get that working, you'll wanna know how to handle the interface: if (getWidgets().isVisible(270)) { getKeyboard().typeString(" ", false); } Of course there's better ways to handle it but this is the quickest/easiest way2 points- Inventory to entity interactions / invokes
you would just need to add "Use" to the interact method. as interact wothout any action will just skip the Menu check and left click But this might result in nullpointer exception as the fire object might not always be there, so make sure to always null check widgets, objects, npcs, whatever you load from ingame Here is a super simple snippet: RS2Object fire = script.getObjects().closest("Fire"); if (fire != null) { if(script.getInventory().isItemSelected()){ if(fire.interact("Use")){ ConditionalSleep2.sleep(1000, () -> script.myPlayer().isAnimating()); } }else{ if(script.getInventory().interact("Use", "Raw Salmon")){ ConditionalSleep2.sleep(1000, () -> script.getInventory().isItemSelected()); } } }2 points - OSBot Native - Stable Public Release Now Live!