Jump to content

Leaderboard


Popular Content

Showing most liked content since 10/21/2017 in all areas

  1. 10 points
    I've recently received a PM from a user asking for scripting advice. His code made me contemplate suicide. I'm writing this tutorial in an attempt to prevent this from happening again in the future. Einstein's Scripting Tutorial This tutorial covers the basics and it's aimed at users with very little / no knowledge on this subject. Knowing some basic Java will definitely help, but is not required. After reading this tutorial, you will be able to write your own basic Tribot scripts. Let's get started! What exactly is a script? According to Wikipedia, scripts are "programs written for a special run-time environment that automate the execution of tasks that could alternatively be executed one-by-one by a human operator". Sounds familiar? In our case, the special run-time environment is the Tribot client. Needless to say, scripts written for Tribot will not work outside it. Executing a .class file from your desktop will have no effect. You need to start a Tribot instance and feed it a script in order get things working. So you can view scripts as a set of instructions that you want your bots to execute. Instructions such as: go to bank kill a goblin move the camera chop down a tree Adding rules to the instructions will allow them to be executed when needed, for example: go to bank if the inventory is full kill a goblin if my player is not in combat etc. Let's take a step back New programmers get very quickly overwhelmed by the avalanche of new symbols, keywords, { } [ ] ( ) ; : ... -> ( ͡° ͜ʖ ͡°) (ok, the last one is not part of the Java syntax) Be aware of this pitfall and don't get stuck. Any kind of software, as complex and cryptic as it may seem at first, it's really just a set of instructions. In order to understand how simple programming really is, let's take a step back and abstract Tribot/Runescape. Consider the following script that you probably ran today IRL, without even being aware of it. The comments (green) are ignored by the compiler, I included them just to make matters more clear. ("!" - means "NOT" ) Writing a script that will be executed by Tribot A. The setup: Steps 2 to 5 will be repeated every time you write a new script. Step 1 will only be repeated if Eclipse tries to hack you. 1. Download any Java IDE. If you need a tutorial for this, maybe you should find another hobby. 2. Create new project, the name is irrelevant. 3. Go to Java Built Path (depends on IDE) > add extrenal JAR > navigate to .tribot\dependancies > add "TRiBot.jar" 4. Create a new package called scripts (lowercase 's'). 5. Create a new class, again the name is irrelevant. If your setup looks like this, then you are ready to move on. B. The Actual coding: Now that you finished the setup, you are finally ready to start coding. Simply make your class extend Script (uppercase S). This will generate two different errors. 1. Just use the IDE's auto import shortcut, if you are using Eclipse, it's Ctrl + Shift + O. 2. Click the error warning > "Add unimplemented methods" Things should look like this at this point. The run() method will be called automatically when you press in the Tribot client. The instructions contained within the run() method will be executed in sequence, from top to bottom. If all the instructions are executed, the script will stop. In order to make the script continuously run until we manually stop it, we must add an infinite loop. That's all. Now the only thing you have to do in order to make this script useful, is to add instructions and set rules for them. Refer to the Tribot API for a complete list of instructions. https://tribot.org/doc/ Running the script Your IDE will automatically compile the .java files into .class files. Navigate to your workspace (the location of your project) and copy the .class files. Paste them in C:\Users\User\AppData\Roaming\.tribot\bin\scripts. If you packaged the script correctly, it will appear in the script list when you press . Note: By declaring a script manifest (see below), you will be able to define a custom script category, such as "Testing", "Goldfarming", "Trading" etc. Actual script example I never imagined that I would actually publish this. If I remember correctly, this is my first script. I've modified a few things for simplicity's sake and I've commented every line of code. Note: This modified version is not tested. Edit: Code will soon be modified. Line 51: The null check is not necessary, as potato[0] is guaranteed to be non-null Why did I named the potato-gathering method abuse? Null Pointer Exception / Array Index Out of Bounds Exception Anyway, I think the commented code is self explanatory. The only lines that I would like to further explain are: Edit: Code will be added soon. Thanks @Assume. Two of the most common exceptions you must be aware of while scripting are Null Pointer Exception and Array Index Out of Bounds Exception. They are both runtime exceptions and refer to a very similar thing (NPE: the reference variable points to nothing; index: you are trying to access a non existing index). The idea is that you cannot perform actions upon something that doesn't exist. Consider the following table. If you give a human the instruction "Give me the apple on the table". He/she will tell you that there is no apple on the table. (probably) Give a Java program the same instruction, and it will "tell" you the exact same thing in a form of a thrown exception, a printed stack trace followed by the program's termination. Tips Learn Java before getting into scripting. Read the whole API a few times: https://tribot.org/doc/ The only way to become proficient at this is by practicing. Solve problems as simple and as natural as possible. Don't over-complicate things. Methods should only do one thing. Try to keep them under 30 lines of code. Any kind of non-trivial script requires a framework. Avoid using static variables. Read open source scripts. Write scripts because because you enjoy doing it. Have fun; experiment with code. The end Thank you for reading my basic scripting tutorial and I hope you learned something from it. If you need any help with your scripts, or you just want to harass someone, feel free to send me a PM.
  2. 7 points
    Hello, I wrote this script at quest release, however I never got around to finalizing and posting it. It is in mostly one class, however it should still be quite readable. It is built using the EnumScript framework which I quite like. Features include: Start the script at any step or anywhere in RuneScape that is supported by Dax's WebWalker. Arguments for house favor and skill lamp selections. By default, Arceuus house is chosen and the skills chosen are randomized. If you provide arguments, it will not randomize. Requirements: Only requirement is to have 1 feather or 2 gp. Arguments instructions: (important for customization!) Script can be found here: https://tribot.org/repository/script/id/2569 Source can be found here: https://github.com/FALSkills/TribotScripts/tree/master/clientofkourend Thank you to @Final Calibur for his ACamera class, and @daxmagex for his WebWalker and included utility functions. Walking in RuneScape would be a pain without you!
  3. 6 points
    - WHOMEVER scripter or random botter wanting to help assist the scripters with bug trial error runs to test out the script & get this Slayer Bot fully functioning! - I have a team of scripters and testers in the beginning of a project preparing all jets to dish out a Slayer script for the Tribot community! We will need some casual botters & scripters with the passion and optimism to carry this community to greater lengths and overcome many obstacles Jagex puts in our way! I love this community and want to help assist the scripting/botting world behind RSOS. I wont ramble on too much, i just wanted to see if there is anyone to reach out to who are also interested in a working slayer script. Join the xSlayer Script Discord server if you are interested in assisting the project ↓↓↓ by clicking the discord button below ↓↓↓ ⇓⇓⇓⇓⇓ EDIT / CURRENT UPDATES ; 04/07/2017 - I Have successfully gathered a group of individuals including scripters & testers working together in a discord server on a project to create a fully functional SLAYER script in RSOS. __________________________________ 10/07/2017 - The team and i have acquired almost every monster/slayer NPC in game, ready to implement the data. __________________________________ 05/10/2017 - Aquired many more enthusiastic scripters to the team in assisting to make this script very possible! There is progress. __________________________________ Whoever wants a working SLAYER script LIKE THIS post
  4. 3 points
    Performs tasks on Zeah to achieve 100% favour in each house. Also does the Client of Kourend quest. I will be slowly working on this script and I don't expect to have it for sale until January, but I do plan on offering free access to it while I develop it. I will post on this thread when the free beta is available. Currently all tasks that grant favour are listed in the GUI, but I will only be supporting the most bot friendly tasks. I have yet to do all the tasks myself so I am not sure yet which ones are going to be scrapped. If they all prove to be relatively bot friendly, then I will support them all. TODO LIST: - Client of Kourend - Arceuus - Hosidius - Lovakengj - Piscarilius - Shayzien
  5. 3 points
  6. 3 points
  7. 2 points
    I prefer longer lasting methods unless you have software to automate a suicide goldfarm it's more work than it's worth imo.
  8. 2 points
    @daxmagex your server needs to be switched, I put a lot of my accounts on the line today. This is now strike 3 within the past 30 days that your server for the walker cut out. Other people weren't as lucky as me today and had their accounts banned. If I'm paying money for a "premium" scripts and they turn off 2x in one weekend "which primary botting time" something needs to be changed. I don't believe the script writer is at fault here so the blame shouldn't be shifted as I'm sure you charge them to use your source and if that is not the case then I apologize for coming off as an ass.
  9. 2 points
    No one will do this and this is not how private script requests work. I'm assuming you are wanting the source code, which you won't get. Also only premium scripters can write private scripts on tribot which are vetted pretty highly compared to other botting websites so all of this is not necessary. My point is, if you want this script done, you need to basically tell someone who is writing private scripts (I don't think many people on tribot are currently, it may be only me on tribot doing so atm) what features you'd like and what you want it to do exactly. After that, they will give you their quote, and you will pay it in full for the script before any work is started (Pretty standard on tribot) and they will complete the script and deliver it to you through the repository.
  10. 2 points
    I am god, and this is script request section.
  11. 2 points
    MyFighter Please post bugs and suggestions. Features: + Target identification by name / ID / level + Loot by value (OSBuddy / GE / Notifications) + Loot champion scrolls/food/clues + Support all food + Special attack + ABC2 Upcoming features: + Safe spot + Banking + Potions Progies: Changelog: Repository: https://tribot.org/repository/script/id/2565
  12. 2 points
    EasyBlastMine (beta v0.9) This script will blast rocks at the blast mine. You can start it anywhere and will walk there and take the required items. The ores will also be collected when the ore sack is full. Using world hop when place is occupied. This will get you 450k/h easily if you have 75+ mining. 100% Lovakengj house favour is required to access the blast mine. ABCL2 (29 points) is implemented, will be implementing more soon. Please try it out, this is my first script. Also post bugs if you find any, i will actively fix bugs and add features. Get the script here: https://tribot.org/repository/script/id/2568-easyblastmine/ TODO: Eating when hp is low
  13. 2 points
    Most likely it will be watched more closely, but if the account was made solely for goldfarming, you should bot until it's perm banned.
  14. 2 points
    RSgoldonline ensure we are priced cheaper than other RS websites. If you find an Cheapest Runescape 2007 Gold site with a cheaper price than ours, kindly let us know so we can match the price.
  15. 2 points
    This is my first of hopefully many contributions to the Tribot community in what looks like will be a very long road to becoming a scripter. That being said I'm sure it's very possible that I have made oversights and mistakes in this work, but I will be working on this until it is perfect. Automatic Banking API (Inventory and Equipment Managment) What Is it and How To Use: So this code is an extra class for you to add to your utility classes which pretty much automates banking items. It will not be useful in all cases, such as when you just need to deposit all your items. This API should mainly be used in bots which have entire inventories to setup, like if you were making a Zulrah bot and had a specific inventory that you wanted to withdraw at the bank, including the equipment. The main feature of this is being able to detect what items are in your inventory, compare that to an already set inventory and then bank the items that you don't need and withdraw the items you do. It will also equip/dequip any items that are set in the inventory all automatically. I tried to make the whole setup feature very quick and an example of the code it takes to make a target inventory and then go to the bank and withdraw that exact inventory is: ExtraInventory targetInventory = new ExtraInventory(); targetInventory.fromString("true:1169:1:HELMET-true:4333:1:CAPE-true:1725:1:AMULET-true:843:1:WEAPON-true:1101:1:BODY-true:1099:1:LEGS-true:1065:1:GLOVES-true:1061:1:BOOTS-true:890:50:ARROW-false:117:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-false:361:1-"); targetInventory.bank(); This would (given you are near a bank) set up the inventory exactly as specified by the string given (a f2p pure pk settup). I have included code that can be used to get your current inventory setup as a string in the format that the class requires. This is how you could print your current inventory (and equipment) to the console. ExtraInventory currentInventory = new ExtraInventory(); currentInventory.setAsCurrentInventory(true); println(currentInventory.inventoryToString()); This means that your bot would be able to set your entire inventory and equipment to any setup you want, store these setups and change between the setups. The class can be found here: https://github.com/Shotdox/Tribot-Automatic-Banking Function List: (full documentation is in the code) ExtraInventory.bank() - used when the bot is close to a bank and the ExtraInventory should be withdrawn ExtraInventory.inventoryToString() - used to get the string of the ExtraInventory ExtraInvnetory.fromString(String itemString) - imports an ExtraInventoryyou have saved as a string ExtraInventory.isInventoryCorrect() - compares the current inventory to the ExtraInventory ExtraInventory.isSetupCorrect() - compares the current equipment and inventory to the ExtraInventory ExtraInventory.setAsCurrentInventory(Boolean setEquipmentSlots) - sets the ExtraInventory to whatever is in the inventory (and equipment if setEquipmentSlots is true) ExtraInventory.SetSlot(Equipment.SLOTS slot, int itemIdToAdd, int stackSize) - sets the slot given to the item given, which can be a name (ie "bronzePickaxe") or id ExtraInventory.addItem(int itemIdToAdd, int amount, int stackSize) - manually adds the item given, which can be a name (ie "bronzePickaxe") or id. (EG of use: if (prayerPotsUsed){ fightInventory.addItem("Prayer Potion (4)", amountOfPrayerPots, 1); } ExtraInventory.setMatchingEquipmentSlots(Boolean shouldMatch) - set whether to bank the equipment items or just the inventory items Features: 1. Withdraw any inventory and equipment and the ability to turn of equipment banking 2. If it has 7 arrows in its equipment and the target ExtraInventory has 50, it will withdraw 43 arrows and equip them 3. If it has 555 gp in its inventory, and the target ExtraInventory has 1000, it will withdraw 445 gp 4. If it doesn't have enough free inventory slots to equip/deequip the equipment, it will bank and put items in until it has enough slots to e equip all the unnecessary items 5. If it needs to withdraw 1-4 items it will quickly click the item in the bank that amount of times instead of using "withdraw x" (unless item is stackable) Known Issues: 1. Noted items are not supported to be withdrawn from the bank (they can be deposited). I may add this in the future. 2. Heavy lagg can cause failure when banking. This is very rare. 3. No current ABC. This only needs to be added in a few places if you wanted to add it, most of the code is just comparing data. 4. If you want to use names instead of ids when adding items to the inventory manually, you must add the file called names.txt (given in the github) to .tribot/bin/scripts/ShotdoxAPI/util/names.txt this file is just a copy of https://rsbuddy.com/exchange/names.json and can be updated there if it ever becomes outdated. When adding by names the code I use is not very efficient, but i doubt many people will be using this often so no, if you do not reference items by names you will not need the names.txt file 5. The strings associated with some inventories are very long and gross in the code. If anybody has any other ideas for storing all the data I'm all ears
  16. 2 points
    https://tribot.org/doc.zip
  17. 2 points
    Thank you, I just did that. I am now waiting for it to be accepted.
  18. 2 points
    It's the server's address. As long as you don't have any monkfish it's safe to allow all connections. Potentially malicious functions have been blacklisted by TRiLeZ and the repository compiler will reject any unsafe script:
  19. 2 points
    Hello, everyone. Recently I've been interested in how Jagex's pattern detection works. I ran a simple easily detected script which opens the GE, buys 1 lobster at 100 GP, waits 30 seconds, then cancels the offer and closes the GE on a loop with tribot's AI antiban turned off. After a few minutes of runtime some abnormal things started happening. Most commonly my input to the game was blocked, meaning I could move my mouse around, but the game server never accepted my input, and as a result my account's actions had no effect on the game world. I've been able to semi-reliably recreate this scenario multiple times on different accounts and IP addresses. It's worth noting that players and NPCs continue their normal action while my account's been frozen, which also indicates no connection errors. The input blockage happens fairly often to the point that it's very unlikely it has anything to do with my network connection or Jagex servers. I believe this is Jagex's first line of defense against bots (or at least one of them). Real players will typically try to perform various actions in-game like arranging inventory, clicking on random tiles or objects, world hopping, and even restarting the client. Bots may repeatedly click the same action (big red flag) or do nothing (moderate red flag) I have no doubt that botters/scripters with more experience than me have noticed this, but this is not a thread about Jagex input blocking, it's about preventing it from happening through pattern breaking. Pattern breaking is centered around the imperfections and variability of the human mind and judgment. Regular player activity does form patterns to some degree, but typically it isn't as pronounced as those of bots. There are two categories of pattern breaking: Large scale More useful for public scripts or large farms Focuses on creating differences between accounts through account preference Different methods of performing tasks Different subsets of antibans per account Each account may be only able to use 7 out of 12 generic antibans available for the script This increases the longevity of the script by allowing less opportunities for Jagex to group accounts via similar actions Different frequencies of antibans per account Account A may perform one antiban more frequently than account B Changes in sleep and delay times per account Accounts all have different run times This is mainly for farm detection, not for public scripts Different accounts running the script in different worlds/locations if possible Unique break patterns per account Different muling cycles Small scale Focuses on preventing accounts from producing patterns through their actions Changes the order of sub-actions within a larger action when order does not matter More useful when incorporated as part of a complex script process Avoid hardcoding script processes as first A, then B, finally C Instead use fluid condition checks to see what action should be performed Then use account preference and probability to determine which of several actions it prefers over the others Action[] actions = getActions(situation); // This should perform action condition checks and return only relevant actions boolean performed = false; for (action : actions) { if (accountPrefers(action) && accountProbability(action)) { performed = performAction(action); if (performed) { break; } } } if (!performed) { performAction(action[General.random(0, action.length)]; } While this may seem excessive, this is how players decide what to do next in a sequence of events Antiban is a large part of pattern breaking Performing actions you don't usually do is an effective way to break patterns Misclicking can be seen as a form of antiban as it's infrequent but deviates from your normal activity Avoid randomization Randomizing everything from antibans to sub-actions within a larger action schedule may seem like an appealing idea While it's likely to work to some degree, it will make accounts on the large scale appear too similar to each other We're trying to get our accounts to operate in the grey area between a well defined pattern and no pattern at all If all accounts operate in this grey area their patterns will be loosely defined but dissimilar from each other The idea of pattern breaking shows promise, however it has many requirements. One of which is account preference which is something Tribot has some support for, but this support is limited. For example a scripter has no way of applying Tribot preference to custom made functions. The solution is to make your own preference system where the account's username and a seed value is used to derive a value from 0 to 100. Below is my own way of doing so: /** * Performs a probability check on the input value. Input a percentage (0 - 100). */ public boolean chance(double chance) { return General.random(0, 100) <= chance; } /** * Scales a value based on its original range so that its position in that range is in the same position in the new range. */ public double normalizeValue(double value, double oldMin, double oldMax, double newMin, double newMax) { double percentage = (value - oldMin) / (oldMax - oldMin); return newMin + percentage * (newMax - newMin); } /** * Generates a username based preference value for the given seed (0 - 100). */ public double preference(double seed) { try { String hash = Double.toString(Player.getRSPlayer().getName().hashCode() * Math.sqrt(seed)).replaceAll("[^\\d.]", "").replaceAll("\\.", ""); String int1 = Character.toString(hash.charAt(hash.length() - 1)); String int2 = Character.toString(hash.charAt(hash.length() - 2)); String int3 = Character.toString(hash.charAt(hash.length() - 3)); return normalizeValue(Double.parseDouble(int1 + int2 + "." + int3), 0, 99, 0, 100); } catch (NullPointerException e) {return 50.0;} } /** * Generates a username based preference value for the given seed, but normalized to match the provided range. */ public double preference(double seed, double min, double max) { return normalizeValue(preference(seed), 0, 100, min, max); } /** * Performs a probability check on a preference value normalized to match the given range. */ public boolean preferenceChance(double seed, double min, double max) { return chance(preference(seed, min, max)); } Hopefully I've included all the necessary functions for the above to work. If you for example wanted to test an account's preference for performing Action A over Action B, you could take the hashcode of each actions, remove all non-integer characters from each, input them into the functions above, and receive a preference for each. I recommend using custom ranges like preference(100, 15, 85), where 100 is the seed, 15 is the min chance, and 85 is the max chance. That way the preference range will always be within 15% and 85% and you won't ALWAYS or NEVER perform that action above other actions. It should also be mentioned that you shouldn't be using these preferences to determine which actions to do, only to determine which actions should be performed above other actions. All actions should be performed as long as they're part of your script. This post ended up being much longer than I originally wanted but it's good to get your thoughts out in writing so I'm glad I spent the time. Going forward I would appreciate a healthy discussion, please add to the thread with your comments rather than just taking up space with pointless nay saying.
  20. 2 points
    daxWalker is extremely superior, without question.
  21. 2 points
  22. 2 points
    i'd vouch for your crab script anyday plenty of accounts have been built with your script
  23. 2 points
    https://tribot.org/repository/script/id/347-exshopper/
  24. 2 points
  25. 2 points
    I think I will finally add wine making to this script.
  26. 2 points
  27. 2 points
    Thanks to @Fluffee, i managed to get it working on linux systems. Please update to 1.05 (redownload dropbox link)
  28. 2 points
    A little inside joke thought i would share the mind of what a botter / engineer / idiot thinks about. In regards to a running a bot on trips. the 20 seconds is an amount of time that could be saved by changing a parameter, an example of saving even a couple of seconds can improve profit; "yeah timed it 20 seconds saved per run but doing about 10 runs an hour at the minute, thats 3 minutes roughly saved. Over a period 2 hours thats a run which is an extra 100k ? run bots for 40 hours thats extra 4m hmmm but then 10 accounts thats extra 40m and that is an extra 40 big bags of skittles and i love skittles "
  29. 2 points
  30. 2 points
    Thanks Einstein, this is definitely helpful for someone who hasn't dabbled in scripting before. Now to find time to put work into a decent script. Perhaps a great addition to this would be to give a basic example of a GUI and progress display? Assuming you want to pursue further tutorials. Great work!
  31. 2 points
    Thanks for the help! @YoHoJo @Fluffee @Einstein
  32. 2 points
    Update - v2.14 - After teleporting out upon script end, the bot will ensure to cure venom if venomed.
  33. 2 points
    This is normal. The 300 mb limit refers to the heap size only. There are multiple things that add to the total amount of memory used, one of them being the overhead of the JVM itself.
  34. 2 points
    New version should be ready soon. UI is also almost done.
  35. 2 points
    well this is an interesting way to let us know youre gay
  36. 2 points
    Farming script would be nice.
  37. 2 points
  38. 2 points
    It is a requirement to provide a script with a full ABC2 implementation, as i said before. I'm not going to spoon-feed you the code to do so, you should be able to figure it out with the official guide:
  39. 2 points
    I'm actually very good at this.
  40. 2 points
    @YoHoJo the script functions best with 64-bit OSBuddy and 64-bit Java when using LG, as with most scripts. The tutorial doesn't reflect that so be careful
  41. 2 points
    Yeah, it would be because the Login Bot has to be disabled, and then the script doesn't have it's own version. I'll write one soon hopefully, and integrate it. Update v1.25 Account Creation via script arguments added. Have yet to add a detailed explanation of each key, but there's an example on the main post as well as below. @lets be friends emailUsername:[S5][S5][N1];emailDomain:pokemail.net;rsUsername:FTI-SameUsername.;password:runescape;captchaKey:2CaptchaKey;numberOfAccounts:1;noTutorial:false;
  42. 2 points
    yeh uninstall all java and install java 8. tribot doesn't work with java 9
  43. 2 points
    Im gona make bank now and feed my children, amazing job, thanks!
  44. 2 points
    Nice, looks pretty neat for people wanting to start learning. I wasn't able to give it a full read but looks good.
  45. 2 points
  46. 2 points
  47. 2 points
    Figure out what you want to bot, then you have 3 options Find a script on the repository: https://tribot.org/repository/ that matches those needs There are free and premium scripts, premium typically are better but there definitely are some good free scripts Commission someone to write a custom script for your purpose This might be expensive depending on what you want and may not be ideal for beginners Write your own script using Tribot's Java API https://tribot.org/doc/overview-summary.html You need Java programming experience for this and the API is quite extensive so that takes time to learn If you're trying to level or make money on a real account you'll probably be most successful looking on the repository for scripts you need. Keep in mind that in order to not get banned you can read the numerous threads that already exist on the forums. Additionally I would recommend using scripts that have been updated recently. Check the script thread to make sure it works properly and has a low banrate. If you want to make real money through goldfarming then good luck, it's doubtful you'll be met with much assistance from the community as this can be quite competitive.
  48. 2 points
    UPDATE - v2.118 - Fixed a bug where the bot would idle on the dock after a kill and log out - Fixed a bug where the bot would idle after teleporting to lumbridge to repair barrows armor
  49. 2 points
    @jens4626 @Takesoul @9055394 @nextkey AlphaSmither 1.7 released Updated to work with the new smelting interface Utilizes the new "Smith All" option Utilizes the new "Smelt All" option
  50. 2 points
    More logic improvements to come Been pretty busy lately but trying to cram in some updates
×