Jump to content

yfoo

Lifetime Sponsor
  • Posts

    238
  • Joined

  • Last visited

  • Days Won

    1
  • Feedback

    100%

Everything posted by yfoo

  1. There is probably no way to create an account on 1 ip then immediately do tutorial island on another. What is probably going on is a VPN is used to make the account creation ip the same as the botting ip. Assume you have a VPS, one way to make the creation ip the same as the botting ip is to create the account on the VPS through remote connection. However, you probably don't want to remote view onto your VPS to create an account due to input latency, so instead you setup a VPN on your VPS that you connect to on your home PC. This makes it so that all (or a targeted subset) your internet traffic is routed through your VPS to jagex's servers. You get to create your account without input lag and have that account registered as far as Jagex is concerned on the same ip that you will later be botting on. I think openVPN is the software used to do this. Note that I have never done this, I just think this is how you would do it. GL!
  2. 99 fletching done, with good timing I only had a day of p2p time left. https://imgur.com/qY9sxrx As previously stated, 99 hunting is next, I'll be scripting a salamanders script. You may have seen 3rd party clients paint the status of traps onto the screen. Probably their implementation has a separate thread poll the status of every trap on a loop, relay a message to their canvas painter on status change. I want to do something similar, however instead of the trap polling thread relaying a message to the canvas painter, queue up a corresponding custom event (subclass of Osbot.Event) instances to be executed under onLoop. Basically a producer-consumer relationship between the polling thread(s) and the onLoop thread. It may be simpler to use the "state based scripting pattern" but I want to write this project to play around with multi-threaded programming. The operating systems class I took was garbage as it was easy to earn an A in. The professor reuses old tests AND the old tests were shared with me AND the test is open note. I was only taking the class because it was degree requirement. So obviously it is my fault that my knowledge of concurrent programming does not extend beyond async REST calls and a vague understanding of the application of a mutex to control access to shared memory.
  3. I like how the thread title's date constantly gets updated. Thank you for your diligence.
  4. If you are using mirror mode and you receive the Resizable warning to restart the client try restarting both your mirror mode target AND osbot. Restarting the osbot client alone is not sufficient.
  5. public final void conditionalSleep(int time){ new ConditionalSleep(time) { @Override public boolean condition() { return false; } }.sleep(); } You don't use conditional sleeps correctly. Any time you call this, all you do is sleep (do nothing) for <time> milliseconds, if you want that functionality use sleep(<time in MS>). Conditional sleeps until its "inner condition function" ( aka abstract condition method) returns true. For example I may want in a red chins script to sleep until the condition that a box trap that I've placed has been triggered by a chin resolves to true. Furthermore on the matter of whether the box trap is yours, your script needs to register if your character has placed the trap (trap is removed from inventory and placed on the ground). If your character did, store the trap's position in some data structure. When your script runs the part of your code that checks triggered traps, first check whether said trap is yours. Only interact with the trap if the trap's position is stored your data structure, then remove the trap's registration.
  6. People already record their mouse actions doing simple actions (ex: fletching, cooking, mining) then "bot" by replaying it. You occasionally see people on r/2007scape getting butthurt that someone with a high level account is obviously mouse recording something, usually powermining iron.
  7. Bot detection seems on point for the last days. I just want 1 account running my item-combinator script on unf potions. I like to raise the cb lvl of my goldfarming accounts a bit before bonding them and getting the required herblore lvl. However it seems every account I make gets banned the following day, before I even bond them at all. ~1month ago, prepping accounts went so smoothly, no premature bans at all. Mains fine though. 97 fletching.
  8. Holy shit am I dumb. Don't make an account on your home ip (US based) then buy a proxy from dbolter then log in using said proxy (think his proxies are EU based). The account got locked mid trade thankfully else I would have lost ~$3 in bot prep supplies.
  9. I created the script to goldfarm unf potions. Thats why the paint shows a table for AVAN (avantoe), TDFX(toadflax), IRIT(irit)... etc. I have gotten a few accounts banned doing unf potions, however they usually profit. Currently I'm using this same script to get 99 fletching for shits and giggles. I can use the same script because creating unf pots and stringing bows is nearly identical in terms of actions, I just supply a new set of target items to combine. Ditto for creating potions (herblore) and putting orbs on battlestaffs (crafting).
  10. You're probably right. Jagex likely uses bans as a form of reinforcement learning.
  11. I usually just pass the script reference to give my classes api method access, I learned how to do this from explv's tutorial. I also know that it is possible to get api method access by having the class extend MethodProvider (or API) and override exchangeContext with a call to super. The in onStart() call your class's inherited exchangeContext(). Looking at osbot source I think what this does is in your class, instantiate the inherited variables of Logger, Skills, Magic, Bank, etc... from the passed instance of bot. Which way should be used and why? Thanks.
  12. I was thinking of something like this. Set up an VorkathObserver interface for relevant classes. The code that calls onVorkEvent runs on a seperate thread and inserts events into a priority queue. interface VorkathObservor { onVorkathEvent(VorkathEvent e); } VorkathEvent (maybe an extension of Event) instances have a predefined weight, the instakill fireball and poison phase will have the highest weight. This is so that a priority queue can be assembled with vorkath events, onLoop() will pop the PQ, and execute the event. The events that need an immediate response (fireball, poison, ice breath) will be at the top of the PQ and executed ASAP. Since there are 2 threads operating on the PQ, I don't know if synchronization is needed. Specifically what happens if the listener thread attempts to insert while the onLoop thread attempts to poll?
  13. Never knew that the yellow line indicated is always poison free. This actually makes things alot easier if it was the case, ill do some testing later today.
  14. I get your solution but the 5+ tiles have to be in a straight line to give me enough buffer room to turn around. The reasoning being your to dodge fireballs your character has to be on a different tile every game tick or you take 20+ damage, this is registered server side. Lets say I were to make a 90 degree turn, if I were to click on a tile to turn after seeing my character arrive at the turning point, I will take damage; the server registers I am 1+ tiles ahead than what is shown on my client screen. In the server's calculations it sees that I arrived at my destination tile, then sends data to my game client, my game client then shows I am at the destination tile. By the time I send data to the server indicating a direction change I have stopped moving (the server sees that I have been at the same tile for 2+ ticks) and would have taken damage. In a straight line, I am constantly moving therefore preventing damage. Just before the end of my path (ex: lets say 2 tiles b4, thats why I need enough buffer room) I change direction 180 degrees (click opposite tile of path) but still am constantly shifting my position 1 tile every game tick. As long as I input another move command before I arrive at my destination tile I am always moving both server and client side. Taking 90 degree turns is therefore risky as I need to input the move command when I think the server has registered I am at the turning tile which is before my game client shows my character at the actual turning tile. If I guess too early I may prematurely turn, too late I take damage. Your solution may actually work because you click to move before every 600ms game tick (assuming each walk is synced to game ticks) but honestly when I do vork manually I don't dare try moving 1 tile at a time. Thanks for writing the code though, I need be better familiarize myself with java 8 streams.
  15. I would recommend splitting the project into multiple files. It is not easy to read the code when everything is thrown in to 1 file. If you are unsure about using multiple files, then organize your code such that similar methods are close to each other IMO I would put in this order onStart() onLoop() onExit() onPaint() onMessage() These 5 methods are inherited from Script, and are similar in that sense. bank() mule() and waitForTrade() These 3 are helper methods as they "help" do things in onLoop afk() only sleeps for a bit, why not just replace every afk() call with whatever you had. sleep(random(3000, 8000)) or whatever. Furthermore this line in onMessage() does not discern between different message types, if a player spams "You get some oak logs" then your oak log cut counter gets incremented. if(m.getMessage().contains("You get some oak logs")) oaklogscut++; first check the message type, you only care if it is a game message. See: https://osbot.org/api/org/osbot/rs07/api/ui/Message.html if(m.getType == Message.MessageType.GAME && m.getMessage().contains("You get some oak logs") oaklogscut++; Also, what does this do? the timegui variable is never used. You don't need to use a separate thread to track time, do this in onPaint() which already runs on its own thread. I think you already do this, so this snippet does nothing. thread = new Thread(){ @Override public synchronized void run() { while (Main.this.isRunning) { try { timegui = System.currentTimeMillis() - Main.this.startTime; this.wait(50); } catch (InterruptedException ex) { Main.this.log((Object)ex); } } } }; thread.start(); Finally why is the code indented weirdly. If you are using an ide you can auto-formate the code. Anyway, good job.
  16. Personal accounts. The one I'm getting 99s on for now is my main (the one with defence).
  17. 93 fletching, missed a few levels. Found the osbot utilities has a screenshot method, I should use that.
  18. I can't even do that as a human.
  19. I try to depatterize as much as possible with an implementation of a markov chain. In the item combinator script (the one doing the fletching) I coded multiple ways to... withdraw items (withdraw 14, misclick withdraw 10, misclick withdrawX) sometimes I the script purposefully withdraw 10, I will have a fix component that will make a subsequent withdraw attempt so that the final inventory is 14 of one item and 14 of the other combine items (randomly select an item about where the primary and secondary items intersect. i.e: select the first item at a rand inv slot 10-13, select the second item at rand inv slot 14-16. Interact with the banker sometimes when interacting with the make-all button I will immediately right click hover the banker sometimes mouse offscreen, and afk for a bit after every item has been processed sometimes wait a bit then then hover the banker sometimes wait a bit, hover the banker but over-eagerly press bank before every item have been processed (there would be like 1 or 2 left to combine). The markov chain is used to randomly select a some variation of an action to run. Some actions occur more frequently than others (optimal actions most frequent). An image to better illustrate what I mean: https://imgur.com/CtAP0Tl. W14P means to withdraw 14 of the primary item. Other abbreviations follow the same convention. There end up being 48 distinct possible paths (6 * 3 *3 = 48) (distinct ways to combine items). While there probably still a pattern it is much harder to detect (or takes longer) resulting in what hopefully is less frequent bans. Or none as I do other legit content on my main to mix it up On injection botting, I can't say that it is detectable or not. But what I can hypothesize is that because 3rd party clients are all the rage, and these 3rd party clients reverse engineer osrs just like botting clients (injection/reflection) jagex has a harder time knowing if someone is botting based only on foreign code detection. Someone may be using a 3rd part client that just happens to use injection to pull game data. You're probably right with Jagex not being able to run bot detection on all accounts, I heavily suspect accounts newly created are flagged. This flag is lifted after some playtime to give the anticheat some time to screen new accounts. The majority of new accounts created are f2p suicide bots right, and they get banned relatively quickly. I don't think anticheat is built into the game client, I read java code is easy to de-obfuscate in comparison to other languages. If you look at the decompiled source code of the osbot client you will notice variable names being changed to a variation iliiIlili, while difficult to look through it still is possible. I think the reason that java is easy to decompile is the reason there are so many 3rd party clients. ^ I am not positive that the above is true, I don't have experience reverse engineering java code and can only give my naive observations. One more thing, I think that some operations in the game are purely client side. My justification for this is that they can be implemented client side. For example hovering xp for a skill is a matter of reading loaded memory on your computer, when you hover a skill the rs client probably does not send a request to a Jagex server requesting the xp for a skill. Other things I think are client side are camera rotation, examining items, selecting an item but not using it on a related item, and right clicking somewhere. Operations that are client side are opening the bank, withdrawing or depositing items, placing a GE offer, trading or following another player, and walking somewhere (duh). This distinction is important because if anticheat is not in the client then only data that involves both the client and a Jagex server can be used to detect botting.
  20. I'm thinking of writing a Vorkath script, IMO the hardest part to code is the poison pool phase. My solution is to use a modified version of DFS that searches for a line at least 5 consecutive tiles and if needed a path to reach the start of the consecutive tiles. Initially I want to make a plugin to test that the code works. My question is what solution would you use to find a safe path for the poison phase or what errors or edges cases did I not account for in my algorithm. The poison phase can be represented as a graph problem where each tile is a node and has edges to its surrounding tiles. However in my case I only have edges to surrounding edges in cardinal directions to simplify code logic. My proposed solution needs the following variables/functions to work... lastDirection: what direction are the consecutive tiles going in consecutiveTiles: how many tiles in the same direction expanded startConsecutiveTile: where to start counting consecutive tiles from endConsecutiveTile: " " stop " ", start and stop needed to later to generate a path to the solution directionChanges: num times directions have changed 90 degrees, stop expanding nodes in the current DFS path when this is over some value, lets limit to 2 direction changes. This is similar to how depth limited DFS limits search to some depth. The less 90 degree direction changes the better because osrs shows the tile that you were on 1 tick before (I think) and in order to properly do a 90 degree turn at some specific tile you need to click about 1 tile before the turn. There some fuzziness due to lag. dfsStack: stack holding Dragon Fire Shield charges visitedSet: a set containing visited tiles to prevent tile re-expansion predessorPaths: a dict keeping track of pre-req paths to get to the final path. Key: a path, Value: last path needed to get to the path in the key. This is similar to how a dict is used to hold predecessor nodes in regular DFS to get the path to the solution. finalPath: the path that is used to walk back and forth during the poison phase while vork rapid fires fireballs initialTile: passed parameter for this function, the starting tile to find a solution from tile.getSuccessors(lastDirection): returns an array where the tile in the lastDirection is last element in the array, this is because these tiles get placed in the dfsStack and we want to expand tiles in the same direction. This makes it such that the tile that expands in the same direction is at the top of the stack. getSuccessors does not return tiles that are inaccessible or have poison. If currDirection is null, return directions in counter clockwise order starting with the west tile. getDirection(currentTile, lastTile): returns the direction (N, W, S, E) from the lastTile to the currentTile. expandInOtherDirection(currentTile, lastDirection: it is possible that there are tiles on the same x or y axis starting from startConsecutiveTile in the opposite direction of lastDirection that are unexpanded that can create a straight path of 5+ tiles. This function would return a tile before a poison pool or inaccessible tile in the opposite direction. PsuedoCode: vorkDFS(initialTile){ # bookkeeping variables consecutiveTiles = 0 directionChanges = 0 lastDirection = None startConsecutiveTile = initialTile endConsecutiveTile = None lastTile = initialTile lastPreReqPath = None finalPath = None # DFS data structures dfsStack = [initialTile] visitedSet = Set(initialTile) predessorPaths = Dict() while(dfsStack not empty): currentTile = dfsStack.pop() successors = currentTile.getSuccessors(lastDirection) # the first run the initialTile is expanded, a direction cannot be determined until # the next tile gets expanded. Basically for the first loop, do not run this part. if currentTile != initialTile: direction = getDirection(lastTile, currentTile) if lastDirection == direction: # still continuing on in the same direction consecutiveTiles++ lastDirection = direction if consecutiveTiles >= 4: # soln found of at least 5 tiles! The start tile (1) + (4) additional tiles for 5. finalPath = (startConsecutiveTile, endConsecutiveTile) break else: # it is possible that there are tiles on the same x or y axis starting from startConsecutiveTile that are unexpanded that can create a # straight path of 5+ tiles extendedStartTile = expandInOtherDirection(currentTile, lastDirection) endConsecutiveTile = currentTile if startConsecutiveTile != extendedStartTile: #if the extendedStartTile is different then there are additional tiles that may form a staight line path of 5+ tiles if abs(startConsecutiveTile[0] - extendedStartTile[0]) + endConsecutiveTile[0] >= 5 or abs(startConsecutiveTile[1] - extendedStartTile[1]) + endConsecutiveTile[1] >= 5: finalPath = (extendedStartTile, endConsecutiveTile) break # making a direction change consecutiveTiles = 0 directionChanges++ if directionChanges > 2: # exceed direction change threshold, terminate break # remember the start and end tiles of this line so once a solution is found the prerequsite paths to get the soln can be retrieved # paths are straight lines of consecutive tiles endConsecutiveTile = currentTile if lastPreReqPath: # there is some pre-req path to get to this path. i.e: a direction changed happened. predessorPaths[(startConsecutiveTile, endConsecutiveTile), lastPreReqPath] else: # if this path starts off the initial tile there is no lastPreReqPath, set it. Since the value in the dict is None, that means some # path is the start. predessorPaths[(startConsecutiveTile, endConsecutiveTile), None] # a new path started, reset these variables startConsecutiveTile = currentTile endConsecutiveTile = None for tile in successors: if tile not in visitedSet: dfsStack.push(tile) visitedSet.add(tile) if finalPath != None: # use predessorPaths to get the solution soln = [finalPath] backTrackingKey = finalPath while(predessorPaths[backTrackingKey] != None): # if the value is none, this path starts off the inital tile. soln.append(predessorPaths[backTrackingKey]) backTrackingKey = predessorPaths[backTrackingKey] return soln return None # no solution found ~ there might be a code error or there is just no soln without having to step over a poison pool. # if there is no solution, prehaps rerun the vorkDFS but allow the stepping over 1 poison pool, repeat this until a soln is found or a threshold is # determined. } If I were to run this algorithm on a simulated graph, this is what I think will happen. Blue tiles = Vorkath, Green = poison pools, Red= Start Position, Yellow = Expanded tiles, White = Nodes in Frontier (DFSstack) https://imgur.com/5asbIHj From here b/c the player (red) is surrounded by poison pools except to the east, east is expanded. The east tile continues to be the one to be expanded because I purposelessly put the tile in the same direction at the top of the DFS stack. This will happen until hitting the poison tile directly to the east. At this point the startConsecutiveTile is labled start, same for end. https://imgur.com/L2L8uId Because continuing east is no longer an option, the algorithm will expand north until it is right adjacent to Vorkath, this also sets lastDirection to North. This is a direction change so the algorithm scans west from the start tile to see if there are additional safe tiles in the opposite (west) direction. In this case there are none. Instead directionChanges is incremented to 1. Furthermore consecutive start and end tiles are cached in predessorPaths. https://imgur.com/4Wql4MN After hitting vorkath who occupies inaccessable tiles, a direction change is noted again, but this time the expandInOtherDirection finds that there are more tiles opposite (south) direction of lastDirection (north) that form a straight line path of 5+ tiles. A finalPath is noted and the while loop breaks. https://imgur.com/AWOMO1Q Finally predessorPaths is queried with finalPath as the key, this will continuously append pre-req paths into the soln list until we end up back at the initial tile. This soln is returned. How would you code this?
  21. For integration it depends on if you have a set scripting style. If I were to do this I would utilize Object oriented programming, this means separating multiple functionalities (wc, fish, fm, ect.) into their individual classes/packages. Then have some a supervising class that decides which functionality to execute; ex: on script start choose a skill to do, run that skill until a desired level, choose next skill, decide whether to do GE operations, repeate. If you were want to do something like this, decide early because it is very difficult to write a bunch a separate skilling scripts then attempt to merge them together unless you have planned your code structure out. For my script there is some randomness involved, basically I code the same interaction multiple times with variations between each. For example, I wrote a splash - alching script that when alching would rarely but intentionally misclick on earth blast (since the spells are adjacent) or go to cast high-alch but click in area where the hitbox for the alching item is not directly under the cursor once the game auto shifts to the inventory tab. Typically when coding slightly different interactions I go for common errors that a human would do, when I manually stun-alched I would occasionally do some these errors. A supervising class would randomly choose a logical subsequent action (ex: after stunning, choose either a normal alch or alching error). IMO most easiest way to implement antiban for a bankstanding script (such as cooking, fletching, crafting, etc.) is to wait a bit after an inventory of crap has been processed. I am not certain that this actually reduces/delays bans because I also bot moderately and legit play the account too. I like to think that some mild randomization and reasonably botting hours can sneak under the anticheat of company that has made wonky business decisions over the past 10years. Also I don't suicide bot.
  22. Sorry about the imgur links, for some reason the forum's "Insert image from URL" not working. 1. The script just combines items together. If you mean the combat 99s, I have code (seperate scripts) for them aswell.
  23. preface: 150+ug LSD atm. So text doing its wavy thing, and if any text seems off. Starting ground: https://imgur.com/OHzb1PS I am the Original Owner of these accounts. They were not phished or w/e. Bankstanding skills are EZ... https://imgur.com/SoFMqbR This script is a unf potions script but By adding an enum value I can do Fletching/Crafting/Herblore. One method in training these skills is combining 2 items together (which is what creating unf potions is), and as you know in RS bankstanding skills are essentially the same. bublic enum CombinationRecipes { AVANTOE("Avantoe", "Vial of water", "Avantoe potion (unf)", "avan", 261, 227, 103, Skill.HERBLORE, 50, true), TOADFLAX("Toadflax", "Vial of water", "Toadflax potion (unf)", "toadfl", 2998, 227, 3002, Skill.HERBLORE, 34, true), RANARR("Ranarr", "Vial of water", "Ranarr potion (unf)", "ranar", 257, 227, 99, Skill.HERBLORE, 30, true), IRIT("Irit leaf", "Vial of water", "Irit potion (unf)", "irit", 259, 227, 101, Skill.HERBLORE, 45, true), KWUARM("Kwuarm", "Vial of water", "Kwuarm potion (unf)", "kwu", 263, 227, 105, Skill.HERBLORE, 55, true), HARRALANDER("Harralander", "Vial of water", "Harralander potion (unf)", "harra", 255, 227, 97, Skill.HERBLORE, 21, true), AIR_BATTLESTAFF("Battlestaff", "Air orb", "Air Battlestaff", "", 1391, 573, 1397, Skill.CRAFTING, 66, false), YEW_LONGBOW("Yew longbow (u)", "Bow string", "Yew longbow", "yew long", 66, 1777, 855, Skill.FLETCHING, 70, false), MAGIC_LONGBOW("Magic longbow (u)", "Bow string", "Magic longbow", "magic long", 70, 1777, 859, Skill.FLETCHING, 85, false); } // ignore static ids, exist b/c osbot-grandexchange-api needs them for item matching. 99 fletching is next. After that If I'm not permed why not hunter. I legit grinded that in rs2, lets make it easier the second time around. Or if I don't feel like adding more code, continue running the same script.
  24. Used p****bot and RSbuddy back in 2010-2011. Was a complete script kiddy back then too; remember copying source code from a thread, compiling it, the dropping the jar in some folder. Getting a 99 legitimately was considered by me a big accomplishment and one my best rs moments was getting 99 hunter back in 2009. Botting was cool in the beginning but soon I found that it took away any feeling of pride. Friend in uni reintroduced me to osrs in Nov 2017. At uni I studied computer science so it wasn't long before I decided grinding sucks and created my first "bot". It was an autoclicker written in python and I used it for alching. Some notable features I specifically designed for osrs were... Set 2 points on your screen to make a rectangle. These form bounds for where to click. If the mouse ever left the bounds, it will be moved back. Random normal distribution between clicks Set a number of clicks (alchs) to do. Stop afterwards. It was fun to write and like a day after finishing I decided to check out actual botting clients with the caveat that if I were to bot I would do so with my own scripts. Doing so preserves the feeling of accomplishment as effort had to be put forth to write good scripts. I briefly considered 3bot until seeing that it costs money to actually run even free scripts for more than 2 hours, Fuck that. Runescape's anticheat is pretty good nowadays, I'll let you be the judge of how successful botting was for me... https://imgur.com/zn5FWMo https://imgur.com/J8vDvtj https://imgur.com/vxmXxMI https://imgur.com/OHzb1PS Osbot's API is impressive and you can tell Alek puts alot of work into it.
  25. How do you delete the old images under my attachments? I hit my quota.
×
×
  • Create New...