Jump to content

yfoo

Lifetime Sponsor
  • Posts

    175
  • Joined

  • Last visited

  • Days Won

    1
  • Feedback

    100%

Everything posted by yfoo

  1. It will be worth it on your zerk since you have access to void and salve (ei) and a higher range lvl. I have 700+ vorkath kc on a 120cb main. For your maxed zerker you can get the same kill times as me (99 range right?). Void, salve (ei), DHCB, some range shield are optimal. DHCB can be replaced with blowpipe if short on gp. You do not need to use an anti-dragon shield if you use super extended antifire, but if you do so you need to pray mage. But you will take minimal damage from breath attacks (max 10). salve(ei) DOES NOT stack with slayer helm/ black mask -> http://oldschoolrunescape.wikia.com/wiki/Salve_amulet. But gives better bonus (20% vs 15%) Expect 3-4 kill trips since ur 45 def, doing more than 4 usually means your leaving drops behind, and im not talking just about blue dragonhides.
  2. If a script is terminated are its resources open for garbage collection assuming I didn't do something that caused a memory leak?
  3. 1. I've notived that static variables seem to persist after restarting a script. Would setting these variables to null under onExit() wipe them for the next time the script is started? 2.) Are static variables shared among different instances of the same script? If I use a static to make a global variable, is that variable global to every running instance of a script or just that specific instance?
  4. private void openGUI(){ GUI gui = new GUI(this); try{ while(gui.isGuiActive()){ //1 sleep(500); } } catch (InterruptedException e){ log(e.toString()); } } confirmButton.addActionListener(e -> { guiActive = false; //2 frame.dispose(); } }); One implementation is under onStart() you could put some code like above. 1. In your GUI class a boolean value (that is retrieved via gui.isGuiActive()) denotes whether the user is finished with the gui (pressed start). Until then, wait. 2. you denote that a user is finished with the Gui by flipping said boolean value to false when your start button is pressed (in your listener for your start button). Basically you are delaying the conclusion of onStart() until the user is finished with the GUI. Then you proceed to onLoop() afterwards.
  5. If breaks are enabled how does the client notify my script that a break is imminent?
  6. As title states how would I do this. An approach I thought of was to override WalkingEvent's event() and place the appropriate lines to cast a spell before (or after) calling super.execute(). However this casts the spell before or after, not during. I'm pretty sure that I would need either make my own subclass of WalkingEvent or Event to satisfy my requirements, can anyone please confirm this?
  7. I mostly agree with your observations on the capabilities/resources of Jagex vs that of hobbiest scriptors and the notion that undetected botting is much harder today than ever, However I would like add some of my own insights onto your points on needing to use advanced AI techniques (NN, ML, etc.) to remain undetected. With undetected meaning not flagged by Jagex's Botwatch, not a manual review by a mod. I always suspected that Jagex uses a neural network to classify a player as a bot or legitament. NNs are good technique for pattern recognization, and one common technique is using NNs for image recognization. However NNs today do have their flaws. For example, there are cases where NNs fail to recognize a slightly altered image with changes imperceptible to humans. Furthermore there are examples of white noise being incorrectly classified as something else. Basically I just summarized the abstract of this article: https://arxiv.org/abs/1412.1897 So how do these details relate to botting. After this point all I can offer is conjecture. One key aspect that goes into creating a NN is training data, and what better place to obtain training data than to run public scripts (both premium/free) offered on various botting sites. Secondly, as proper bans are handed out the NN is given reinforcement learning (jagex validates the NN classiifcation as correct and the NN algorithm's weights are adjusted to better detect some general pattern). It is likely for this reason public goldfarming scripts are banned quickly, premium or not. They are profiled and given reinforment from every single ban. It is likely this reason why private scripts are considered less "detectable", Jagex's anticheat procures a different set of data that is unmatched to a known script. This may anaglous to how you can fool a image recognizer's NN by changing the image, you likely can fool Jagex's botwatch with a slightly different script. Im pretty sure Apa writes private scripts, he might give you a reasonable quote if you ask him nicely. Finally Jagex really shot themselves in the foot by allowing 3rd party clients. 3rd party clients use the same techniques (reflection/injection) as botting clients to obtain relevant game data. The existance of 3rd party clients gives plausable deniabiliy as to whether someone is using BestLite/WorstBuddy or a botting client, its too late now to change this, you saw how r/2007scape reacted when runelite was going to be shutdown. It is alot easier if prevent botting can also be done by detecting the existance of client tampering and banning any account that logs on. Alot less bots can be ran at anytime if everyone was forced to mirror mode. Trusting the user's client allows attack vectors to more easily found and exploited, the existance of Osbot is evidence of this. TLDR: private scripts prevent bans.
  8. Using ghostmouse was what Rank1EHP did to get permed. He got 200M agility from ~60M by turning in a fuckton of agility tickets. Then used a mouse recorder to bot crafting.
  9. The potions are called Absorption(4). not Absorption potion(4). You have ur strings wrong.
  10. private void hoverskill() throws InterruptedException { if (tabs.getOpen() != Tab.SKILLS) { tabs.open(Tab.SKILLS); } switch (attmethod) { //1 case ATTACK: //2 getWidgets().get(320, 1).hover(); break; case STRENGTH://2 getWidgets().get(320, 2).hover(); break; case DEFENCE://2 getWidgets().get(320, 3).hover(); break; } sleep(random(4000, 7000)); } private Skill getAttMethod() { switch (getConfigs().get(43)) { //3 case 0: attmethod = Skill.ATTACK; //4 break; case 1: attmethod = Skill.STRENGTH; //4 break; case 3: attmethod = Skill.DEFENCE; //4 break; } return attmethod; } I marked some numbers in the code snippit you posted so I can individually address what they mean. 1. the attmethod variable is an enum. An enum is a variable that can only be equal a few specific values, in this example the enum can only be the specific values of any osrs skill such as ATTACK, STRENGTH, DEFENCE....., FARMING (this snippit uses an enum present in the osbot API you can see them listed under Enum Constants section here: https://osbot.org/api/org/osbot/rs07/api/ui/Skill.html). 2. The attmethod variable is used in a switch statement. You will notice that following this line are multiple occurances of the CASE keyword. Whatever value after the case keyword matches with attmethod is the case statement that gets executed. This is similar to: if(attmethid == Skill.Attack){ gitWidgets.get.....; break; } There is a caveat to switch statements, as soon as one case matches, every subsequent case block regardless of whether the case matches or not is also executed. To prevent this from happening add the break keyword into every case block. In your snippit, getWidgets().get(320, 1).hover(); means to hover over attack simulating a check of current experience. this is "antiban" that is not effective whatsoever. You are not fooling Jagex's anticheat with "human-like behavior" because this action is done client-side, no data of this interaction is sent to Jagex's servers. 3. getConfigs(43) means to check bit strings (varbits) associated with the current attack player attack style. Obtaining varbits for congif 43 will return either 0,1,2,or 3. 0 correlates with the upper left option selected in the combat (usually associated with attack), 1 with upper right (usually strength), 2 with lower left (usually controlled), and 3 with lower right (usually defensive) 4. This second set of switch and case labels refers to setting up attmethod stay current with the attack method selected by the player. So that the hoverSkill method can correctly (and uselessly) hover over the correct skill being trained. This may also be used to paint the correct statistics of the skill being trained onto the game window. More detail on switch statments can be found here: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
  11. This method reads a RS2Widget for a message, a widget is a UI component in runescape, in this case the widget to be read is the absorption widget in NMZ. To read a widget you must first get an instance of it. The line RS2Widget widget = getWidgets().get(202, 1, 9) does that. The parameters in the get method are .get(rootID, child+ ID, child++ ID). Every widget can be identified by these 3 parameters, in some cases it can be identified by 2. It is better to obtain widgets through only the rootID through an API method that can identify widgets via a unique sprite, text, options, ect because child IDs may change over game updates. However I have use the above snippet in my own code for several months and have not seen IDs change yet. If you are just learning widgets don't bother with the better practice and just get it working first. This image shows an example of the absorption widget's ids and the widget itself's instance variables. The message instance variable contains the player's absorption level. https://imgur.com/8U5TKE6
  12. If I wanted to put an asset in the resouce folder what is the proper approach to do so? Do I under onStart() download the asset into the resouce folder if it doesn't exist? Or is there a way to bake the asset into the jar itself? Thanks.
  13. To clarify, by extending API and calling exchangeContext under onStart() I don't have to pass in the a script reference to access all the Script.getXXX() methods. Also do you happen to know the config id for the GE and how to parse the int returned by Configs.get(int id)?
  14. Upon reading this and looking at the Widgets class, there are alot of things that I should be leveraging. Thanks.
  15. As title states, please offer your critques on my classes related to the grand exchange. There are 3 source files comprising this project, First is the GrandExchangeOperations.java file. In here are the methods for buying and selling items. The return of the buy and sell methods are GrandExchangeOffer instances, these are a data structure used to hold information related the the offer, such as the itemID, GrandExchange box, current amount traded, etc. There is a heavy reliance on static widget ids down to the 3rd level, there is possibly a way to use some filtering on some criteria to find the correct widgets but I haven't figured out how to do that yet. GrandExchangeOperations.java https://pastebin.com/cB384h6d This the implentation of the aforementioned data structure. There is some awkward implementation of a object pool where only 8 GrandExchangeOffers are allowed to be created through a static getInstance method (as there are only 8 ge boxes). Looking back on this from a few days after I wrote it, I don't feel this is necessary and just makes things more complicated. GrandExchangeOffer.java https://pastebin.com/jUHEVZTe Finally I needed a way to know when an offer has completed. I decided to the observor pattern to do this. This class uses a seperate thread to check all active ge offers and notifies all listening classes when a ge offer has updated. GrandExchangeObservor.java https://pastebin.com/GVwcuvKs The goal of this project was mainly because I wanted a listener for ge offers, I'm writing an unfinished potions script, one requirment is given a sufficient cash stack, handle buying clean herbs and selling the finished... unfinished potions. Collection of herbs from the GE needs to be weaved in to the standard cycle of... bank and restock -> create unfinished potions -> bank and restock. A 1k stack of clean herbs is expensive (1k toadflax = 3m) and can all be converted in about 15mins. I wanted something that can be left alone for 2hours without me having to put like 24m or whatever on the account. If you got this far, thanks for reading.
  16. Multiple times to the point I stopped using clan wars. I think the reason this happens is because entering the portal hits a loadzone, as a result jewelry teleports options have to refresh/reload. You can see this happen by entering the clan wars portal and while your character is walking to the portal, go into the equipment slot and right click a jewelry teleport to show the options. As soon as you hit the portal loadzone, you will notice that not all teleport options are available. It could be that your script attempts to teleport to edgeville too quickly after traversing the loadzone and not all options are available. I'm assuming that in your code somewhere you have something resembling: if(Equipment.interact(Glory slot, teleport edgeville)){ //webwalk to air orb } and Equipment.interact(Glory slot, teleport edgeville) may have wierd behavior due to the missing options.
  17. @Shudsy Script is stuck after entering clan wars portal. It does not teleport to edgeville. Can you also make it such that closing the GUI does not close the botting client? Thanks.
  18. Can you explain what happens after I buy a proxy? Do I get PMd an IP, port and password similar to if I bought a proxy off of VPSgamers.
  19. Unf potions, my own script.
  20. I recieved a 2day ban on an obvious goldfarming account (if you looked at the stats) that has been active for about 22days. This was a p2p account. Is it common for p2p goldfarming accounts to recieve a temp ban as opposed to a perm?
  21. How do you get the GrandExchange.Box that the below method uses to buy an item. buyItem(int itemId, java.lang.String searchTerm, int price, int quantity) Is there another way of doing it that is not (python-like psuedocode) for box in geBoxes: if box.getItemID == correctItemID: return box return null Thanks.
  22. Thanks, I got it working again. It took me a while to realize that Mouse dragged is not supposed to be in checkMouseEvent(MouseEvent). public void checkMouseEvent(MouseEvent e) { switch(e.getID()) { case MouseEvent.MOUSE_DRAGGED: //This should not be here, Mouse dragged needs be its own seperate overridden method. break; .... } } Makes sense too as dragged likely needs to be "listened" differently than a press or release.
  23. Hey @Alek When OSbot updated to 2.5 some API changes were made to implementing a mouse listener. As the title suggest, how do you use the new class BotMouseListener? Specifically what does the API doc mean when checkMouseEvent(java.awt.event.MouseEvent e) states: Use this method in place of mouseClicked(MouseEvent), mousePressed(MouseEvent), mouseReleased(MouseEvent). Before 2.5 I was using a mouse listener to have a draggable paint: onStart(){ this.bot.addMouseListener(this); //method doesnt exist anymore this.bot.getCanvas().addMouseMotionListener(this); //marked as deprecated } @Override public void mouseClicked(MouseEvent e) { //not used } @Override public void mousePressed(MouseEvent e) { Point clickPt = e.getPoint(); if(paintArea.contains(clickPt)){ movingPaint = true; xOffset = clickPt.x - paintArea.x; yOffset = clickPt.y - paintArea.y; } } @Override public void mouseReleased(MouseEvent e) { movingPaint = false; xOffset = 0; yOffset = 0; } @Override public void mouseEntered(MouseEvent e) { //not used } @Override public void mouseExited(MouseEvent e) { //not used } @Override public void mouseDragged(MouseEvent e) { if(movingPaint){ Point mousePos = e.getPoint(); paintArea.x = mousePos.x - xOffset; paintArea.y = mousePos.y - yOffset; } } @Override public void mouseMoved(MouseEvent e) { //not used } Thanks.
×
×
  • Create New...